zygoteinit.java_源码跟踪之启动流程:从ZygoteInit到onCreate

本文详细分析了Android系统启动过程中ZygoteInit.java的执行流程,从ZygoteInit的main方法开始,涵盖SystemServer启动、ActivityManagerService的初始化、Activity启动流程等关键步骤,直至Activity的onCreate方法。通过源码跟踪,揭示了Activity启动的内部机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Instrumentation

SDK版本名称: Pie

API Level: 28

一、源码调用时序图

1. Activity的启动流程

说明:其中ActivityThread中执行的scheduleTransaction方法在其父类ClientTransactionHandler中,发送了ActivityThread.H.EXECUTE_TRANSACTION,ActivityThread接收后执行了LaunchActivityItem#execute()

785cdb5736d1

Activity的启动流程.jpg

2.ActivityManagerService的启动流程

说明:其中RunnableInit通过类名反射了main方法,封装成Runnable返回,最终在ZygoteInit#main中执行run()。

785cdb5736d1

ActivityManagerService的启动流程.jpg

3.ActivityThread的启动流程

说明:图中省略了ZygoteConnection获取MethodAndArgsCaller的步骤,其步骤可参加ActivityManagerService的启动流程,也是经过WrapperInit拿到的。

785cdb5736d1

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源代码文件。

跟踪记录的意义在于,在需要研究流程中某个环节细节问题时

这是什么问题FATAL EXCEPTION: main Process: com.example.lightcontrol_app2, PID: 4533 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.lightcontrol_app2/com.example.lightcontrol_app2.ui.control.activity.EditingSingleLampActivity}: java.lang.RuntimeException: setOnItemClickListener cannot be used with a spinner. at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2668) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2729) at android.app.ActivityThread.-wrap12(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1480) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6176) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:893) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:783) Caused by: java.lang.RuntimeException: setOnItemClickListener cannot be used with a spinner. at android.widget.Spinner.setOnItemClickListener(Spinner.java:571) at com.example.lightcontrol_app2.ui.control.activity.EditingSingleLampActivity.init(EditingSingleLampActivity.java:111) at com.example.lightcontrol_app2.ui.control.activity.EditingSingleLampActivity.onCreate(EditingSingleLampActivity.java:65) at android.app.Activity.performCreate(Activity.java:6692) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2621) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2729) at android.app.ActivityThread.-wrap12(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1480) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6176) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:893) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:783)
06-11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值