一、核心启动流程概览
[应用进程] → [ActivityTaskManagerService] → [ActivityStarter] → [ActivityStackSupervisor] → [Process] → [Zygote] → [目标应用进程] → [ActivityThread] 流程图:
二、源码深度解析(基于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