前期系列:
Zygote进程启动分析
SystemServer启动分析
AMS启动分析
Launcher启动流程图

代码追踪
AMS系统ready方法中开始启动HomeActivity
ActivityManagerService.java
- 获取和生成HomeActivity的Intent信息,并析构出ActivityInfo
- 调用ActivityStarter的startHomeActivityLocked方法
1 | public void systemReady(final Runnable goingCallback) { |
Activity启动前检查及任务栈管理等
ActivityStarter.java
- startHomeActivityLocked,将HomeStack移至顶部(第一次为空)
- startActivityLocked,调用startActivity,并重新记录lastStartActivityResult
- startActivity,参数校验、权限检查等,构建ActivityRecord等
- startActivityUnchecked,涉及启动模式和位运算,以及调用ActivityStack的startActivityLocked来处理回退栈
1 | void startHomeActivityLocked(Intent intent, ActivityInfo aInfo, String reason) { |
ActivityStackSupervisor.java
- resumeFocusedStackTopActivityLocked,
- resumeTopActivityInnerLocked,
- resumeTopActivityInnerLocked, 暂停栈内所有Activity,继续调用
- startSpecificActivityLocked, 查找ActivityRecord对应进程,存在则realStartActivityLocked,这里是第一次启动,不存在进程,调用AMS.startProcessLocked
1 | boolean resumeFocusedStackTopActivityLocked( |
AMS开启进程启动
ActivityManagerService.java
startProcessLocked, 进程的维护和清理等工作,然后调用重载方法
startProcessLocked, 该方法里主要干了三件事:
- 设置了各种debug参数,若AndroidManifest.xml将android:debuggable设置为true,这些参数就会生效。
- 通过Process.start()开启一个新进程,实际上是通过Socket与Zygote通信,使用Zygote fork新进 程,同时将ActivityThread类加入到新进程,并调用ActivityThread.main()。
- 发送一条延时消息,若新创建的进程在消息接收前未与AMS交互,则进程启动失败
1 | final ProcessRecord startProcessLocked(String processName, |
1 | private final void startProcessLocked(ProcessRecord app, String hostingType, String hostingNameStr, String abiOverride, String entryPoint, String[] entryPointArgs) { |
进程fork
Process.start
参考:Android系统—进程创建流程分析
ActivityThread.main方法
- Looper.prepareMainLooper
- attach AMS
- Looper.loop
1 | public static void main(String[] args) { |
AMS 绑定Application
ActivityManagerService.java
- attachApplication, 获取当前调用pid,调用重载方法
- attachApplication
- 重置ProcessRecord信息
- 将进程的ApplicationThread绑定到AMS,初始化Application
- 最后执行到 ASS.attachApplicationLocked方法进行Activity的启动
1 | public final void attachApplication(IApplicationThread thread) { |
ActivityThread.ApplicationThread处理Application绑定
ActivityThread.ApplicationThread
- bindApplication,构造AppBindData,发送bind消息
- handleBindApplication
- 进程、系统配置等初始化设置
- 构建Instrumentation、Application等app对象
- 调用Application.onCreate 生命周期方法
1 | public final void bindApplication(/*省略参数*/){ |
执行ASS的attachApplication
ActivityStackSupervisor.java
- attachApplicationLocked,找到对应ActivityRecord等
- realStartActivityLocked,更新进程信息,获取发送启动Activity参数,最后调用ActivityThread中的ApplicationThread执行 scheduleLaunchActivity 方法
1 | boolean attachApplicationLocked(ProcessRecord app) throws RemoteException { |
ActivityThread 执行Activity启动
- ActivityThread.Application.scheduleLaunchActivity,构建ActivityClientRecord,发送H.LAUNCH_ACTIVITY消息
- ActivityThread.handleLaunchActivity,执行Activity启动后的生命周期方法
- performLaunchActivity,主要是调用Activity的onCreate(),onStart(),onRestoreInstance(),onPostCreate()生命周期
- handleResumeActivity(),回调Activity的onResume()方法,并将DecorView添加到WindowManager中,这里的WindowManager是a.getWindowManager()得到的,其实现是WindowManagerImpl,这步操作在onResume()方法之后执行。
1 | public final void scheduleLaunchActivity(...) { |
1 | private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) { |
1 | final void handleResumeActivity(IBinder token, |
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment


