面试官:什么是应用程序启动
应用程序的启动,又可称为根Activity的启动。但是在讲应用程序启动之前,我们有必要对应用程序进程(AppProcess)启动有所了解,那是因为启动一个应用程序首先要保证该应用程序的进程已经被启动。AMS在启动应用程序时,会先检查应用程序进程是否存在,如果不存在就需要请求Zygote进程创建并启动应用程序进程。这里我不会贴上大段大段的代码,只是一些总结,并提供了相关源码的链接。
start
方法,使用ZygoteProcess的start
方法。start
方法中,先后调用了startViaZygote
、zygoteSendArgsAndGetResult
和openZygoteSocketIfNeeded
等方法,最后在openZygoteSocketIfNeeded
方法中调用了ZygoteState的connect方法建立与Zygote进程的连接。runSelectLoop
方法,一直等待AMS的请求数据到来。processOneCommand
方法处理请求的数据。对请求数据进行解析,获取程序进程的启动参数,并通过Zygote的forkAndSpecialize
方法进行应用程序进程的创建。zygoteInit
方法和RuntimeInit的applicationInit
方法分别进行进程和应用的初始化。在zygoteInit
方法中,为应用程序进程创建了Binder线程池,这样进程就可以跨进程进行通信了。而applicationInit
方法通过反射最终会调用ActivityThread的main
方法,从而完成应用程序进程的创建。讲完了应用程序进程(AppProcess)启动的相关内容后,接下来我们就来看看应用程序是如何一步一步启动的。
startActivitySafely
方法, 最终会调用Activity的startActivity
方法。startActivity
中又调用了startActivityForResult
方法,而startActivityForResult
方法内部又调用了Instrumentation的execStartActivity
方法。execStartActivity
方法中又通过ActivityManager的getService
方法获取了IBinder类型的AMS引用IActivityManager
,最后调用了AMS的startActivity
方法。startActivity
方法中,又调用了其本身的startActivityAsUser
方法,进行权限的检查。startActivityMayWait
方法,并在该方法中解析处理应用程序需要的参数,并进行相关参数的初始化,最终会调用其startActivity
方法。而在startActivity
方法中又调用了startActivityUnchecked
方法来处理与栈管理相关的逻辑。resumeFocusedStackTopActivityLocked
方法获取需要启动的Activity所在栈的栈顶。resumeTopActivityUncheckedLocked
方法,而它的内部又调用了resumeTopActivityInnerLocked
方法进行一系列的栈状态的判断,最终又回调了ActivityStackSupervisor的startSpecificActivityLocked
方法。startSpecificActivityLocked
方法中先是获取了即将启动的Activity所在的应用程序进程(就是在这个地方判断应用所在进程是否存在且已启动,如果没有启动,就需要启动应用程序进程),然后调用realStartActivityLocked
方法。realStartActivityLocked
方法中,对启动的应用程序进程进行一系列的判断和处理,最终会调用IBinder类型的ApplicationThread引用IApplicationThread
,通过传入IApplicationThread
建立ClientTransaction
,加入执行LaunchActivityItem
任务,最终实现跨进程执行调用ActivityThread的handleLaunchActivity
方法。handleLaunchActivity
方法中,会先调用其performLaunchActivity
方法,之后调用handleResumeActivity
,将Activity的状态置为Resume。createBaseContextForActivity
方法,创建要启动Activity的上下文;newActivity
方法来创建Activity实例;makeApplication
方法,创建应用程序的Application;attach
方法初始化Activity,创建Window对象并与Activity自身进行关联。callActivityOnCreate
方法来启动Activity。callActivityOnCreate
方法中,会调用Activity的performCreate
方法,最终会调用Activity的onCreate
方法,这样应用程序也就启动了。应用程序启动的过程中,主要涉及了Launcher进程、SystemServer进程、Zygote进程和应用程序进程这四个进程,它们之间的关系如下。
有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。