Android UI优化—App启动流程和启动模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jiangguangchao/article/details/85063357

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

下面具体分析一下每个步骤,如下图:
App启动流程
当用户点击一个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进程处于后台, 系统将其从后台带到前台, 展示给用户。

猜你喜欢

转载自blog.csdn.net/jiangguangchao/article/details/85063357