Android App 启动流程源码分析
App 启动是多个进程复杂交互的过程,本文主要分析从 Launcher 到 App 启动过程中,应用层开发人员需要知道的大致流程。
流程总览
流程概览.png名词说明
Launcher:桌面应用进程;
AMS:ActivityManagerService,位于系统 system_server 进程中;
App:要启动的 App 进程。
大致流程
流程上大体可分为四步:
- Launcher 通知 AMS 启动 App。
- AMS 通知 Launcher 休眠。
- AMS 启动目标 App 进程。
- AMS 启动目标 App 的 Activity。
详细步骤
下面将分析每一步骤在 Android 应用程序进程中所做的事。
步骤1:Launcher 通知 AMS 启动 App
Launcher 通知 AMS 启动 App.png如图,Launcher 的 Activity 的经过层层调用,最终交给 AMS 去启动目标 App。
这里,IActivityManager 是应用程序进程与 SystemServer(AMS 所在进程)通信的 Binder 在 Client 端的代理,因为是应用程序进程向 AMS 发消息,所以应用程序进程是 Client 端。
步骤2:AMS 通知 Launcher 休眠。
AMS 在收到 Launcher 请求之后,会去目标 App 的 AndroidManifest 中检查 Activity 是否存在,不存在则抛出 ActivityNotFoundException。如果校验没有问题,则会将要启动的页面保存起来,然后通知 Launcher 休眠。
通知 Launcher 休眠也是 Binder 通信过程,由于这次是 AMS 向 Launcher 发消息,所以 AMS 是 Client 端。它的 Client 端类为 ApplicationThreadProxy,它将方法传给 Server 端(应用程序进程)的 ApplicationThread。你搜索不到 ApplicationThread,因为它是 ActivityThread 的内部类。
下面流程图只分析 Launcher 休眠的过程,即在应用程序进程的具体执行步骤,因为对于应用层开发人员来说这些方法调用相较 AMS 复杂的方法传递更具实际开发意义。
AMS 通知 Launcher 休眠.png其中 performPauseActivity()
最终执行了 Activity.onPause()
。
步骤3:AMS 启动目标 App 进程
Launcher 休眠之后,通过 IActivityManager 告知了 AMS,然后 AMS 就可以启动目标 Activity 了,但是在此之前,还需要判断目标程序的进程是否已经启动,如果没有启动,则会做如下工作:
- AMS 通知 Zygote fork 一个应用程序进程。(不属于文本重点)
- AMS 创建 ActivityThread (UI 主线程),执行 main 方法。这里的 main,就可以看作是 Java 入口的 main 函数。
- ActivityThread 线程中创建 Looper、Instrumentation、Application,并执行 Application.onCreate。
- 通知 AMS,App 初始化完毕。
从 main
函数开始,进入应用程序进程,所以下面流程图也是从 main
方法开始。期间与 AMS 交互过程中 AMS 所在进程的方法调用已省略。
其中 ActivityThread.handleBindApplication
方法中创建了 Instrumentation、ContextImpl、Application,并间接调用了 Application.onCreate()
。
步骤4:AMS 启动目标 App 的 Activity
应用程序进程启动之后,就可以正常启动 Activity 了。
步骤3 AMS 在调用 ApplicationThread.bindApplication()
之后,最终会调用app.thread.scheduleLaunchActivity()
,将方法通过 Binder 传给 ApplicationThread.scheduleLaunchActivity()
,其实际执行方法为ActivityThread.handleLaunchActivity()
。
之后将调用 ActivityThread.performLaunchActivity()
,该方法将创建我们熟悉的 Context,并通过 ClassLoader 创建 Activity,最终执行 Activity.onCreate()
。
ActivityThread.handleLaunchActivity()
还执行了 Activity.onRestart()
、Activity.onStart()
、Activity.onResume()
等熟悉的生命周期方法。
下面的流程图包括了 Activity 创建运行过程中非常重要的方法,关于 Activity 生命周期方法的执行顺序还可以参考 源码分析 Activity 可见性真实时机。
AMS 启动目标 App 的 Activity.png总结
以上就是 Launcher 启动 App 过程中,应用程序进程涉及到的关键代码。
熟悉以上流程可以帮助理解 Android 启动原理,为 Android 插件化、组件化铺平道路。