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方法,源码如下:
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)设置添加。