Launcher进程启动流程
Launcher启动过程介绍
SystemServer进程在启动的过程中会启动PackageManagerService,PKMS启动后会将系统中的应用程序安装完成。
Launcher启动时序图
Android 11.0源码走读
ActivityManagerService
/** |
查阅mAtmInternal对应的 ActivityTaskManagerInternal.java,这是一个抽象类,跟踪其继承者,可以发现其实现是 ATMS 的内部类 LocalService类
|
加锁交托给RootActivityContainer类,进而启动Launcher
RootActivityContainer
boolean startHomeOnAllDisplays(int userId, String reason) { |
ActivityStartController
void startHomeActivity(Intent intent, ActivityInfo aInfo, String reason, |
ActivityStarter.java
int execute() { |
RootActivityContainer.resumeFocusedStacksTopActivities
boolean resumeFocusedStacksTopActivities( |
进入 ActivityStack.java
|
继续 ActivityStackSupervisor.java 走起
void startSpecificActivity(ActivityRecord r, boolean andResume, boolean checkConfig) { |
从上面最后一行代码可看出,和10.0相比,考虑到调用AMS服务出现死锁的问题,通过向Handler发送消息来启动进程
ActivityTaskManagerService.startProcessAsync代码如下:
void startProcessAsync(ActivityRecord activity, boolean knownToBeDead, boolean isTop, |
重点来看 ActivityManagerInternal::startProcess
进入 ActivityManagerInternal.java,发现startProcess方法是个抽象方法,这里利用归纳思想,一般源码后缀加上Internal标记内部类,其类内部抽象方法的实现一般都是在其去掉Internal的类里的LocalService内部类中。我们试一试,查找 ActivityManager,发现并没有,那与此极为相似的类还有哪些,ActivityManagerService?然后我们进入查找,Good job!找到了。挂一下源码继续分析
ActivityManagerService#LocalService
|
继续深入 ProcessList.java
boolean startProcessLocked(ProcessRecord app, HostingRecord hostingRecord, |
进入 ZygoteProcess.java
public final Process.ProcessStartResult start(@NonNull final String processClass, |
Launcher启动流程关键类介绍
- ActivityManagerService
Activity生命周期调度的服务类
- ActivityTaskManagerService
剥离原先在AMS中有关Activity管理工作,到现有ATMS类中
- RootActivityContainer
调用PKMS去查询手机系统中已安装的所有的应用,哪一个是符合launcher启动标准,去得到一个Intent对象,得到Intent对象之后交由ActivityStarter启动类进行进一步的启动工作。
- ActivityStarter
做启动之前的各项检查,比如是否有在清单文件中注册,Activity是否有权限启动等等。
- ActivityRecord
在Activity启动的时候,涉及到Activity进栈、出栈操作,这在服务端是拿不到Activity的实例的,因此ActivityRecord是在Server端对Activity的映射,里面记录了Activity的所有信息。
- TaskRecord
任务栈,里面记录一个或多个ActivityRecord实例
- ActivityStack
任务栈管理者角色,当一个应用运行时,可能有一个或者多个任务栈,这时该类作用就体现了,主要用来管理回退栈。
- ActivityStackSupervisor
手机系统管理多个应用的任务栈超管角色: 管理多个ActivityStack对象。即管理Launcher和非launcher应用的ActivityStack实例。
- ProcessList
把原先在AMS中有关启动进程的工作剥离至此
- ZygoteProcess
建立起跟Zygote进程的socket连接,并把创建进程所需要的的参数传递过去。