美文网首页Android基础知识
Android App 启动流程源码分析

Android App 启动流程源码分析

作者: Parallel_Lines | 来源:发表于2019-05-09 16:53 被阅读0次

    Blog - Android App 启动流程源码分析

    App 启动是多个进程复杂交互的过程,本文主要分析从 Launcher 到 App 启动过程中,应用层开发人员需要知道的大致流程。

    流程总览

    流程概览.png

    名词说明

    Launcher:桌面应用进程;
    AMS:ActivityManagerService,位于系统 system_server 进程中;
    App:要启动的 App 进程。

    大致流程

    流程上大体可分为四步:

    1. Launcher 通知 AMS 启动 App。
    2. AMS 通知 Launcher 休眠。
    3. AMS 启动目标 App 进程。
    4. 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 了,但是在此之前,还需要判断目标程序的进程是否已经启动,如果没有启动,则会做如下工作:

    1. AMS 通知 Zygote fork 一个应用程序进程。(不属于文本重点)
    2. AMS 创建 ActivityThread (UI 主线程),执行 main 方法。这里的 main,就可以看作是 Java 入口的 main 函数。
    3. ActivityThread 线程中创建 Looper、Instrumentation、Application,并执行 Application.onCreate。
    4. 通知 AMS,App 初始化完毕。

    main 函数开始,进入应用程序进程,所以下面流程图也是从 main 方法开始。期间与 AMS 交互过程中 AMS 所在进程的方法调用已省略。

    AMS 启动目标 App 进程.png

    其中 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 插件化、组件化铺平道路。

    相关文章

      网友评论

        本文标题:Android App 启动流程源码分析

        本文链接:https://www.haomeiwen.com/subject/alqgoqtx.html