Android 应用程序进程启动过程

注意:“应用程序进程启动过程”,不是“应用程序启动过程”,一般来讲,应用程序启动过程指的是根Activity的启动过程。

1.应用程序进程简介

想要启动一个应用程序,首先要保证这个应用程序所需要的应用程序进程已经启动。AMS(ActivityManagerService)在启动应用程序时会检查这个应用程序需要的应用程序进程是否存在,不存在就会请求Zygote进程启动需要的应用程序进程。

在Zygote的Java框架层中会创建一个Server端的Socket,这个Socket用来等待AMS请求Zygote来创建新的应用程序进程。Zygote进程通过fock自身创建应用程序进程,这样应用程序进程就会获得Zygote进程在启动时创建的虚拟机实例。

当然,在应用程序进程创建过程中出了获取虚拟机实例外,还创建了Binder线程池和消息循环,这样运行在应用进程中的应用程序就可以方便的使用Binder进行进程间通信以及处理消息了。

2.AMS发送启动应用程序进程请求

在这里插入图片描述

3.Zygote接收请求并创建应用程序进程

在这里插入图片描述

4.Binder线程池启动过程

ZygoteInit类中的nativeZygoteInit方法,实现了创建Binder线程池。
nativeZygoteInit是一个Jni方法,它对应的是AndroidRuntime.cpp中的onZygoteInit方法,最后会调用ProcessState.cpp中的startThreadPool()方法。
支持Binder通讯的进程中都有一个ProcessState类,它里面有一个MThreadPoolStarted变量,用来标识Binder线程池是否已经被启动过。在每次调用startThreadPool函数时,都会优先检查该变量,从而确保线程池只被启动一次。
同时spawnPooledThread函数会创建一个PoolThread对象用来作为线程池中的第一个线程,也就是主线程。PoolThread继承了Thread类。调用IPCThreadState的joinThreadPool函数,将当前线程注册到Binder驱动程序中,这样我们创建的线程就加入了Binder线程池中,新创建的应用程序进程就支持Binde进程通信了,我们只需要创建当前进程的Binder对象,并将它注册到ServiceManager中就可以实现Binder进程间通信,而不必关心进程间是如何通过Binder进行通信的。

5.消息循环创建过程

系统在应用程序进程启动完成后,就会创建一个消息循环,这样运行在应用程序进程中的应用程序可以方便地使用消息处理机制。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值