Android源码分析--应用程序启动

栏目: 编程工具 · 发布时间: 5年前

内容简介:应用程序的启动,又可称为根Activity的启动。但是在讲应用程序启动之前,我们有必要对应用程序进程(AppProcess)启动有所了解,那是因为启动一个应用程序首先要保证该应用程序的进程已经被启动。AMS在启动应用程序时,会先检查应用程序进程是否存在,如果不存在就需要请求Zygote进程创建并启动应用程序进程。这里我不会贴上大段大段的代码,只是一些总结,并提供了相关源码的链接。讲完了应用程序进程(AppProcess)启动的相关内容后,接下来我们就来看看应用程序是如何一步一步启动的。

应用程序的启动,又可称为根Activity的启动。但是在讲应用程序启动之前,我们有必要对应用程序进程(AppProcess)启动有所了解,那是因为启动一个应用程序首先要保证该应用程序的进程已经被启动。AMS在启动应用程序时,会先检查应用程序进程是否存在,如果不存在就需要请求Zygote进程创建并启动应用程序进程。这里我不会贴上大段大段的代码,只是一些总结,并提供了相关源码的链接。

应用程序进程(AppProcess)启动

启动大纲

  1. AMS发送启动应用程序进程请求.
  2. Zygote接收请求并创建应用程序进程.

AMS发送启动应用程序进程请求

Android源码分析--应用程序启动
  • AMS通过调用startProcessLocked方法向Zygote进程发送请求。

  • Process 调用 start 方法,使用ZygoteProcess的 start 方法。

  • 在ZygoteProcess的 start 方法中,先后调用了 startViaZygotezygoteSendArgsAndGetResultopenZygoteSocketIfNeeded 等方法,最后在 openZygoteSocketIfNeeded 方法中调用了ZygoteState的connect方法建立与Zygote进程的连接。

AMS发送启动应用程序进程请求

Android源码分析--应用程序启动
  • ZygoteServer 执行 runSelectLoop 方法,一直等待AMS的请求数据到来。

  • 当AMS请求到来,与Zygote进程建立连接后,由ZygoteConnection的 processOneCommand 方法处理请求的数据。对请求数据进行解析,获取程序进程的启动参数,并通过Zygote的 forkAndSpecialize 方法进行应用程序进程的创建。

  • 进程创建完成后,交由ZygoteInit的 zygoteInit 方法和RuntimeInit的 applicationInit 方法分别进行进程和应用的初始化。在 zygoteInit 方法中,为应用程序进程创建了Binder线程池,这样进程就可以跨进程进行通信了。而 applicationInit 方法通过反射最终会调用ActivityThread的 main 方法,从而完成应用程序进程的创建。

应用程序(App)启动

讲完了应用程序进程(AppProcess)启动的相关内容后,接下来我们就来看看应用程序是如何一步一步启动的。

启动大纲

  1. Launcher请求AMS。

  2. AMS请求ApplicationThread。

  3. ActivityThread启动Activity。

启动时序图

Android源码分析--应用程序启动

Launcher请求AMS

Android源码分析--应用程序启动
  • 当我们点击应用程序的图标时,就会自动调用Launcher的 startActivitySafely 方法, 最终会调用Activity的 startActivity 方法。

  • 在Activity的 startActivity 中又调用了 startActivityForResult 方法,而 startActivityForResult 方法内部又调用了Instrumentation的 execStartActivity 方法。

  • 在Instrumentation的 execStartActivity 方法中又通过ActivityManager的 getService 方法获取了IBinder类型的AMS引用 IActivityManager ,最后调用了AMS的 startActivity 方法。

AMS请求ApplicationThread

Android源码分析--应用程序启动
  • 在AMS的 startActivity 方法中,又调用了其本身的 startActivityAsUser 方法,进行权限的检查。

  • 权限检查完后,调用ActivityStarter的 startActivityMayWait 方法,并在该方法中解析处理应用程序需要的参数,并进行相关参数的初始化,最终会调用其 startActivity 方法。而在 startActivity 方法中又调用了 startActivityUnchecked 方法来处理与栈管理相关的逻辑。

  • 在处理完栈的关系后,紧接着会调用 ActivityStackSupervisorresumeFocusedStackTopActivityLocked 方法获取需要启动的Activity所在栈的栈顶。

  • 当需要启动的Activity的状态不是RESUMED状态,就需要调用ActivityStack的 resumeTopActivityUncheckedLocked 方法,而它的内部又调用了 resumeTopActivityInnerLocked 方法进行一系列的栈状态的判断,最终又回调了ActivityStackSupervisor的 startSpecificActivityLocked 方法。

  • ActivityStackSupervisorstartSpecificActivityLocked 方法中先是获取了即将启动的Activity所在的应用程序进程(就是在这个地方判断应用所在进程是否存在且已启动,如果没有启动,就需要启动应用程序进程),然后调用 realStartActivityLocked 方法。

  • ActivityStackSupervisorrealStartActivityLocked 方法中,对启动的应用程序进程进行一系列的判断和处理,最终会调用IBinder类型的ApplicationThread引用 IApplicationThread ,通过传入 IApplicationThread 建立 ClientTransaction ,加入执行 LaunchActivityItem 任务,最终实现跨进程执行调用ActivityThread的 handleLaunchActivity 方法。

ActivityThread启动Activity

Android源码分析--应用程序启动
  • 在ActivityThread调用了它的 handleLaunchActivity 方法中,会先调用其 performLaunchActivity 方法,之后调用 handleResumeActivity ,将Activity的状态置为Resume。

  • 在ActivityThread的 performLaunchActivity 方法中做了很多事情。

  1. 首先,执行了 createBaseContextForActivity 方法,创建要启动Activity的上下文;
  2. 其次,调用执行了Instrumentation的 newActivity 方法来创建Activity实例;
  3. 接着,调用LoadedApk的 makeApplication 方法,创建应用程序的Application;
  4. 之后,调用需要启动的Activity的 attach 方法初始化Activity,创建Window对象并与Activity自身进行关联。
  5. 最后,调用执行了Instrumentation的 callActivityOnCreate 方法来启动Activity。
  • 在Instrumentation执行了 callActivityOnCreate 方法中,会调用Activity的 performCreate 方法,最终会调用Activity的 onCreate 方法,这样应用程序也就启动了。

应用程序启动的进程关系图

应用程序启动的过程中,主要涉及了Launcher进程、SystemServer进程、Zygote进程和应用程序进程这四个进程,它们之间的关系如下。

Android源码分析--应用程序启动

以上所述就是小编给大家介绍的《Android源码分析--应用程序启动》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

计算机程序设计艺术(第2卷)

计算机程序设计艺术(第2卷)

Donald E. Knuth / 苏运霖 / 国防工业出版社 / 2002-8 / 98.00元

本书是国内外业界广泛关注的7卷本《计算机程序设计艺术》第2卷的最新版。本卷对半数值算法领域做了全面介绍,分“随机数”和“算术”两章。本卷总结了主要算法范例及这些算法的基本理论,广泛剖析了计算机程序设计与数值分析间的相互联系,其中特别值得注意的是作者对随机数生成程序的重新处理和对形式幂级数计算的讨论。 本书附有大量习题和答案,标明了难易程度及数学概念的使用。 本书内容精辟,语言流畅,引人入胜,可供从......一起来看看 《计算机程序设计艺术(第2卷)》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

MD5 加密
MD5 加密

MD5 加密工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具