Android13 Activity启动流程深度解析:从进程间通信到窗口树构建
1. Android13 Activity启动流程概述Activity启动是Android应用开发中最基础也最核心的机制之一。在Android 13中这个流程涉及多个系统进程的协作主要包括应用进程发起Activity启动请求SystemServer进程通过ActivityTaskManagerService(ATMS)协调启动过程Zygote进程孵化新应用进程WindowManagerService管理窗口和显示层级整个启动流程可以概括为7个关键步骤应用进程通过Binder调用ATMS发起startActivity请求ATMS检查目标Activity的进程是否存在若进程不存在通过Zygote fork新进程新进程初始化后向ATMS注册ATMS通过Binder通知新进程创建目标Activity应用进程的主线程完成Activity实例化WindowManager构建窗口树并显示Activity2. 进程间通信机制2.1 Binder通信框架Android使用Binder实现跨进程通信Activity启动流程中涉及的主要Binder接口// 客户端接口 public interface IActivityTaskManager { int startActivity(IApplicationThread caller, String callingPackage, Intent intent, ...); } // 服务端实现 public class ActivityTaskManagerService extends IActivityTaskManager.Stub { // 实现Binder接口方法 }关键通信过程应用进程通过ActivityTaskManager.getService()获取ATMS的Binder代理调用startActivity()方法发起请求ATMS处理请求后通过IApplicationThread回调应用进程2.2 数据传输对象跨进程传递的主要数据结构ActivityRecord系统服务端维护的Activity描述ActivityClientRecord客户端维护的Activity描述TaskActivity任务栈的抽象WindowContainer窗口容器基类3. 窗口管理系统3.1 窗口树结构Android 13的窗口管理系统采用树形结构组织RootWindowContainer ├── DisplayContent (物理显示屏) │ ├── TaskDisplayArea (应用窗口区域) │ │ ├── Task (任务栈) │ │ │ ├── ActivityRecord │ │ │ │ └── WindowState │ │ └── ImeContainer (输入法窗口) └── Tokens (特殊类型窗口)3.2 关键类解析RootWindowContainer窗口树的根节点DisplayContent对应物理显示屏支持多屏显示Task管理一组相关的Activity维护回退栈ActivityRecord系统服务端对Activity的抽象WindowState对应一个具体的窗口4. 启动流程详细解析4.1 发起启动请求应用进程调用流程// Activity.java public void startActivity(Intent intent) { getInstrumentation().execStartActivity( this, mMainThread.getApplicationThread(), mToken, intent); } // Instrumentation.java public ActivityResult execStartActivity(...) { int result ActivityTaskManager.getService() .startActivity(whoThread, callingPackage, intent, ...); checkStartActivityResult(result, intent); }4.2 SystemServer处理流程ATMS核心处理逻辑// ActivityTaskManagerService.java public int startActivity(IApplicationThread caller, ...) { // 1. 创建ActivityRecord final ActivityRecord r new ActivityRecord(...); // 2. 获取或创建目标Task final Task targetTask computeTargetTask(); // 3. 启动目标进程(如果需要) startProcessAsync(...); // 4. 调度Activity启动 mStackSupervisor.realStartActivityLocked(r, ...); }4.3 进程创建过程Zygote进程孵化新进程ATMS通过Socket连接ZygoteZygote fork出新进程新进程执行ActivityThread.main()初始化应用环境并绑定到ATMS4.4 Activity实例化客户端创建Activity的流程// ActivityThread.java private Activity performLaunchActivity(ActivityClientRecord r) { // 1. 创建Activity实例 Activity activity mInstrumentation.newActivity( cl, component.getClassName(), r.intent); // 2. 创建Application(如果不存在) Application app r.packageInfo.makeApplication(false, null); // 3. 关联Context和Window activity.attach(appContext, this, getInstrumentation(), r.token, ...); // 4. 回调onCreate() mInstrumentation.callActivityOnCreate(activity, r.state); return activity; }5. 窗口构建与显示5.1 窗口创建流程// Activity.java final void attach(Context context, ...) { // 创建PhoneWindow实例 mWindow new PhoneWindow(this, window, ...); mWindow.setWindowManager(...); } // PhoneWindow.java public void setContentView(View view) { installDecor(); mLayoutInflater.inflate(layoutResID, mContentParent); }5.2 窗口添加到WM// ActivityThread.java public void handleResumeActivity(IBinder token, ...) { // 1. 回调onResume() final ActivityClientRecord r performResumeActivity(token, ...); // 2. 获取WindowManager View decor r.window.getDecorView(); WindowManager.LayoutParams l r.window.getAttributes(); // 3. 添加窗口到WMS wm.addView(decor, l); }6. 性能优化实践6.1 启动耗时分析关键耗时阶段进程创建约100-300msApplication初始化依赖业务逻辑Activity创建约50-150ms首帧绘制依赖布局复杂度6.2 优化建议避免冷启动使用预加载进程合理设置android:process简化Application延迟初始化非必要组件使用App Startup库优化布局减少布局层级使用ViewStub延迟加载多线程初始化// 使用IntentService或线程池初始化 AsyncTask.THREAD_POOL_EXECUTOR.execute(() - { // 后台初始化代码 });7. 常见问题排查7.1 启动白屏问题解决方案!-- styles.xml -- style nameAppTheme.Launcher item nameandroid:windowBackgrounddrawable/launch_background/item item nameandroid:windowFullscreentrue/item /style7.2 跨进程启动失败检查要点AndroidManifest中是否声明Activity是否满足exported要求进程权限是否配置正确跨用户启动需要特殊权限7.3 窗口层级问题调试命令adb shell dumpsys window windows输出示例Window #7: Window{xxx u0 com.example.app/...} mOwnerUid10123 mShowToOwnerOnlytrue mAttrsWM.LayoutParams{(0,0)(fillxfill) sim#20 ty1 fl#1820002 pfl0x20000}