Activity启动流程
https://mp.weixin.qq.com/s/1bfi-BVe23_96A2AlhaPKg
系统启动触发Launcher流程
系统开机时加载引导程序并初始化各个硬件,初始化完成后会创建出第一个用户进程 Init进程(pid=1),随后孵化出 adbd(adb 命令) 和 logd(日志输出) 两个守护进程,执行完成之后还会孵化出第一个 java 进程,也就是 Zygote 进程,它会调用 ZygoteInit.java 这个类,在这个类的入口方法会创建 Framework SystemServer 系统服务进程,即 SystemServer.java 这个类,在这个 SystemServer 这个类里面又会创建我们熟知的系统服务:ActivityManagerService 、 WindowManagerService 、PowerManagerService 、InputManagerService 等等,同时创建出 binder 线程池,当所有服务启动完毕后,就会调用 ActivityManagerService.systemReady() 来启动 Launcher 应用了。
Launcher 启动 App 流程
-  Launcher监听到点击app事件,调用Activity.startActivityForResult(),转到Instrumentation类的execStartActivity方法
-  Instrumentation通过跨进程通信告诉ATMS要启动应用的需求
- ATMS反馈- Launcher让其进入- Paused状态
- 随后 ATMS转到ZygoteProcess类,通过socket与Zygote通信,告知Zygote需要新建进程
- Zygote fork进程,并调用- ActivityThread的- main方法,也就是app的入口
- ActivityThread创建- ActivityThread实例,新建- Looper实例,开始- loop循环
- 同时 ActivityThread告知AMS,进程创建完毕,开始反射创建ApplicationProvider,并调用Application的attachonCreate的方法
- 最后创建上下文,反射创建 Activity,开始调用生命周期
问题
- ActivityManagerService与- ActivityTaskManagerService的区别?- 原本四大组件的通信都是 AMS来处理,后期AMS过于臃肿,将Activity相关工作转移到ATMS中
 
- 原本四大组件的通信都是 
- 怎么判断应用进程存在?- 如果进程存在,ATMS里面会保存有WindowProcessController信息,这个信息包括processName和uid,uid则是应用程序的id,可以通过applicationInfo.uid获取。所以判断进程是否存在,根据processName和uid去判断是否有对应的WindowProcessController,并且WindowProcessController里面的线程不为空。
 
- 如果进程存在,
- 怎么创建进程,为什么要通过 socket 进行 IPC 通信而不是 binder?- 通过 socket与Zygote进行通信,然后Zygote进行fork进程并返回新进程的pid
- fork() 方法是类 Unix 操作系统上创建进程的主要方法,用于创建当前进程的副本
- 因为 binder 是多线程交互,而 fork 不允许存在多线程,原因是会出现死锁,例如主进程里的A线程持有锁后,fork 出的子进程同样将锁 fork 出来了,当子进程的线程需要用到该锁,那么就会出现死锁
 
- 通过 
ZygoteInit.java 里做的业务:
| 1 | public static main(String argv[]) { | 
SystemServer.java 里做的业务:
| 1 | public static void main(String argv[]) { | 
Launcher 启动流程示意
 
相关成员:
- ActivityRecord:- Server端- Activity的映射,存放了- Activity的各种信息,当- Activity被回收时,临时保存的数据也会通过- Instrumentation.callActivityOnSaveInstanceState跨进程通信保存在该类中
- TaskRecord:单个任务栈记录
- ActivityStack:- Activity的栈管理,出栈入栈顺序等信息
- ActivityStackSupervisor:管理各个app的任务栈管理者

【重点】留意 ActivityStarter,里面有检查配置清单里的信息,如果要处理插件化,Activity 配置清单信息要如何处理同让需要参考该类并hook里面的逻辑
Activity创建流程示意
