3.1 应用程序进程简介
1.AMS 判断应用程序进程是否存在
2.不存在,AMS 通过 Socket(Server 端) 请求 Zygote 创建新的应用程序进程
3.Zygote 通过 fock 自身创建应用程序进程(1.创建虚拟机实例 2.Binder 线程池和消息循环)
3.2 应用程序进程启动过程介绍
3.2.1 AMS 发送启动应用程序进程请求
AMS | Process | ZygoteProcess | ZygoteState |
---|
startProcessLock(1.向Zygote进程发送请求;2.获取要创建应用程序进程的用户ID;3.启动应用进程Process.start) | start(1.调用ZygoteProcess–用于保持 Zygote 进程的通信状态 的start方法;2.调用 startViagote) | startViagote(1.创建字符串列表,将应用程序进程启动参数保存进去‘;2.zygoteSendArgsAndGetResult) | ZygoteProcess静态内部类,表示与 Zygote 进程通信状态 |
| | zygoteSendArgsAndGetResult(1.启动参数写入到 ZygoteState) | |
| | openZygoteSocketIfNeeded(1.获取ZygoteState;2.与Zygote 建立 Socket 连接;3.判断是主模式还是主模式) | |
3.2.2 Zygote 接收请求并创建应用程序进程
ZygoteInit | ZygoteServer | ZygoteConnection | RuntimeInit | ActivityThread |
---|
main(1.创建 Server 端的 Socket(名称 zygote);2.预加载类和资源;3.启动SystemServer进程;4.等待AMS请求;3.捕获MethodAndArgsCaller,调用 ActivityThread的 main) | runSelectLoop | runOnce(1.获取启动参数;2.创建应用进程) | applicationInit | main(创建主线程Looper,并创建主线程H(Handler)类) |
zygoteInit (1.创建Binder线程池) | | hanleChildProc(1.处理应用程序) | invokeStaticMain(1.获取ActivityThread类;2.获取ActivityThread的main方法) | |
3.3 Binder 线程池启动过程
1.ZygoteInit#zygoteInit 中调用 ZygoteInit.nativeZygoteInit()
2.nativeZygoteInit 本地方法
-> AndroidRuntime.cpp
->app_main.cpp
->ProcessSate.cpp#startThreadPool
->ProcessSate.cpp#spawnPooledThread Binder 线程池是一个 PoolThread 继承 Thread
->PoolThread 调用 joinThreadPool 将创建线程加入到 Binder 线程池
->我们只需要创建当前进程的 Binder 进程对象,注册到ServiceManager 中实现 Binder 进程间通信