Android进阶学习

重温ActivityManagerService--应用启动流程

2021-10-15  本文已影响0人  Jack_Ou

前言

前一篇文章《重温ActivityManagerService》重温了AMS,记录了AMS启动过程,与AMS交互的几个重要的类和数据结构。

分析的笔记见:AMS源码分析笔记

此文章主要记录一个应用是如何启动起来的。其中分析启动过程我将以两种不同的启动方式来分析:

1 图解Acitivity启动过程

凡事由浅入深,一口气带出全过程必然一脸蒙蔽。因此我先放出一张简易版的子Activity的启动过程图。小伙伴们肯定可以看懂一个界面是如何启动起来的。但是该图只能说明大致流程,没有考虑进程还没有启动的情况。

启动子Activity流程图.png

然后看看稍微详细一些的子Activity启动流程图,可以更加详细得明白APP和AMS是如何调度的。

子Activity组件启动过程.png

最后看看详细的根Activity的启动流程图,可以全面看清楚一个应用从无到启动完成的过程。后面章节也会详细叙述每个步骤做了什么。

根Activity组件启动过程.png

注意:根Activity的23步到24步还做了很多事件,例如AMS通过Socket请求Zygote fork一个子进程等操作没有画入到该流程图中,因为该过程在《Android系统启动流程分析》中有分析到,此处只列出了调用AMS的startProcessLocked()就启动了一个进程,然后调用了ActivityThread的main()方法。

小结:

Launcher组件启动MainActivity组件的过程:

Ok, let's go! 为了叙述的完整性,我们还是从启动根Activity开始分析,因此启动子Activity绝大多数步骤是沿用启动根Activity的流程。

2.启动根Activity

启动根Activity我们以在Launcher应用中点击Icon开始分析。

2.1 在Launcher进程中完成的操作
Launcher_startActivity.png

在Launcher进程中完成了以下五个步骤的调用,具体实现的功能如下:

2.2 在ActivityManagerService中完成的操作
AMS_pause.png

从6至12步骤是在AMS中完成的操作,具体实现的功能如下:

2.3 在Launcher进程中完成的操作
launcher_pause.png

从13至17步骤是在Launcher中完成的操作,具体内容如下:

2.4 在ActivityManagerService中完成的操作
AMS_startproc.png

从18至23步骤是在AMS中完成的操作,具体实现的功能如下:

2.5 在Launcher进程中完成的操作
launcher_attach.png

24步之前,AMS会调到Zygote, Zygote会fork一个进程出来,然后调用Launcher的ActivityThread.main().

从24至25步骤是在Launcher中完成的操作,具体内容如下:

2.6 在ActivityManagerService中完成的操作
AMS_launch_activity.png

从27至30步骤是在AMS中完成的操作,具体实现的功能如下:

2.7 在Launcher进程中完成的操作
launcher_handle_create.png

从31至35步骤是在Launcher中完成的操作,具体内容如下:

2.8 小结

MainActivity组件作为应用程序Activity的根activity,他启动起来就意味着应用程序启动起来了。因此我们可以将一个根Activity的启动过程看做一个Android应用程序的启动过程。

3.启动子Activity

启动子Activity和启动根Activity步骤相似度非常高,只是在startActivityUncheckedLocked中判断是否能通过AcitivityRecord获得到IApplicationThread,如果获取不到就说明进程没有启动,就去先启进程;如果不为空,就直接启动子Activity。

3.1 在Launcher进程中完成的操作
launcher_sub_startactivity.png

从1至5步骤是在Launcher中完成的操作,具体内容如下:

3.2 在ActivityManagerService中完成的操作
AMS_sub_pause.png

从6至12步骤是在AMS中完成的操作,具体实现的功能如下:

3.3 在Launcher进程中完成的操作
launcher_sub_pause.png

从13至17步骤是在Launcher中完成的操作,具体内容如下:

3.4 在ActivityManagerService中完成的操作
AMS_sub_launch_activity.png

从18至25步骤是在AMS中完成的操作,具体实现的功能如下:

3.5 在Launcher进程中完成的操作
launcher_sub_handle_create.png

从26至30步骤是在Launcher中完成的操作,具体实现的功能如下:

3.6 说明

如果子activity设置了android:process属性为另一个进程,启动过程跟MainActivity启动一样,只是不用再新建一个task了,因为子activity的android:taskAffinity和MAinActivity是一样的,MainActivity已经新创建了一个task,可以在同一个task中进程。

上一篇 下一篇

猜你喜欢

热点阅读