阅读本文大约需要花费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的启动由三部分启动:

  1. SystemServer完成启动Launcher Activity的调用
  2. Zygote()进行Launcher进程的Fork操作
  3. 进入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流程。