0%

Android App启动流程

Android系统启动流程是怎样的?

当按电源键触发开机,首先会从 ROM 中预定义的地方加载引导程序 BootLoader 到 RAM 中,并执行 BootLoader 程序启动 Linux Kernel, 然后启动用户级别的第一个进程: init 进程。

init 进程会解析 init.rc 脚本做一些初始化工作,包括挂载文件系统、创建工作目录以及启动系统服务进程等,其中系统服务进程包括 Zygote、service manager、media 等。

在 Zygote 中会进一步去启动 system_server 进程,然后在 system_server 进程中会启动 AMS、WMS、PMS 等服务,等这些服务启动之后,AMS 中就会打开 Launcher 应用的 home Activity,最终就看到了手机的 “桌面”。

init.rc中引入了Zygote的启动脚本,Zygote的启动脚本存放在system/core/rootdir目录中,zygote的启动脚本其实也就是用app_process来启动一个java程序。

SystemServer什么时候被启动?

android 29源码启动SystemServer流程:

init进程解析init.rc脚本

init.rc脚本中有执行app_process程序的代码。

service zygote /system/bin/app_process32 -Xzygote /system/bin –zygote –start-system-server –socket-name=zygote

app_process是启动java程序用的,没有指定要运行的类名,还是会走app_process的main方法,源码如下:

https://android.googlesource.com/platform/frameworks/base/+/android-8.0.0_r4/cmds/app_process/app_main.cpp

main方法中识别到–zygote参数会执行com.android.internal.os.ZygoteInit的Java类的main方法。

识别到–start-system-server的参数,会执行forkSystemServer方法启动系统服务进程。

得到系统服务进程的pid后,执行ZygoteInit的handleSystemServerProcess() ->ZygoteInit.zygoteInit() -> RuntimeInit.applicationInit() -> findStaticMain(),最后得到MethodAndArgsCaller,是一个Runnable,返回给ZygoteInit的main()中调用forkSystemServer()的地方执行run()。

MethodAndArgsCaller的run()里通过反射按照给定参数执行给定的方法,方法是main,是哪个类的main方法?类名是在ZygoteInit的forkSystemServer()指定的,类名是com.android.server.SystemServer。

Launcher中点击App图标后,App启动流程是怎样的?

以下时序图基于Android 9.0源码。

Launcher向AMS发起startActivity请求

点击桌面App图标,Launcher进程采用Binder IPC向system_server进程的ActivityManagerService发起startActivity请求。

zygote进程创建App进程

system_server进程的AMS接收到请求后,向zygote进程发送创建进程的请求

Zygote进程fork出新的子进程

即App进程。

App进程运行ActivityThread.main()

App进程跨进程绑定ApplicationThread给系统进程的AMS

AMS做好准备工作后,让App进程创建Application实例,并调用Application的onCreate()。

为什么要绑定ApplicationThread给AMS?

ActivityThread.attach()里调用IActivityManager.attachApplication()会把当前ActivityThread实例里的ApplicationThread实例对象传递给AMS,AMS把App进程的ApplicationThread存在ProcessRecord的thread属性中

ApplicationThread是什么?

ApplicationThread是一个IBinder对象,是给system_server进程中的AMS要发送数据给App进程时用的,这属于跨进程通信。

AMS保存了App进程的ApplicationThread后,经过一系列准备,最终调用App进程ActivityThread的handleBindApplication(),这里会调用mInstrumentation.callApplicationOnCreate()

AMS发送启动Activity的请求

在ActivityManagerService的attachApplication方法中调用了attachApplicationLocked进行绑定,从上面代码可以发现attachApplicationLocked中有两个重要的方法:thread.bindApplication和mStackSupervisor.attachApplicationLocked(app)。thread.bindApplication中的thread其实就是ActivityThread里ApplicationThread对象在AMS的代理对象,故此方法将最终调用ApplicationThread的bindApplication方法。而mStackSupervisor.attachApplicationLocked(app)主要是AMS启动Activity的作用。

在realStartActivityLocked方法中,创建了ClientTransaction对象并将App进程的ApplicationThread传递进去,接着为ClientTransaction对象添加LaunchActivityItem的callback,最终调用ClientLifecycleManager.scheduleTransaction()启动activity。

ClientLifecycleManager.scheduleTransaction()内部调用了App进程的ApplicationThread的scheduleTransaction(ClientTransaction),该方法实际调用了ActivityThread的scheduleTransaction(ClientTransaction)

ClientTransactionHandler是ActivityThread的父类,所以下面时序图的ClientTransactionHandler代表ActivityThread,H是ActivityThread内部的Handler

ActivityThread的scheduleTransaction(ClientTransaction)向ActivityThread的Handler发送EXECUTE_TRANSACTION的消息,处理Activity的启动。

ActivityThread的Handler处理启动Activity的请求

ActivityThread的Handler对EXECUTE_TRANSACTION的消息处理主要是执行TransactionExecutor.execute(ClientTransaction)

TransactionExecutor.execute(ClientTransaction)主要是执行

executeCallbacks(transaction)

executeLifecycleState(transaction)

executeCallbacks()中会取出ClientTransaction的callbacks,对callbacks列表的每一项item执行execute(),callbacks每一项的类型为ClientTransactionItem

ClientTransaction的callbacks在哪添加的?

AMS的ActivityStackSupervisor的realStartActivityLocked()中添加的LaunchActivityItem。

LaunchActivityItem的execute()中会调用ActivityThread的。handleLaunchActivity(),然后调用performLaunchActivity(),在这里通过Instrumentation.newActivity()创建Activity实例,然后调用Activity的onCreate()。

executeLifecycleState()做了什么?

获取ClientTransaction的getLifecycleStateRequest(),做Activity生命周期的回调。

Activity的onStart()、onResume()是在这里触发的。

具体看源码。

ClientTransaction的mLifecycleStateRequest是在哪设置的?

AMS的ActivityStackSupervisor的realStartActivityLocked()中创建了ResumeActivityItem,通过clientTransaction.setLifecycleStateRequest(lifecycleItem)设置添加。