一、从init进程创建开始
Linux kerner启动后调用到system/core/init/init.cpp的main()方法
init进程的作用:
二、启动Zygote进程:
Zygote进程是Android系统的首个Java进程,Zygote是所有Java进程的父进程,包括 system_server进程以及所有的App进程都是Zygote的子进程。
主要操作:
主要会执行frameworks/base/cmds/app_process/App_main.cpp的main方法
辗转到/frameworks/base/core/java/com/android/internal/os/Zygote.java
三、构建system_server进程
system_server进程是用于管理整个Java framework层,包含ActivityManager,PowerManager等各种系统服务。
在Zygote的初始化过程中构建system_server进程
从main方法开始->startSystemServer-->Zygote.forkSystemServer 创建system_server
startSystemServer会抛出MethodAndArgsCaller异常-->caller.run
(从异常信息中看到调用栈信息
at com.android.server.SystemServer.main(SystemServer.java:175)
at java.lang.reflect.Method.invoke!(Native method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:738)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:628))
这里使用了反射调用到SystemServer.main方法(采用抛出异常,然后捕获的方法,来清空栈帧,提升利用率)
然后在SystemServer.main中开始一系列的调用
启动主线程,构建Looper,并进入Looper.loop(),等待其他线程的消息
四、构建一般app进程
要构建新的app进程一般从startActivity/startService开始,即App发起进程(当从桌面启动应用,则发起进程便是Launcher所在进程;当从某App内启动远程进程,则发送进程便是该App所在进程。发起进程先通过binder发送消息给system_server进程)
system_server进程(调用Process.start()方法,通过socket向zygote进程发送创建新进程的请求)
zygote进程(在执行ZygoteInit.main()
后便进入runSelectLoop()
循环体内,runSelectLoop方法一直在循环检测,
当有客户端连接时便会执行ZygoteConnection.runOnce()方法,再经过层层调用后fork出新的应用进程)
新进程(执行handleChildProc方法,最后调用ActivityThread.main()方法)
/frameworks/base/core/java/com/android/internal/os/ZygoteConnection.java
ZygoteConnection.runOnce->Zygote.forkAndSpecialize(构建新的进程完成后后续在该进程中做相关的处理,如调到ActivityThread.main进行applicatoin的构建等)->handleChildProc->RuntimeInit.zygoteInit
/frameworks/base/core/java/com/android/internal/os/RuntimeInit.java
RuntimeInit.zygoteInit->applicationInit->invokeStaticMain(构建ActivityThread反射调用的参数)
在invokeStaticMain方法中同样抛出ZygoteInit.MethodAndArgsCaller,最终在runSelectLoop的调用者ZygoteInit.main中
捕获异常,利用反射调用到ActivityThread.main方法
这里与构建system_server时调用SystemServer.main的方式如出一辙,ZygoteInit.
startSystemServer是抛出该异常的方法