Android中的AMS(Activity Manager Service)详解
AMS (Activity Manager Service) 是 Android 系统中非常核心的服务之一,它负责管理应用程序的生命周期、任务栈、进程、广播、服务等功能。AMS 是整个 Android Framework 的调度中心,它的运作直接影响应用的性能和用户体验。
AMS 运行在 SystemServer 中,是一种 Binder IPC 服务,客户端通过 Binder 与 AMS 交互,完成相关任务。
AMS 的主要职责
- 应用程序生命周期管理
- 启动和停止 Activity、Service
- 管理任务栈(Task Stack)
- 管理进程优先级和内存
- 任务和进程管理
- 启动和调度应用进程
- 杀死后台进程以释放内存
- 分配进程资源
- 广播机制管理
- 负责广播的注册与分发(包括普通广播和有序广播)
- 服务管理
- 启动和绑定 Service,管理其生命周期
- 任务栈和Activity栈管理
- 管理 Activity 的启动、销毁及任务栈状态
AMS 的启动过程
1. SystemServer 初始化
AMS 是在 SystemServer 启动时初始化的。
相关代码路径:frameworks/base/services/core/java/com/android/server/SystemServer.java
private void startBootstrapServices() {
// 省略其他服务的启动
ActivityManagerService mActivityManagerService =
ActivityManagerService.Lifecycle.startService(context);
mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
mActivityManagerService.setInstaller(installer);
}
- ActivityManagerService.Lifecycle.startService:
AMS 的 Lifecycle 类负责创建并启动服务。 - AMS 的构造方法会初始化一些关键模块(如进程管理、广播队列等)。
2. AMS 的主线程 Looper 初始化
在 AMS 的初始化过程中,会为主线程创建一个消息循环。
public ActivityManagerService(Context systemContext) {
mHandlerThread = new ServiceThread(TAG, ...);
mHandlerThread.start();
mHandler = new ActivityManagerHandler(mHandlerThread.getLooper());
}
- ServiceThread: AMS 的主线程,专门处理消息和任务。
- ActivityManagerHandler: 负责处理各种消息和调度任务。
AMS 的核心功能
1. 管理 Activity 的生命周期
AMS 是 Activity 生命周期的调度中心,负责 Activity 的启动、停止以及状态切换。以下是核心流程:
- Activity 启动流程
- 客户端通过 startActivity 请求 AMS。
- AMS 通过 IApplicationThread 通知目标进程。
- 目标进程通过 Instrumentation 调用 ActivityThread 完成 Activity 的创建。核心代码(AMS 的
startActivity
方法):
public int startActivity(IApplicationThread caller, String callingPackage, Intent intent, ...) {
synchronized (this) {
// 组装Activity的启动请求
ActivityRecord r = new ActivityRecord(...);
// 将请求加入任务队列
mStackSupervisor.startActivityLocked(r, ...);
}
}
- Activity 的状态管理AMS 使用
ActivityStackSupervisor
和ActivityRecord
来管理和跟踪 Activity 的状态。
2. 进程管理
AMS 使用 ProcessList
和 ProcessRecord
来管理进程的优先级和资源分配。
- 启动进程:
AMS 调用zygote
进程 fork 子进程,然后通过ApplicationThread
连接新进程。
Process.start("com.example.app", appInfo.uid, appInfo.processName);
- 杀死进程:
AMS 根据内存和优先级策略,通过Process.killProcess
杀死后台进程。
3. 广播管理
AMS 的 BroadcastQueue
负责广播的调度和分发。
public void broadcastIntent(Intent intent, ...) {
// 将广播请求加入队列
BroadcastRecord r = new BroadcastRecord(intent, ...);
mBroadcastQueue.enqueueBroadcast(r);
}
- 普通广播: 同时分发给多个接收器。
- 有序广播: 按优先级分发,接收器可终止广播。
AMS 的关键数据结构
- ActivityRecord
- 表示一个具体的 Activity 实例,保存其状态、任务栈信息等。
- TaskRecord
- 表示一个任务栈,包含多个 ActivityRecord。
- ProcessRecord
- 表示一个进程,包含其运行时状态、绑定的服务等信息。
- BroadcastRecord
- 表示一次广播请求,包括目标接收器列表和状态信息。
AMS 与 Binder 通信
AMS 是一个 Binder 服务,应用进程通过 AIDL 接口与 AMS 交互。
- AIDL 接口路径:IActivityManager.aidl
interface IActivityManager {
int startActivity(...);
void finishActivity(...);
}
- AMS 的 Binder 处理:
public class ActivityManagerService extends IActivityManager.Stub {
public int startActivity(...) {
enforceCallingPermission(...);
return startActivityInternal(...);
}
}
总结
AMS 是 Android 的核心服务,承担了大量系统任务。其设计基于模块化的架构,通过 Binder 实现客户端和服务端的解耦。深入理解 AMS 源码有助于优化应用性能和排查系统问题。
如果需要具体模块的更深层次分析,可以指定细化部分继续讨论!
参考
ActivityManagerService Part 1: Structure and Basic