基于Android 15的StartActivity 原理与源码深度解析

124 阅读3分钟

一、核心启动流程概览

[应用进程] → [ActivityTaskManagerService] → [ActivityStarter] → [ActivityStackSupervisor] → [Process] → [Zygote] → [目标应用进程] → [ActivityThread] 流程图:

deepseek_mermaid_20250812_8ecda3.png

二、源码深度解析(基于Android 15)

1. 客户端发起请求 (Activity.java)

// Activity.java
public void startActivity(Intent intent) {
    startActivity(intent, null);
}

public void startActivity(Intent intent, @Nullable Bundle options) {
    // 关键调用链
    mInstrumentation.execStartActivity(
        this, mMainThread.getApplicationThread(), mToken, this,
        intent, -1, options);
}

2. Instrumentation 处理 (Instrumentation.java)

// Instrumentation.java
public ActivityResult execStartActivity(
    Context who, IBinder contextThread, IBinder token, Activity target,
    Intent intent, int requestCode, Bundle options) {
    
    // 获取ActivityTaskManager服务代理
    IActivityTaskManager atm = ActivityTaskManager.getService();
    
    // 跨进程调用ATMS
    int result = atm.startActivity(whoThread, who.getOpPackageName(),
            intent, intent.resolveTypeIfNeeded(who.getContentResolver()),
            token, resultTo != null ? resultTo.mEmbeddedID : null,
            requestCode, 0, null, options);
    
    checkStartActivityResult(result, intent);
}

3. ActivityTaskManagerService 处理 (ActivityTaskManagerService.java)

// ActivityTaskManagerService.java
public final int startActivity(IApplicationThread caller, String callingPackage,
        Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
        int startFlags, ProfilerInfo profilerInfo, Bundle bOptions) {
    
    return startActivityAsUser(caller, callingPackage, intent, resolvedType, resultTo,
            resultWho, requestCode, startFlags, profilerInfo, bOptions,
            UserHandle.getCallingUserId());
}

private int startActivityAsUser(...) {
    // 创建ActivityStarter实例
    final ActivityStarter starter = new ActivityStarter(...);
    
    // 执行启动逻辑
    return starter.execute();
}

4. ActivityStarter 执行启动 (ActivityStarter.java)

// ActivityStarter.java
int execute() {
    try {
        // 步骤1:解析Intent和ActivityInfo
        final ActivityRecord r = new ActivityRecord(...);
        
        // 步骤2:权限检查
        if (!checkStartAnyActivityPermission(...)) {
            return START_PERMISSION_DENIED;
        }
        
        // 步骤3:处理启动模式(singleTask/singleTop等)
        final int launchMode = r.launchMode;
        if (launchMode == LAUNCH_SINGLE_INSTANCE) {
            // 特殊模式处理
        }
        
        // 步骤4:任务栈管理
        targetStack = computeStackFocus(r, launchMode);
        
        // 步骤5:启动目标Activity
        return startActivityUnchecked(r, sourceRecord, ...);
    }
}

5. 进程管理 (ProcessList.java)

当目标应用未启动时:

// ProcessList.java
final ProcessRecord startProcessLocked(...) {
    // 创建新进程
    final ProcessRecord app = newProcessRecordLocked(...);
    
    // 通过Zygote fork新进程
    startProcessLocked(app, hostingType, hostingNameStr);
    
    return app;
}

private boolean startProcessLocked(...) {
    // 关键调用:通过Zygote创建进程
    Process.ProcessStartResult startResult = Process.start(entryPoint,
            app.processName, uid, ...);
}

6. 目标应用初始化 (ActivityThread.java)

// ActivityThread.java
public static void main(String[] args) {
    // 初始化主线程
    Looper.prepareMainLooper();
    
    // 创建ActivityThread实例
    ActivityThread thread = new ActivityThread();
    
    // 绑定到系统服务
    thread.attach(false);
    
    // 启动消息循环
    Looper.loop();
}

private void attach(boolean system) {
    // 获取ATMS代理
    final IActivityTaskManager atm = ActivityTaskManager.getService();
    
    // 注册应用进程
    atm.attachApplication(mAppThread);
}

7. Activity 实例化与生命周期

// ActivityThread.java
public void handleLaunchActivity(ActivityClientRecord r, ...) {
    // 创建Activity实例
    Activity activity = performLaunchActivity(r, customIntent);
    
    // 回调生命周期
    handleResumeActivity(r.token, false, ...);
}

private Activity performLaunchActivity(...) {
    // 反射创建Activity实例
    java.lang.ClassLoader cl = appContext.getClassLoader();
    activity = mInstrumentation.newActivity(cl, component.getClassName(), r.intent);
    
    // 调用attach()
    activity.attach(appContext, ...);
    
    // 调用onCreate()
    mInstrumentation.callActivityOnCreate(activity, r.state);
    
    return activity;
}

三、Android 15 关键改进

1. 性能优化

  • 并行启动优化:使用新的ConcurrentActivityStarter
  • 预加载改进:通过ActivityPreStarter提前加载资源
  • 冷启动加速:改进的类加载机制(Dex优化)

2. 安全增强

  • 强化权限检查
// ActivityStarter.java
if (!mService.mPermissionManager.checkStartAnyActivity(...)) {
    return START_ABORTED;
}

  • Intent过滤器验证:加强IntentFilter匹配的严格性
  • 受限组件保护:对exported组件的更严格处理

3. 多窗口改进

  • 自适应布局:改进的ActivityOptions处理
// Android 15新增
options.setLaunchWindowingMode(WINDOWING_MODE_FREEFORM);
  • 画中画增强:更平滑的过渡动画
  • 分屏状态保存:改进的onMultiWindowModeChanged回调

四、启动模式处理机制

1. 特殊启动模式实现

// ActivityStarter.java
private int startActivityUnchecked(...) {
    switch (launchMode) {
        case LAUNCH_SINGLE_TOP:
            // 检查栈顶Activity
            if (top != null && top.realActivity.equals(r.realActivity)) {
                // 复用现有实例
                deliverNewIntent(top);
                return START_DELIVERED_TO_TOP;
            }
            break;
            
        case LAUNCH_SINGLE_TASK:
            // 查找任务栈中已有实例
            ActivityRecord taskTop = findTaskLocked(r);
            if (taskTop != null) {
                // 带到前台并清除顶部
                moveTaskToFrontLocked(taskTop.task, ...);
                return START_TASK_TO_FRONT;
            }
            break;
    }
}

2. 任务栈管理

// ActivityStackSupervisor.java
ActivityStack getLaunchStack(...) {
    // Android 15新增:多显示器支持
    if (displayId != DEFAULT_DISPLAY) {
        return getStack(displayId, ...);
    }
    
    // 根据启动标志选择栈
    if ((launchFlags & FLAG_ACTIVITY_NEW_TASK) != 0) {
        return createStackOnDisplay(...);
    }
    
    return getFocusedStack();
}

五、性能优化技巧

1. 启动加速建议

// 使用冷启动优化API(Android 15+)
override fun onCreate(savedInstanceState: Bundle?) {
    // 启用预绘制
    window.setPreDrawStartupView(true)
    
    // 异步加载资源
    lifecycleScope.launch {
        loadHeavyResources()
    }
}

六、调试技巧

1. 启动时间分析

# 使用新版的systrace
python systrace.py -a com.example.app --start -o trace.html

2. 日志过滤

# 查看Activity启动日志
adb logcat -s ActivityTaskManager:I ActivityManager:I