0%

Magisk源码分析(四)

对 Magisk 源码做一个简单的分析,本人很菜,分析不到位的地方请各位大神指出来。本文以 Magisk v25.1 为例

late_start

上一章分析完了 post-fs-data, 在 post-fs-data 阶段,主要是执行 post-fs-data 脚本,挂载 /system 目录。接下来看下一阶段.

1
2
3
4
5
service OPIx4M5Px /dev/BYdnLYi/magisk --service
class late_start
user root
seclabel u:r:magisk:s0
oneshot
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void late_start(int client) {
close(client);

mutex_guard lock(stage_lock);
run_finally fin([]{ DAEMON_STATE = STATE_LATE_START_DONE; });
setup_logfile(false);

LOGI("** late_start service mode running\n");

if (DAEMON_STATE < STATE_POST_FS_DATA_DONE || safe_mode)
return;

exec_common_scripts("service");
exec_module_scripts("service");
}

没啥好说的,执行 common 和 module 的 service 脚本.

boot_complete

1
2
on property:sys.boot_completed=1
exec /dev/BYdnLYi/magisk --boot-complete
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void boot_complete(int client) {
close(client);

mutex_guard lock(stage_lock);
DAEMON_STATE = STATE_BOOT_COMPLETE;
setup_logfile(false);

LOGI("** boot-complete triggered\n");

if (safe_mode)
return;

// At this point it's safe to create the folder
if (access(SECURE_DIR, F_OK) != 0)
xmkdir(SECURE_DIR, 0700);

// Ensure manager exists
check_pkg_refresh();
get_manager(0, nullptr, true); //查找magisk manager
}

大佬们可以自己去分析,这里的函数感觉都没啥作用.

zygote_restart

1
2
on property:init.svc.zygote=restarting
exec /dev/BYdnLYi/magisk --zygote-restart
1
2
3
4
5
6
7
void zygote_restart(int client) {
close(client);

LOGI("** zygote restarted\n");
pkg_xml_ino = 0;
prune_su_access(); //之前分析过,这里就是把卸载过的root app从数据库删除
}

至此,magisk 注入 init.rc 的所有阶段都分析完了.