Android应用启动流程
仅供自己学习记录使用
目录
一、AMS简介
1.AMS功能概述
2.ActivityStack
3.ActivityTask
4.其他MS
二、应用启动流程
1.启动方式
2.startActivity流程
3.Zygote启动应用
4.ActivityThread
一、AMS简介
1.AMS功能概述
和其他系统服务一样,AMS寄存于systemService中,它在系统启动时,以线程的形式呈现在我们面前,不断处理客户的请求。在创建时,AMS主要做了两件事:1).创建自己;2).注册其他服务,如"meminfo","cpuinfo"等。
AMS启动后主要提供的功能在IActivityManager.java中有所描述,分类如下:
- 组件状态管理:管理四大组件,包括四大组件的一系列生命活动。
- 组件状态查询:用于查询组件的运行状态。
- Task相关
- 其他事务
2.ActivityStack
ActivityManagerService.java(AMS的实例对象)中其类的成员变量mMianStack就是ActivityStack的对象。它在系统中与其他对象的关系:每一个ActivityRecord都会有一个Activity与之对应,一个Activity可能会有多个ActivityRecord,因为Activity可以被多次实例化,取决于其launchmode。一系列相关的ActivityRecord组成了一个TaskRecord,TaskRecord是存在于ActivityStack中,ActivityStackSupervisor是用来管理这些ActivityStack的。下面是一个简单的关系图
可以看到一个ActivityStack可以包含很多个TaskRecord,一个TaskRecord又可以包含很多个ActivityRecord。
ActivityRecord包含了一个Activity的所有信息,ActivityRecord是在startActivity时创建的。
在startActivity时,也会创建TaskRecord,当没有可复用的TaskRecord时(假如第一次跑进来,肯定是没有的,必须要创建),就会创建一个TaskRecord,mStartActivity是要启动的Activity
ActivityRecord,通过其setTask就把ActivityRecord绑定到了一个TaskRecord上 。ActivityStack并不是开机就创建的,而是在需要时才创建。
3.ActivityTask
ActivityTask可以看做完成同一任务的集合,这个任务是用户处理某一事件相继所用到组件,其管理一系列的活动。
4.其他MS
二、应用启动流程
总体流程:启动->startActivity系列->Zygote进程->ActivityThread主线程:mian()函数,开启消息循环→onCreate(),10s或者其他时间内完成,不然启动错误。
1.启动方式
- 在Launcher中点击相应的应用程序图标启动:大多由用户点击桌面的图标发起。
- 通过startActivity启动:这种方式通过位于源码内部启动应用程序。
不管怎样,最终都会调用到AMS的startActivity函数系列来启动Activity,在启动它之前,需要做一些列繁琐的判断和准备工作-由startActivity函数系列来完成,最后是通过socket来通知Zygote进程来启动应用,之后是执行Activity的主线程。具体分析如下:
2.startActivity流程
startActivity@ActivityManagerService.java
startActivityAsUser@ActivityManagerService.java
startActivityMayWait@ActivityStack.java
startActivityLocked@ActivityStack.java //后面的Locked代表线程安全
startActivityUncheckedLocked@ActivityStack.java
这些函数完成了应用启动的一些列过程,包括权限检查,Intent匹配,设置ActivityStack变量各值,在WMS中注册,根据FLAG标志启动活动,最后通知Zygote来复制进程。
3.Zygote启动应用
- AMS通过socket向zygote发送创建应用程序进程请求;
- zygote接收请求并创建应用程序进程
- 应用进程创建后会启动Binder线程池以及开启消息循环机制。
时序图如下:
4.ActivityThread
ActivityThread主线程:mian()函数,开启消息循环→onCreate(),10s或者其他时间内完成,不然启动错误。
ActivityThread利用ClassLoader去加载Activity、创建Activity实例,并回调Activity的onCreate()方法,这样便完成了Activity的启动。
发布评论