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

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

应用程序进程(AppProcess)启动

启动大纲

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

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

在这里插入图片描述

  • AMS经过调用startProcessLocked方法向Zygote进程发送请求。android

  • Process调用start方法,使用ZygoteProcessstart方法。微信

  • 在ZygoteProcess的start方法中,前后调用了startViaZygotezygoteSendArgsAndGetResultopenZygoteSocketIfNeeded等方法,最后在openZygoteSocketIfNeeded方法中调用了ZygoteState的connect方法创建与Zygote进程的链接。app

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

在这里插入图片描述

  • ZygoteServer执行runSelectLoop方法,一直等待AMS的请求数据到来。svg

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

  • 进程建立完成后,交由ZygoteInitzygoteInit方法和RuntimeInitapplicationInit方法分别进行进程和应用的初始化。在zygoteInit方法中,为应用程序进程建立了Binder线程池,这样进程就能够跨进程进行通讯了。而applicationInit方法经过反射最终会调用ActivityThreadmain方法,从而完成应用程序进程的建立。线程


应用程序(App)启动

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

启动大纲

  1. Launcher请求AMS。orm

  2. AMS请求ApplicationThread。cdn

  3. ActivityThread启动Activity。

启动时序图

在这里插入图片描述

Launcher请求AMS

在这里插入图片描述

  • 当咱们点击应用程序的图标时,就会自动调用LauncherstartActivitySafely方法, 最终会调用ActivitystartActivity方法。

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

  • 在Instrumentation的execStartActivity方法中又经过ActivityManagergetService方法获取了IBinder类型的AMS引用IActivityManager,最后调用了AMSstartActivity方法。

AMS请求ApplicationThread

在这里插入图片描述

  • 在AMS的startActivity方法中,又调用了其自己的startActivityAsUser方法,进行权限的检查。

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

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

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

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

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

ActivityThread启动Activity

在这里插入图片描述

  • 在ActivityThread调用了它的handleLaunchActivity方法中,会先调用其performLaunchActivity方法,以后调用handleResumeActivity,将Activity的状态置为Resume。

  • 在ActivityThread的performLaunchActivity方法中作了不少事情。

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

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

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

在这里插入图片描述

联系方式

在这里插入图片描述

微信公共号

在这里插入图片描述
相关文章
相关标签/搜索