对 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;
if (access(SECURE_DIR, F_OK) != 0) xmkdir(SECURE_DIR, 0700);
check_pkg_refresh(); get_manager(0, nullptr, true); }
|
大佬们可以自己去分析,这里的函数感觉都没啥作用.
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(); }
|
至此,magisk 注入 init.rc 的所有阶段都分析完了.