Android Activity Manager Service (AMS) 深入详解及源码分析


前言

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() 方法中的关键步骤:

  1. init():初始化运行环境。
  2. startBootstrapServices():启动引导服务,包括 AMS。
  3. 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();
    }
}

流程解析:

  1. new ActivityManagerService(context):实例化 AMS。
  2. publishBinderService(Context.ACTIVITY_SERVICE, mService):
    将 AMS 注册为 Binder 服务,使得其他进程能够通过 Binder 调用。
    服务名:“activity”。
  3. 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 内部初始化模块
  1. ActivityTaskManagerService:管理任务栈与 Activity 切换。
  2. BatteryStatsService:统计应用耗电信息。
  3. AppOpsService:管理应用操作权限。
  4. 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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值