ActivityManagerService流程总结
ActivityManagerService是一个Binder服务,用来负责系统中四大组件的管理和调度。
1.ActivityManagerService启动流程分析
Android系统第一个启动的进程是Zygote进程,是通过脚本启动的,这个进程启动后马上会通过fork启动一个System Server进程,system server进程很重要,PackageManagerService和ActivityManagerService等一些重要服务都是运行在这个进程里。System Server进程启动后会开启一个ServerThread线程,这是一个开启了looper的线程,然后会在这个线程里调用ActivityManagerService的main函数进行启动。
main函数执行的时序图如下:
1.创建一个AThread的线程
2.启动Athread线程
3.等待ActivityManagerService对象的创建
4.Athread这时会去创建ActivityManagerService对象,即执行ActivityManagerService的构造方法
5.ActivityManagerService对象创建完成唤醒ServerThread线程
6.Athread等待
7.执行ActivityThread.systemMain()函数,(我们知道ActivityThread是一个app进程的主线程,借用《深入理解Android卷2》中一句话,systemMain的目的是为system_server进程搭建一个和普通app进程一样的android运行环境)
8.创建ActivityThread对象(在这里其实是system/framework/framework-res.apk的主线程)
9.关联到系统进程
10.取得系统ContextImpl对象(同样是system/framework/framework-res.apk的context)
11.返回ContextImpl对象,然后创建一个ActivityStack对象。
12.唤醒Athread线程,Athread线程进入looper循环
13.继续执行startRunning函数(此处由于系统没准备好,直接返回)
2.startActivity流程分析
在控制台可以通过adb shell登录,并通过am命令打开一个activity 比如
am start -n demo.leakcanary.srain.in.leakcanarydemo/.MainActivity
activity从桌面启动的时序图如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X8FsQtIO-1613019571484)(https://i.imgur.com/TUdt4OH.png)]
1-9、11步在AMS(ActivityManagerService)进程中执行;
1.使用am命令启动一个activity,实质是Am类通过ActivityManagerNative.getDefault()获得一个ActivityManagerProxy代理,ActivityManagerProxy代理会调用startActivityAndWait方法,而这其实又会调用AMS的startActivityAndWait方法。(因为AMS是ActivityManagerNative子类)
2.调用ActivityStack的startActivityAndWait方法,ActivityStack是AMS的一个实例,是对activity进行调度的核心,比如管理activity的启动模式。
3.这里会获取launchFlags来取出启动模式,检查权限等。
4.创建activityRecod。
5.这里也会对不同的启动模式进行处理,即为新建的activity_record找task。
6.里面有一些动画相关的处理
7.判断当前是否有resume的activity,有就进行pause操作(当前是home界面,所以先对launcher当前显示的activity进行pause操作)
8.取出launcher进程的ApplicationThreadProxy代理。
9.调用launcher进程代理的schedulePauseActivity方法进行pause activity的操作
11、AMS执行完毕进入等待。
10、12-14在launcher所在进程中执行;
10.取出AMS发过来的参数。
12.launcher通过H向自己的主线程发送pause activity的消息
13.处理activity的pause操作。
14.通过ActivityManagerProxy通知AMS当前activity已经完成暂停操作了。由此可见打开一个activity,首先得先把当前显示的activity先暂停。而不是先创建新的activity。
15-22在AMS进程中执行;
15.AMS调用ActivityStack的activityPaused方法。
16.该过程会检查系统是否正在进入睡眠或关闭,否则再次调用resumeTopActivityLocked函数。
17.resumeTopActivityLocked这个函数在第7步调用过,当时前面的activity没pause所以直接返回了,现在launcher显示的activity已经pause成功,则马上调用startSpecificActivityLocked方法、
18.该函数首先会检查当前要启动的activity所在进程是否存在,如果不存在则新建进程,如果存在则直接执行realStartActivityLocked方法(这个方法后面32步也会调到)。
19.取出ProcessRecord对象,如果进程不存在,则新建ProcessRecord对象,并加入到AMS的mProcessNames中。
20.调用另一个startProcessLocked来创建新的进程对象
21.调用Process.start方法开启一个新进程
22.AMS执行完进入等待。
23-26在新开的应用进程中执行;
23.Process.start开启进程后会进入新的app的主线程的main方法,也就是ActivityThread的main方法。ActivityThread类加载时会new一个ApplicationThread的binder对象,AMS便会和这个ApplicationThread进行进程间通信。
24.创建一个ActivityThread对象。
25.调用对象的attach方法
26.通过AMS代理调用AMS的attachApplication方法
27-28在AMS进程中执行;
27.目的是将新的app的ApplicationThread和pid在AMS中注册。
28.通过ApplicationThreadProxy将信息返回给新的app进程。
29-31在新开的应用进程中执行;
29.新应用取出AMS发过来的数据向自己主线程的H发送消息。
30.H处理消息。
31.执行handleBindApplication进行相关信息的绑定。此处的操作包括创建上下文ContextImpl,创建应用的application,并调用application的oncreate方法。
32-33在AMS进程中执行;
32.AMS执行完bindApplication后便开始调用ActivityStack的realStartActivityLocked进行activity的显示,(该方法在之前18步的一个分支也可能会调用到)
33.调用scheduleLaunchActivity方法,通过ApplicationThreadPoxy通知应用进行打开activity。
34-44在新开的应用进程中执行;
34.像主线程的H发送打开activity的message。
35.处理打开activity的操作。
36.调用performLaunchActivity进行创建并打开activity的操作。
37.该函数内会调用activity声明周期的oncreate和onstart方法。
38.通过反射创建activity对象。
39.newActivity创建完成返回activity变量。
40.调用Instrumentation的callActivityOnCreate方法。
41.调用activity的oncreate方法。
42.执行完后会紧接着执行activity.performStart方法,即回调activity的onstart方法。
43.执行handleResumeActivity方法,当44步调用完后,接着还会往主线程的MessageQueue发送一个Idler对象,会在这里面通知AMS对已经暂停的activity调用onStop和onDestroy的生命周期
44.该过程会调用activity的onresume方法。
参考资料
Android AOSP代码
《深入理解Android 卷2 邓凡平》
《Android系统源代码情景分析 罗升阳》