Android中的AMS(Activity Manager Service)详解

AMS (Activity Manager Service) 是 Android 系统中非常核心的服务之一,它负责管理应用程序的生命周期、任务栈、进程、广播、服务等功能。AMS 是整个 Android Framework 的调度中心,它的运作直接影响应用的性能和用户体验。

在这里插入图片描述

AMS 运行在 SystemServer 中,是一种 Binder IPC 服务,客户端通过 Binder 与 AMS 交互,完成相关任务。

AMS 的主要职责

  1. 应用程序生命周期管理
  • 启动和停止 Activity、Service
  • 管理任务栈(Task Stack)
  • 管理进程优先级和内存
  1. 任务和进程管理
  • 启动和调度应用进程
  • 杀死后台进程以释放内存
  • 分配进程资源
  1. 广播机制管理
  • 负责广播的注册与分发(包括普通广播和有序广播)
  1. 服务管理
  • 启动和绑定 Service,管理其生命周期
  1. 任务栈和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);
}
  1. ActivityManagerService.Lifecycle.startService:
    AMS 的 Lifecycle 类负责创建并启动服务。
  2. 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 的启动、停止以及状态切换。以下是核心流程:

  1. 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, ...);
    }
}
  1. Activity 的状态管理AMS 使用 ActivityStackSupervisorActivityRecord 来管理和跟踪 Activity 的状态。
2. 进程管理

AMS 使用 ProcessListProcessRecord 来管理进程的优先级和资源分配。

  • 启动进程:
    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 的关键数据结构

  1. ActivityRecord
  • 表示一个具体的 Activity 实例,保存其状态、任务栈信息等。
  1. TaskRecord
  • 表示一个任务栈,包含多个 ActivityRecord。
  1. ProcessRecord
  • 表示一个进程,包含其运行时状态、绑定的服务等信息。
  1. 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

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐