今天我们要解决的疑问是 com.android.internal.os.ZygoteServer 是在哪里被调用的?
通过全局搜索,我们发现 com.android.internal.os.ZygoteInit#main 方法有如下代码:
zygoteServer = new ZygoteServer(isPrimaryZygote);
那这个main方法又是被哪里调用的呢? 继续使用grep 来搜索 ZygoteInit ,
发现在 base/cmds/app_process/app_main.cpp 里面的main函数 336 行有如下代码:
runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
首先这个mian函数在哪里被调用?
app_main.cpp 所在的模块的 Android.bp 有如下内容:
cc_binary {
name: "app_process",
srcs: ["app_main.cpp"],
.....
}
说明这个模块最终是编译为一个可执行文件 app_process,那又是哪里调用这个 app_process的呢?熟悉开机流程的肯定知道这个是配置在rc文件中的,那具体的内容是什么呢?
我们这次用 grep 在设备上搜索, 就是adb shell 之后 输入:
grep -rIn app_process
我们发现了out下面有一个:
out/target/product/Tinker_Board_2/system/etc/init/hw/init.zygote32.rc
这个文件里面有如下内容:
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
class main
priority -20
user root
group root readproc reserved_disk
socket zygote stream 660 root system
socket usap_pool_primary stream 660 root system
onrestart exec_background - system system -- /system/bin/vdc volume abort_fuse
onrestart write /sys/power/state on
onrestart restart audioserver
onrestart restart cameraserver
onrestart restart media
onrestart restart netd
onrestart restart wificond
writepid /dev/cpuset/foreground/tasks
其中第一行的 -Xzygote 就是指定是否调用 ZygoteInit ,
也可以在 app_main.cpp 的mian方法中打印传递的参数,如下是打印结果:
/system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server --socket-name=zygote
然后我们搜索 app_process64 就可以找到配置文件.