一直在研究 Dalvik 的实现,今天突然想起一件事情,我们默认可以用 java.lang.Object 等系统类,他是在什么时候被加载进来了呢,我们自己的类是否可以这样预先加载进去呢?
顺着这个思路,再回顾一下原来对 Zygote 启动时的流程,探索一番!
Zygote 启动流程(网上有很多的分析不太详诉):
>>> Kernel 启动
>>> 启动 init 程序,此程序解析 init.rc 进行执行
>>> 在 init.rc 中有启动 zygote 代码
>>> zygote 启动后最后 fork 出 system_server 进行系统服务
>>> zygote 等待 socket 事件准备孵化用户进程
在 Zygote 的启动中有如下关键调用:
AppRuntime.start 启动 com.android.internal.os.ZygoteInit 类处理
既然这时能够调用 java 类处理了,哪么系统基础类肯定在这之前准备好了,顺着这个向里面看
AppRuntime 继承 AndroidRuntime
AndroidRuntime 的 start 函数,调用了 JNI_CreateJavaVM 函数生成虚拟机
JNI_CreateJavaVM 是 jni.c 中,也就是 libdvm.so 中的一个函数
JNI_CreateJavaVM 中调用了 dvmStartup 函数启动一个虚拟机
dvmStartup 调用了setCommandLineDefaults 实现参数默认值。里面有最为重要的获取环境变理 B