android唤醒过程,Android App启动流程和启动模式

Android 理论基础

1、每一个Android App都运行在一个单独的进程中

2、Android App由很多不同组件组成,这些组件还可以启动其他App的组件

3、一个进程里面只有一个主线程

4、进程在其需要的时候被启动

基于上述共识,我们先来分析Android系统的启动流程,然后再分析App的启动流程。

Android系统启动流程

Android系统启动时, bootloader启动内核和init进程,init进程分裂出更多名为"daemons(守护进程)"的底层的Linux进程,诸如android debug deamon, USB deamon等。这些守护进程处理底层硬件相关的接口。

随后, init进程会启动一个非常有意思的进程—“Zygote”(Zygote的中文意思为受精卵)。这是一个Android平台的非常基础的进程。这个进程初始化了第一个VM,并且预加载了framework和众多App所需要的通用资源。然后它开启一个Socket接口来监听请求,根据请求孵化出新的VM来管理新的App进程。一旦收到新的请求,Zygote会基于自身预先加载的VM来孵化出一个新的VM创建一个新的进程。

启动Zygote之后,init进程会启动runtime进程。Zygote会孵化出一个超级管理进程—System Server。SystemServer会启动所有系统核心服务,例如Activity Manager Service,硬件相关的Service等。到此,系统准备好启动它的第一个App进程—Home进程了。

综上,总结出Android 系统启动流程如下:

1、bootloader启动内核和init进程

2、init进程产生守护进程— daemons

3、init进程启动Zygote进程

4、Zygote进程初始化第一个VM, 预加载framework和通用资源

5、init进程启动runtime进程

6、Zygote进程孵化出System Server

App启动流程

App流程的几个基本步骤如下:

1、创建进程

2、绑定Application

3、启动Activity

下面具体分析一下每个步骤,如下图:

35ced7f6e2f40b457d79c55848bcbc53.png

当用户点击一个App图标时,Click事件会通过Binder IPC机制调用startActivity(Intent), 最终调用到ActivityManagerService。在ActivityManagerService中做三件事:

1、通过PackageManager的resolveIntent()收集这个intent对象的指向信息,

指向信息被存储在一个intent对象中。

2、通过grantUriPermissionLocked()方法来验证用户是否有足够的权限去调用该intent对象指向的Activity。

3、如果有权限, ActivityManagerService会检查这个进程的ProcessRecord是否存在。如果不存在, ActivityManagerService会创建新的进程来实例化目标activity。

ActivityManagerService创建新的进程并实例化目标activity分为三个步骤,也就是上面说的App启动的三个步骤。

第一步,创建进程

ActivityManagerService调用startProcessLocked()方法来创建新的进程,该方法会通过socket通道传递参数给“Zygote”进程。 Zygote孵化自身,并调用ZygoteInit.main()方法来实例化ActivityThread对象并最终返回新进程的pid。随后ActivityThread依次调用Looper.prepareLoop()和Looper.loop()来开启消息循环。

第二步,绑定Application

第二步要做的就是将进程和指定的Application绑定起来。这个是通过ActivityThread对象中调用bindApplication()方法完成的。该方法发送一个BIND_APPLICATION的消息到消息队列中,最终通过handleBindApplication()方法处理该消息。然后调用makeApplication()方法来加载App的classes到内存中。

第三步,启动Activity

经过前两个步骤之后,系统中已经拥有了该App的进程。后面的步骤就是从一个已经存在的进程中启动一个新进程的activity了。该步骤实际调用方法是realStartActivity(),它会调用application线程对象中的sheduleLaunchActivity()发送一个LAUNCH_ACTIVITY消息到消息队列中,通过 handleLaunchActivity()来处理该消息。

经过这三个步骤,就成功启动了一个App。

App启动模式

由上述App启动流程可以看出,App启动需要判断系统中是否有该App的进程,没有的话就需要创建。故App的启动模式可以根据系统中是否存在App的进程分为热启动和冷启动两种,如下:

冷启动:App没有启动过或App进程被killed, 系统中不存在该App进程。

热启动:App进程处于后台, 系统将其从后台带到前台, 展示给用户。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值