文章目录
平台 | OS版本 |
---|---|
MT6739 | Android 9.0 |
系统上电,加载完 kernel
以后,是通过 init.rc
启动 Android
系统的 Zygote
的。
init.rc
文件路径: system/core/rootdir
import /init.environ.rc
import /init.usb.rc
import /init.${ro.hardware}.rc
import /vendor/etc/init/hw/init.${ro.hardware}.rc
import /init.usb.configfs.rc
import /init.${ro.zygote}.rc
on early-init
... #省略无关命令
Android
系统启动后,首先启动 init
进程, 在该进程中解析了 init.rc
文件。在 Android P 中,关于 Zygote
的 section
段是在 import
字段中。
import /init.${ro.zygote}.rc
从这个这段可以知道,在 init.rc
文件中不再直接引入一个固定的文件,而是根据属性 ro.zygote
的内容来引入不同的文件。
从 android5.0
开始, android
开始支持64位的编译, zygote
本身也就有了32位和64位的区别,所以在这里用 ro.zygote
属性来控制启动不同版本的zygote进程。
init.rc
位于 /system/core/rootdir
下。在这个路径下还包括四个关于 zygote
的 rc
文件。分别是Init.zygote32.rc,Init.zygote32_64.rc,Init.zygote64.rc,Init.zygote64_32.rc
。由硬件决定调用哪个文件。
在我的项目中使用的是 Init.zygote32.rc
。
Init.zygote32.rc
文件路径: system/core/rootdir
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
class main #class是一个option,指定zygote服务的类型是main
priority -20
user root
group root readproc reserved_disk
#socket关键字表示一个option。创建一个名为dev/socket/zygote,类型为stream,权限660的socket。
socket zygote stream 660 root system
#onrestart是一个option,说明在zygote重启时需要执行的command
onrestart write /sys/android_power/request_state wake
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
注:在init.rc中是按照section来解析每一段数据的,每一段section的起始位置是symbol标识,
结束位置是下一个section开始的起始标示。在init.rc中,symbol一共有两个,分别是on和service。
在 Init.zygote32.rc
中,定义了一个 zygote
服务: zygote
。由关键字 service
告诉 init
进程,创建一个名为 zygote
的进程,这个进程要执行的程序是 /system/bin/app_process
,给这个进程四个参数分别是
-Xzygote
/system/bin
--zygote
--start-system-server
zygote
是由 init
进程解析 init.rc
文件启动的,启动的过程传入了这四个参数。
需要注意一下, zygote
最初的名字是 app_process
,他对应的源代码是在 App_main.cpp
中。由此我们
可以从 main
函数分析。
App_main.cpp
文件路径: framework/base/cmds/app_process/App_main.cpp
int main(int argc, char* const argv[])
{
AppRuntime runtime(argv[0], computeArgBlockSize(argc, argv));
// Process command line arguments
// ignore argv[0]
argc--;
argv++;
... /* 省略部分代码 */
// Parse runtime arguments. Stop at first unrecognized option.
bool zygote = false;
... /* 省略部分代码 */
if (strcmp(arg, "--zygote") == 0) {
zygote = true;
niceName = ZYGOTE_NICE_NAME;
}
... /* 省略部分代码 */
if (zygote) {
runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
}
... /* 省略部分代码 */
}
因为仅仅是为了分析 camera jni
的加载流程,所以这里省略了很多其他的代码,仅仅关注于 runtime.start
函数的调用。
从上述代码中,我们可以了解到,当传入的参数带有 "--zygote"
这个字符串时,才会调用到 runtime.start
方法。runtime
是 apptime
类型的对象,而 apptime
继承了 AndroidRuntime
中的 start
方法。
AndroidRuntime.cpp
文件路径: ./framework/base/core/jni
void AndroidRuntime::start(const char* className, const Vector<String8>& options, bool zygote)
{
/*******************************************************************************
* 实际运行中打印的log:
* AndroidRuntime: >>>>>> START com.android.internal.os.ZygoteInit uid 0 <<<<<<
*******************************************************************************/
ALOGD(">>>>>> START %s uid %d <<<<<<\n",
className