《Android进阶解密》读书笔记--第3章 应用程序进程启动过程

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调用Process的start start调用ZygoteProcess的start startViagote zygoteSendArgsAndGetResult openZygoteSocketIfNeeded connect AMS Process ZygoteProcess ZygoteState
AMSProcessZygoteProcessZygoteState
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 ZygoteConnect RuntimeInit ActivityThread main runSelectLoop(等待AMS请求) runOnce() hanleChildProc() 调用 ZygoteInit 的zygoteInit 方法 调用 ZygoteInit 的zygoteInit 方法 调用 RuntimeInit的applicationInit方法 invokeStaticMain Zygote.MethodAndArgsCaller(m,argv) main main ZygoteInit ZygoteServer ZygoteConnect RuntimeInit ActivityThread
ZygoteInitZygoteServerZygoteConnectionRuntimeInitActivityThread
main(1.创建 Server 端的 Socket(名称 zygote);2.预加载类和资源;3.启动SystemServer进程;4.等待AMS请求;3.捕获MethodAndArgsCaller,调用 ActivityThread的 main)runSelectLooprunOnce(1.获取启动参数;2.创建应用进程)applicationInitmain(创建主线程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 进程间通信

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值