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

下一篇再继续。

相关推荐
驰骋工作流8 小时前
流程时效考核的表结构:从待办时限到 WF_CH 考核结果驰骋BPM驰骋低代码低代码工作流引擎
android·低代码·rxjava
传奇开心果编程10 小时前
【Flutter踩坑排雷】第7课:巨型 build 函数坑|全部 UI 写在同一个 build,维护难、隐性异常
android·flutter·ios·移动开发·跨平台·dart·声明式ui
方白羽13 小时前
Android 双开环境底层剖析与风控检测落地
android·安全·app
weixin_5633714714 小时前
Android Studio 2024 版 Device Explorer 打开方法
android·ide·android studio
AIsoft_868917 小时前
职场音频文件怎么整理?录音APP有哪些用法
android·音视频
booboosui17 小时前
第一批个人 Agent 用户正在卸载,问题不在模型,在它住在哪儿
android
洞见前行17 小时前
点击图标到内容出现,你的 App 在这几秒里做了什么:Android 冷启动全链路优化实战
android·性能优化·android studio
凯基迪科技17 小时前
芯片UID绑定修改 加密与逆向修改思路分析
android
Liben18 小时前
Weex开发踩坑记录
android·前端·ios
救救孩子把20 小时前
结构化输出为何“格式正确、答案错误”?JSON Schema 的能力边界
android·java·json·agent·agent服务