阅读本文大约需要花费50分钟。
文章的内容主要还是从源码进行分析,虽然又臭又长,但是如果想要学习Android系统源码,这是必要走的路,没有捷径。
相对于碎片学习,我更倾向于静下心来花费1个小时认真的学习一段内容。
上一节我们讲完了Android10.0的ActivityManagerService的启动流程,在AMS的最后启动了Launcher进程,今天我们就来看看Launcher的真正启动流程。
1.概述
上一节我们学习了AMSATM的启动流程,这一节主要来学习Launcher的启动流程。
在Android的中,桌面应用Launcher由Launcher演变到Launcher2,再到现在的Launcher3,Google也做了很多改动。
Launcher不支持桌面小工具动画效果,Launcher2添加了动画效果和3D初步效果支持,从Android 4.4 (KK)开始Launcher默认使用Launcher3, Launcher3加入了透明状态栏,增加overview模式,可以调整workspace上页面的前后顺序,可以动态管理屏幕数量,widget列表与app list分开显示等功能。
我们主要研究Launcher3的启动过程。
2.核心源码
从上面的代码路径可以看出,Android10.0中 Activity的相关功能被放到了wm的目录中,在Android9.0中是在am目录中,Google 最终的目的是把activity 和window融合,在Android10中只是做了简单的代码路径的变更,正在的功能还要到后面的版本才能慢慢融合。
主要代码作用:
- Instrumentation:
负责调用Activity和Application生命周期。
- ActivityTaskManagerService:
负责Activity管理和调度等工作。
ATM是Android10中新增内容
- ActivityManagerService:
负责管理四大组件和进程,包括生命周期和状态切换。
- ActivityTaskManagerInternal:是由ActivityTaskManagerService对外提供的一个抽象类,真正的实现是在 ActivityTaskManagerService#LocalService
- ActivityThread:
管理应用程序进程中主线程的执行
- ActivityStackSupervisor:
负责所有Activity栈的管理
- TransactionExecutor:
主要作用是执行ClientTransaction
- ClientLifecycleManager:
生命周期的管理调用
3.架构
Android启动流程图:
Launcher启动序列图:
内容较多,例如Zygote的fork流程,realStartActivityLocked启动Activity的中间过程,都没有列出,下一个章节会单独来讲这部分内容.
Launcher启动序列图
4.源码分析
上一节在AMS启动过程中,我们知道了AMS启动完成前,在systemReady()中会去调用startHomeOnAllDisplays()来启动Launcher,本次就从startHomeOnAllDisplays()函数入口,来看看Launcher是如何被启动起来的。
Launcher的启动由三部分启动:
- SystemServer完成启动Launcher Activity的调用
- Zygote()进行Launcher进程的Fork操作
- 进入ActivityThread的main(),完成最终Launcher的onCreate操作
接下来我们分别从源码部分来分析这三个启动过程。
4.1第一阶段SystemServer 启动HomeActivity的调用阶段
调用栈:
[ActivityTaskManagerService.java]
startHomeOnAllDisplays()
说明:
ActivityTaskManagerInternal是
ActivityTaskManagerService的一个抽象类,正在的实现是在ActivityTaskManagerService的LocalService,所以
mAtmInternal.startHomeOnAllDisplays()最终调用的是
ActivityTaskManagerService的
startHomeOnAllDisplays()方法
源码:
4.2 [RootActivityContainer.java]
startHomeOnDisplay()
说明:在[4.1]中,获取的displayId为DEFAULT_DISPLAY, 首先通过getHomeIntent 来构建一个category为CATEGORY_HOME的Intent,表明是Home Activity;
然后通过resolveHomeActivity()从系统所用已安装的引用中,找到一个符合HomeItent的Activity,最终调用startHomeActivity()来启动Activity
源码:
4.2.1 [ActivityTaskManagerService.java]
getHomeIntent()
说明:构建一个category为CATEGORY_HOME的Intent,表明是Home Activity。
Intent.CATEGORY_HOME = "android.intent.category.HOME"
这个category会在Launcher3的 AndroidManifest.xml中配置,表明是Home Acivity
源码:
4.2.2 [RootActivityContainer.java]
resolveHomeActivity()
说明:通过Binder跨进程通知PackageManagerService从系统所用已安装的引用中,找到一个符合HomeItent的Activity
源码:
4.3 [ActivityStartController.java ]
startHomeActivity()
说明:正在的启动Home Activity入口。
obtainStarter() 方法返回的是 ActivityStarter 对象,它负责 Activity 的启动,一系列 setXXX() 方法传入启动所需的各种参数,最后的 execute() 是真正的启动逻辑。
另外如果home activity处于顶层的resume activity中,则Home Activity 将被初始化,但不会被恢复
并将保持这种状态,直到有东西再次触发它。我们需要进行另一次恢复。
源码:
4.3.1 [ActivityStarter.java] execute()
说明:在[4.3]中obtainStarter没有调用setMayWait的方法,因此mRequest.mayWait为false,走startActivity流程
源码:
4.3.2 [ActivityStarter.java] startActivity()
说明:延时布局,然后通过startActivityUnchecked()来处理启动标记 flag ,要启动的任务栈等,最后恢复布局
源码:
4.3.3 [RootActivityContainer.java]
resumeFocusedStacksTopActivities()
说明:获取栈顶的Activity,恢复它
源码:
4.3.4 [ActivityStackSupervisor.java]
startSpecificActivityLocked()
说明:发布消息以启动进程,以避免在ATM锁保持的情况下调用AMS时可能出现死锁,最终调用到ATM的startProcess()
源码:
4.3.5 [ActivityManagerService.java]
startProcess()
说明:一路调用Process start(),最终到ZygoteProcess的
attemptUsapSendArgsAndGetResult(),用来fork一个新的Launcher的进程
源码:
调用栈如下:
4.3.6 [ZygoteProcess.java]
attemptZygoteSendArgsAndGetResult()
说明:通过Socket连接Zygote进程,把之前组装的msg发给Zygote,其中processClass ="android.app.ActivityThread",通过Zygote进程来Fork出一个新的进程,并执行 "android.app.ActivityThread"的main方法
源码:
4.4 第二阶段Zygote fork一个Launcher进程的阶段
说明:Zygote的启动过程我们前面有详细讲到过。
SystemServer的AMS服务向启动Home Activity发起一个fork请求,Zygote进程通过Linux的fork函数,孵化出一个新的进程。
由于Zygote进程在启动时会创建Java虚拟机,因此通过fork而创建的Launcher程序进程可以在内部获取一个Java虚拟机的实例拷贝。
fork采用copy-on-write机制,有些类如果不做改变,甚至都不用复制,子进程可以和父进程共享这部分数据,从而省去不少内存的占用。
fork过程,参考下图:
Zygote的调用栈如下:
4.4.1 [ZygoteInit.java] main()
说明:Zygote先fork出SystemServer进程,接着进入循环等待,用来接收Socket发来的消息,用来fork出其他应用进程,比如Launcher
源码:
4.4.2 [ZygoteConnection.java]
processOneCommand()
说明:通过forkAndSpecialize()来fork出Launcher的子进程,并执行handleChildProc,进入子进程的处理
源码:
4.4.3 [ZygoteConnection.java]
handleChildProc()
说明:进行子进程的操作,最终获得需要执行的ActivityThread的main()
源码:
zygoteInit 进行一些环境的初始化、启动Binder进程等操作:
把之前传来的"android.app.ActivityThread" 传递给findStaticMain:
通过反射,拿到ActivityThread的main()方法:
把反射得来的ActivityThread main()入口返回给ZygoteInit的main,通过caller.run()进行调用:
4.5 第三个阶段,Launcher在自己的进程中进行onCreate等后面的动作
从[4.4]可以看到,Zygote fork出了Launcher的进程,并把接下来的Launcher启动任务交给了ActivityThread来进行,接下来我们就从ActivityThread main()来分析Launcher的创建过程。
调用栈如下:
4.5.1 [ActivityThread.java] main()
说明:主线程处理, 创建ActivityThread对象,调用attach进行处理,最终进入Looper循环
源码:
调用ActivityThread的attach进行处理
4.5.2 [ActivityManagerService.java]
attachApplication()
说明:清除一些无用的记录,最终调用ActivityStackSupervisor.java的 realStartActivityLocked(),进行Activity的启动
源码:
4.5.3 [ActivityStackSupervisor.java]
realStartActivityLocked()
说明:真正准备去启动Activity,通过clientTransaction.addCallback把LaunchActivityItem的obtain作为回调参数加进去,再调用
ClientLifecycleManager.scheduleTransaction()得到
LaunchActivityItem的execute()方法进行最终的执行
参考上面的第三阶段的调用栈流程
调用栈如下:
源码:
4.5.4 [TransactionExecutor.java] execute()
说明:执行之前realStartActivityLocked()中的
clientTransaction.addCallback
调用栈如下图所示:
源码:
4.5.5 [ActivityThread.java]
handleLaunchActivity()
说明:主要干了两件事,第一件:初始化WindowManagerGlobal;第二件:调用performLaunchActivity方法
源码:
4.5.6 [ActivityThread.java]
performLaunchActivity()
说明:获取ComponentName、Context,反射创建Activity,设置Activity的一些内容,比如主题等;
最终调用callActivityOnCreate()来执行Activity的onCreate()方法
源码:
callActivityOnCreate先执行activity onCreate的预处理,再去调用Activity的onCreate,最终完成Create创建后的内容处理
performCreate()主要调用Activity的onCreate()
至此,看到了我们最熟悉的Activity的onCreate(),Launcher的启动完成,Launcher被真正创建起来。
5.总结
看到onCreate()后,进入到我们最熟悉的Activity的入口,Launcher的启动告一段落。整个Android的启动流程,我们也完整的分析完成。
Launcher的启动经过了三个阶段:
第一个阶段:SystemServer完成启动Launcher Activity的调用
第二个阶段:Zygote()进行Launcher进程的Fork操作
第三个阶段:进入ActivityThread的main(),完成最终Launcher的onCreate操作
下一节会来分析一下Android的进程创建过程以及Zygote的fork流程。