文章目录
前言
AMS 是 Android 的核心服务,负责管理应用生命周期、进程调度、任务栈、Activity 启动与切换等功能。为了全面剖析 AMS 的工作机制,本文从启动过程、核心组件、源码分析、常见问题及优化等角度展开。
一、AMS 的启动入口:SystemServer
SystemServer 是 Android 系统启动的核心类,负责启动各种系统服务,包括 AMS。
1.1 SystemServer 的初始化
SystemServer 启动发生在 Zygote 启动后。Zygote 是 Android 的进程孵化器,创建了 SystemServer 进程。SystemServer 启动后会调用其主方法 run()。
源码路径: frameworks/base/services/java/com/android/server/SystemServer.java
public class SystemServer {
public static void main(String[] args) {
// 创建 SystemServer 实例并调用其 run 方法
new SystemServer().run();
}
private void run() {
// 初始化服务启动环境
init();
// 启动系统核心服务
startBootstrapServices();
startCoreServices();
startOtherServices();
}
}
run() 方法中的关键步骤:
- init():初始化运行环境。
- startBootstrapServices():启动引导服务,包括 AMS。
- startCoreServices() 和 startOtherServices():启动其他系统服务。
1.2 AMS 的初始化:startBootstrapServices
在 startBootstrapServices() 中,AMS 的启动被显式调用。
源码路径: frameworks/base/services/java/com/android/server/SystemServer.java
关键代码:
private void startBootstrapServices() {
traceBeginAndSlog("StartActivityManager");
mActivityManagerService = ActivityManagerService.Lifecycle.startService(
ActivityManagerService.class);
traceEnd();
...
}
- traceBeginAndSlog 和 traceEnd:性能监控和日志记录,表明 AMS 启动时间点。
- ActivityManagerService.Lifecycle.startService:AMS 的实际初始化。
1.3. ActivityManagerService 的创建与注册
1.3.1 ActivityManagerService 的创建
ActivityManagerService 是一个 SystemService 子类,生命周期由 Lifecycle 内部类管理。Lifecycle 类负责实例化 AMS 并完成注册。
源码路径: frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
代码实现:
public static class Lifecycle extends SystemService {
private final ActivityManagerService mService;
public Lifecycle(Context context) {
super(context);
// 实例化 ActivityManagerService
mService = new ActivityManagerService(context);
}
@Override
public void onStart() {
// 将 AMS 注册为 Binder 系统服务
publishBinderService(Context.ACTIVITY_SERVICE, mService);
// 启动 AMS 内部核心逻辑
mService.start();
}
}
流程解析:
- new ActivityManagerService(context):实例化 AMS。
- publishBinderService(Context.ACTIVITY_SERVICE, mService):
将 AMS 注册为 Binder 服务,使得其他进程能够通过 Binder 调用。
服务名:“activity”。 - mService.start():启动 AMS 内部模块,包括任务栈管理、进程调度模块等。
1.3.2 AMS 的构造函数
AMS 构造函数完成其基本成员变量初始化。
源码路径: frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
关键代码:
public ActivityManagerService(Context context) {
mContext = context;
mActivityTaskManager = ActivityTaskManagerService.Lifecycle.startService(context);
mBatteryStatsService = new BatteryStatsService(context, this);
mAppOpsService = new AppOpsService(new File(dataDir, "appops.xml"), mHandler);
...
}
- AMS 内部初始化模块:
- ActivityTaskManagerService:管理任务栈与 Activity 切换。
- BatteryStatsService:统计应用耗电信息。
- AppOpsService:管理应用操作权限。
- ProcessList:进程列表,用于管理系统中的进程。
1.3.3 AMS 的启动
AMS 完成基本初始化后会调用 start() 方法,启动核心逻辑。
源码路径: frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
关键代码:
public void start() {
// 初始化任务栈管理器
mStackSupervisor = new ActivityStackSupervisor(this);