当引导程序启动Linux内核后,会加载各种驱动和数据结构,当有了驱动以后,开始启动Android系统同时会加载用户级别的第一个进程init(system\core\init\init.cpp)代码如下:
1 | int main(int argc, char** argv) { |
加载init.rc文件,会启动一个Zygote进程,此进程是Android系统的一个母进程,用来启动Android的其他服务进程,代码:
从android L开始,在 /system/core/rootdir 目录中有 4 个 zygote 相关的启动脚本如下图:
在init.rc文件中,有如下代码:
1 | import /init.environ.rc |
注意到上面的代码import /init.${ro.zygote}.rc,这里会读取ro.zygote这个属性,导入相应的init.rc文件。
ro.zygote的属性可为:zygote32、zygote64、zygote32_64、zygote64_32。
对于这个属性的解释如下。
1 | init.zygote32.rc:zygote 进程对应的执行程序是 app_process (纯 32bit 模式) |
主流的机型属性都为zygote64_32,我们来看看init.zygote64_32.rc文件:
1 | service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server --socket-name=zygote |
在 linux 系统中,service 通常是一种被称为守护进程 (daemon) 的程序。它通常在系统启动时启动,并一直运行于后台,直到系统关闭时终止。
这里会以service方式来启动zygote进程,app_process的代码位于/frameworks/base/cmds/app_process/路径下,该路径下有一个文件app_main.cpp,入口是main函数。
接下来看app_main.cpp函数,这里实现从c++代码调到java代码:
1 | int main(int argc, char* const argv[]) |
ZygoteInit.java 代码:
/frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
1 | public static void main(String argv[]) { |
看这个类的main方法,最上面根据传入的参数判断是否将startSystemServer这个标记设为true,接着预加载android依赖的文件,最后根据上面设置的标记来判断是否能启动系统服务。
接着看ZygoteInit.java中main方法在最后调用startSystemServer方法具体内容
1 | private static boolean startSystemServer(String abiList, String socketName) |
SystemServer.java 代码
/frameworks/base/services/java/com/android/server/SystemServer.java
1 | /** |
启动SystemServer.java的startOtherServices方法
1 | /** |
ActivityManagerService.java中的mStackSupervisor.resumeFocusedStackTopActivityLocked()
1 | public void systemReady(final Runnable goingCallback) { |
ActivityStackSupervisor.java中的resumeFocusedStackTopActivityLocked方法
1 | boolean resumeFocusedStackTopActivityLocked() { |
ActivityStack.java中的resumeTopActivityUncheckedLocked方法
1 | boolean resumeTopActivityUncheckedLocked(ActivityRecord prev, ActivityOptions options) { |
1 | private boolean resumeTopActivityInnerLocked(ActivityRecord prev, ActivityOptions options) { |
ActivityStackSupervisor.java中resumeHomeStackTask方法
1 | boolean resumeHomeStackTask(int homeStackTaskType, ActivityRecord prev, String reason) { |
Android系统启动完成,打开了Launcher应用的Home界面。
公众号同步更新,欢迎关注😄