Android_8 zygote启动分析

1.从init.rc 里的on nonencrypted被触发时启动,如果是没有加密的Android系统。

复制代码
on nonencrypted
    class_start main
    class_start late_start

这个zygote就在 main这个类里,然后一起启动。

2.就在这个init.rc同级目录下就有这个zygote.rc的启动目录,参考这篇文章,打开一个init.zygote32.rc 。

然后就可以看到

复制代码
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server

这第一个就是以服务的方法来启动,然后第二个zygote是名字,第三个是真正的执行程序路径,后面是参数。

3.然后再去找这个/system/bin/app_process,这个是编译的产物,不是源码里的地址。然后需要通过grep来查找。发现在这个 frameworks/base/cmds/app_process/目录下,有mk和main文件然后 分析源文件main。

4.这个app_main.cpp里面,就是分析参数,然后执行这个

复制代码
if (zygote) {
    runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
} 

这样就通过这个AndroidRuntime来启动Zygotenti了。再往下跟踪这个AndroidRuntime。

5.找到main方法,从上往下看,这个地方Dalvik虚拟机开始开启。

复制代码
/* start the virtual machine */
JniInvocation jni_invocation;
jni_invocation.Init(NULL);
JNIEnv* env;
if (startVm(&mJavaVM, &env, zygote) != 0) {
    return;
}
onVmCreated(env);

然后再往下呢,就是用jni来执行下面这个类里的main方法了。

复制代码
com.android.internal.os.ZygoteInit

6.接下来跟去ZygoteInit的main方法 。

做了初始化的流程,还有一个预加载各种重要的信息。

复制代码
preload(bootTimingsTraceLog);

7.接下来是开始SystemServer

下一篇再继续。

相关推荐
消失的旧时光-19431 小时前
Android 系统层扫盲 11:JNI 到底是什么?Java / Kotlin 是怎么调用 C/C++ 的?
android·binder·zygote·system_server·aops
mmsx2 小时前
Android 地图几万要素卡成幻灯片?顶点缓冲批上传与显存复用
android·opengl·地图·栅格
北京自在科技12 小时前
谷歌 Find Hub 迎来新版本更新
android·安卓
古法安卓18 小时前
Android-休眠唤醒后onLocationChanged没有数据问题排查
android·java·android studio
Htr_21 小时前
Creem 2.0 使用指南:面向 AI 构建时代的资金平台
android·数据库·人工智能·ui·photoshop
wardenlzr1 天前
车机看门狗(Watchdog)为何会让整机硬重启
android·优化·车机
IT毕设实战小研1 天前
基于大数据的商场商铺数据分析与可视化的设计与实现
android·java·大数据·django·课程设计
aqi001 天前
一文读懂 HarmonyOS 7.0 带来的十大API重要升级
android·华为·harmonyos·鸿蒙·harmony