Android随笔-APP首次启动流程

发布时间:2026/7/5 3:20:26
Android随笔-APP首次启动流程 从用户点击应用图标到 Activity 执行 onCreate() 的完整流程涉及Launcher 进程 → SystemServer 进程 → Zygote 进程 → 应用进程之间的多轮跨进程通信。以下是详细拆解一、核心通信方式概览通信双方IPC 方式作用Launcher → AMS/ATMSBinder IPC发送启动 Activity 的请求AMS → ZygoteSocket请求 fork 创建新应用进程AMS → 应用进程Binder IPC通过 ApplicationThread 代理回调应用进程应用进程 → AMSBinder IPC应用进程向 AMS 注册自身注Android 10 中 AMS 的 Activity 管理职责已拆分至 ActivityTaskManagerService (ATMS)但核心逻辑不变。以下以 AMS 代指系统侧服务 。二、详细流程阶段 1Launcher 发起启动请求Binder IPC用户点击桌面图标时Launcher 进程本质也是一个普通应用执行以下调用链// Launcher 点击图标Launcher.onClick()→startActivity(intent)→Instrumentation.execStartActivity()→ActivityManager.getService().startActivity()// 跨进程 Binder 调用ActivityManager.getService() 返回的是 AMS 的 Binder 代理对象IActivityManager 接口的代理通过 Binder 驱动 将请求发送到 SystemServer 进程中的 AMS传递的 Intent 包含目标组件信息component com.example.app/.MainActivity阶段 2AMS 处理启动请求SystemServer 进程AMS收到请求后执行以下关键步骤权限校验— 检查调用方是否有启动权限创建 ActivityRecord— 在 AMS 内部为本次启动创建对应的 ActivityRecord 对象记录 Activity 状态检查进程状态— 通过 ProcessRecord 查询目标应用进程是否存在若进程已存在 → 直接走 realStartActivityLocked() 启动 Activity若进程不存在 → 进入进程创建流程阶段 3AMS 请求 Zygote 创建新进程Socket当 AMS 发现目标进程不存在时AMS.startProcessLocked()→Process.start()→ZygoteProcess.startViaZygote()→ 通过Socket连接Zygote进程发送 fork 参数为什么用 Socket 而非 BinderZygote 进程在启动时初始化并预加载了大量类和资源需要保持干净状态如果使用 BinderZygote 需注册到 ServiceManager会引入额外依赖Socket 通信更简单、开销更小且 fork 后子进程无需继承 Binder 线程池的复杂状态Zygote 收到请求后调用 fork() 创建子进程子进程继承了预加载的环境然后反射调用 ActivityThread.main() 作为应用进程入口阶段 4应用进程初始化ActivityThread.main新创建的应用进程执行 ActivityThread.main()publicstaticvoidmain(String[]args){// 1. 初始化主线程 LooperLooper.prepareMainLooper();// 2. 创建 ActivityThread 实例ActivityThreadthreadnewActivityThread();thread.attach(false);// 关键向 AMS 注册// 3. 创建 ApplicationThreadBinder 服务端// 4. 进入消息循环等待 AMS 指令Looper.loop();}ActivityThread 是应用进程的主线程管理类每个应用进程只有一个实例ApplicationThread 是 ActivityThread 的内部类继承 IApplicationThread.Stub作为应用进程向 AMS 暴露的 Binder 服务端接口thread.attach(false) 通过 Binder 调用 AMS 的 attachApplication() 方法将ApplicationThread 的 Binder 代理注册到 AMS 下阶段 5AMS 回调应用进程创建 ApplicationBinder IPCAMS 收到 attachApplication() 后通过 ApplicationThread 的代理回调应用进程AMS.attachApplicationLocked()→ApplicationThreadProxy.bindApplication()// Binder 跨进程调用→ 应用进程ApplicationThread.bindApplication()→sendMessage(H.BIND_APPLICATION,data)// 向主线程 Handler 发消息→ActivityThread.handleBindApplication()handleBindApplication() 的核心逻辑privatevoidhandleBindApplication(AppBindDatadata){// 1. 创建 LoadedApk代表已加载的 APK// 2. 创建 ContextImpl应用级 Context// 3. 反射创建 Instrumentation// 4. 创建 Application 实例Applicationappdata.info.makeApplication(false,mInstrumentation);// 5. 调用 Application.attachBaseContext() — 最早的应用入口app.attach(context);// 内部调用 attachBaseContext()// 6. 安装 ContentProviders比 onCreate 更早installContentProviders(app,data.providers);// 7. 调用 Application.onCreate()mInstrumentation.callApplicationOnCreate(app);}关键顺序attachBaseContext() → ContentProvider.onCreate() → Application.onCreate()阶段 6AMS 请求启动 ActivityBinder IPCApplication 初始化完成后AMS 再次通过 ApplicationThread 代理发送启动 Activity 的请求AMS.realStartActivityLocked()→ClientTransaction.schedule()→ApplicationThreadProxy.scheduleLaunchActivity()// Binder 跨进程→ 应用进程ApplicationThread.scheduleLaunchActivity()→sendMessage(H.LAUNCH_ACTIVITY,r)// 向主线程发消息→ActivityThread.handleLaunchActivity()阶段 7应用进程创建 Activity 并执行 onCreate()handleLaunchActivity() 调用 performLaunchActivity() 完成 Activity 创建privateActivityperformLaunchActivity(ActivityClientRecordr,IntentcustomIntent){// 1. 创建 Activity 的 ContextContextImplappContextcreateBaseContextForActivity(r);// 2. 反射创建 Activity 实例ActivityactivitymInstrumentation.newActivity(cl,component.getClassName(),r.intent);// 3. 获取 Application 实例Applicationappr.packageInfo.makeApplication(false,mInstrumentation);// 4. 调用 Activity.attach() — 创建 PhoneWindow、绑定 WindowManageractivity.attach(appContext,this,getInstrumentation(),r.token,r.ident,app,r.intent,r.activityInfo,title,r.parent,...);// 5. 调用 Activity.onCreate()if(r.isPersistable()){mInstrumentation.callActivityOnCreate(activity,r.state,r.persistentState);}else{mInstrumentation.callActivityOnCreate(activity,r.state);}// 6. 设置 Activity 状态为 ON_CREATEr.setState(ON_CREATE);}Activity.attach() 内部关键操作调用 attachBaseContext(context) — 绑定 Context创建 PhoneWindow — 这是 Activity 的窗口实现创建 WindowManager — 与系统窗口管理服务绑定初始化 FragmentController 等内部组件Instrumentation.callActivityOnCreate() 最终调用publicvoidcallActivityOnCreate(Activityactivity,Bundleicicle){activity.performCreate(icicle);// 内部调用 activity.onCreate(icicle)}三、关键类与角色总结类/组件所属进程角色LauncherLauncher 进程桌面应用接收点击事件发起启动请求ActivityManagerService (AMS)SystemServer管理系统所有 Activity 的生命周期和进程ActivityTaskManagerService (ATMS)SystemServerAndroid 10 负责 Activity 栈管理从 AMS 拆分ZygoteZygote 进程所有应用进程的父进程通过 fork 快速创建新进程ActivityThread应用进程应用主线程管理类入口为main()ApplicationThread应用进程应用进程暴露给 AMS 的 Binder 服务端IApplicationThread接口定义AMS 调用应用进程的 Binder 接口Instrumentation应用进程应用进程的管家封装 Activity/Application 的创建和生命周期调用ActivityRecordAMS 内部AMS 中代表一个 Activity 实例的管理对象ProcessRecordAMS 内部AMS 中记录进程状态信息的对象四、总结点击图标后Launcher 通过 Binder 请求 AMS → AMS 通过 Socket 让 Zygote fork 进程 →新进程通过 Binder 向 AMS 注册 → AMS 通过 Binder 回调应用进程创建 Application → 再回调创建Activity 并执行 onCreate()。整个过程经历了 2 次 Binder 往返 1 次 Socket 通信 多次 Handler 消息调度。