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系统源代码情景分析 罗升阳》