Instrumentation
SDK版本名称: Pie
API Level: 28
一、源码调用时序图
1. Activity的启动流程
说明:其中ActivityThread中执行的scheduleTransaction方法在其父类ClientTransactionHandler中,发送了ActivityThread.H.EXECUTE_TRANSACTION,ActivityThread接收后执行了LaunchActivityItem#execute()
Activity的启动流程.jpg
2.ActivityManagerService的启动流程
说明:其中RunnableInit通过类名反射了main方法,封装成Runnable返回,最终在ZygoteInit#main中执行run()。
ActivityManagerService的启动流程.jpg
3.ActivityThread的启动流程
说明:图中省略了ZygoteConnection获取MethodAndArgsCaller的步骤,其步骤可参加ActivityManagerService的启动流程,也是经过WrapperInit拿到的。
ActivityThread的启动流程 .jpg
二、流程总结
ZygoteInit#main方法中启动一个SystemServer和一个ZygoteServer。
SystemServer中通过SystemServiceManager执行onStart()的方式启动了ActivityManagerService,使用ServiceManager对其进行持久化管理。
ZygoteServer中启动了一个名为“zygote”的LocalSocket类型的socket服务。使用死循环去处理socket链接。
应用没有启动时,从Launcher进入应用,Activity中的startActivity()方法最终调用了ActivityManagerService#startProcessLocked。
这个方法中将ActivityThread的类名参数通过socket链接到ZygoteInit中启动的ZygoteServer。
ZygoteServer死循环中得到参数后,通过ZygoteConnection#processOneCommand返回一个MethodAndArgsCaller类型的Runnable,在ZygoteInit#main中执行。
(26版本会在ZygoteInit#main方法中捕获MethodAndArgsCaller类型的异常,然后捕获执行。两种写法的目的都是为了清除方法调用的堆栈信息)
ActivityThread#main方法中调用其attach方法,将创建好的ApplicationThread传给ActivityManagerService#,AMS保留参数给ProcessRecord后续使用。
应用已经启动时,Activity中的startActivity()方法调用了ActivityManagerService#startActivityAsUser,执行ActivityStarter#execute
这个方法最终调用ActivityStackSupervisor#realStartActivityLocked,以ActivityThread.mAppThread为参数创建LaunchActivityItem。然后执行AcitivityThread#scheduleTransaction方法,发送ActivityThread.H.EXECUTE_TRANSACTION。
ActivityThread接收到消息后执行LaunchActivityItem#execute,调用ActivityThread#handleLaunchActivity,最终调用ActivityThread#performLaunchActivity。
performLaunchActivity()方法通过Instrumentation#newActivity得到要启动的Activity,然后调用其attach()方法。
而后,会调用Instrumentation#callActivityOnCreate,最终调用到Activity#onCreate
三、相关文章:
四、流程记录
代码跟踪记录,只保留了关键代码,其余代码用...替代。
java类名可点击,将跳转到Android社区的sdk源代码文件。
跟踪记录的意义在于,在需要研究流程中某个环节细节问题时