android12 ActivityManagerService开机启动分析

ActivityManagerService (AMS) 是系统最核心的服务之一,运行在 system_server 进程。可以把它理解为 Android 系统的"大总管",负责统一调度所有应用组件(Activity、Service、BroadcastReceiver、ContentProvider)的生命周期,并管理应用进程与系统内存。

AMS 的启动流程

启动前奏:SystemServer 的准备

  1. main() -> run()SystemServer 的入口从 main() 方法开始,它创建一个 SystemServer 实例并调用 run() 方法。
  2. 准备主线程run() 方法首先调用 Looper.prepareMainLooper() 为该进程准备消息队列,使其能处理后续的异步事务。
  3. 加载 Native 库System.loadLibrary("android_servers") 加载系统服务所需的本地代码。
scss 复制代码
//frameworks/base/services/java/com/android/server/SystemServer.java
private void run() {
  ...
 
  // 1. 启动主线程的消息循环
  Looper.prepareMainLooper();
  ...
  //2. 加载 native 库
  System.loadLibrary("android_servers");
  ...
  // 3. 创建系统 Context
  createSystemContext();

  try {
     // 4. 启动引导服务、核心服务、其他服务
     startBootstrapServices(t);
     startCoreServices(t);
     startOtherServices(t);
  } catch (Throwable ex) {
     throw ex;
  } finally {
   
  }
  ...
  Looper.loop();
}

核心启动:startBootstrapServices

这是启动 AMS 最关键的一步,在 startBootstrapServices() 方法中完成。

  1. 先启动 ATMSActivityTaskManagerService 作为 AMS 的依赖,必须率先启动 。它的 Lifecycle 类通过 SystemServiceManager 反射创建并启动。它负责管理所有与 Activity 任务栈相关的复杂逻辑。

  2. 再启动 AMS :随后通过 ActivityManagerService.Lifecycle.startService() 创建 AMS 实例。关键之处在于,正在创建的 ATMS 实例会作为参数传递给 AMS 的构造函数,建立起依赖关系。

    • AMS 构造函数内部 :会进行一系列初始化,如创建 "ActivityManager""android.ui" 线程、初始化前台/后台广播队列 (BroadcastQueue)、ActiveServicesProcessList 等核心数据结构。
  3. setSystemProcess() :这是让 AMS "持证上岗"的关键一步。它向系统的 ServiceManager 注册 "activity" 等一系列 Binder 服务,使得其他进程可以通过 Binder 机制与 AMS 通信。

  4. installSystemProviders() :为 system_server 自身安装核心的 SettingsProvider,确保系统服务能访问设置数据库。

java 复制代码
//frameworks/base/services/java/com/android/server/SystemServer.java
private void startBootstrapServices(@NonNull TimingsTraceAndSlog t) {
    ...
    //1. 先启动 ATMS
    ActivityTaskManagerService atm = mSystemServiceManager.startService(
            ActivityTaskManagerService.Lifecycle.class).getService();
    // 2. 再启动 AMS,并将 ATMS 实例作为参数传入
    mActivityManagerService = ActivityManagerService.Lifecycle.startService(
            mSystemServiceManager, atm);
    // 3. 设置 SystemServiceManager 引用
    mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
    // 4. 设置 Installer 引用
    //`Installer` 是与 `installd` 守护进程通信的接口,负责应用的安装、卸载、
    //目录创建等底层操作。AMS 需要它来在应用安装/卸载时更新进程管理相关的状态
    mActivityManagerService.setInstaller(installer);
    ...
    //注册一系列 Binder 服务
    mActivityManagerService.setSystemProcess();
   
}

//frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
public void setSystemProcess() {
    try {
        // 1. 注册核心服务 "activity",这是 AMS 的主业,
        //`allowIsolated=true`:允许隔离进程(如 WebView 渲染进程)
        //访问 `activity` 服务。Android 8.0+ 引入了隔离进程,默认无法访问系统服务,
        //这里显式放行
        //`DUMP_FLAG_PRIORITY_*`:控制 `dumpsys` 命令的输出优先级,
        //`CRITICAL` 级别的信息在系统负载高时仍会输出
        ServiceManager.addService(Context.ACTIVITY_SERVICE, this, /* allowIsolated= */ true,
                DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PRIORITY_NORMAL | DUMP_FLAG_PROTO);
        // 2. 注册一系列辅助调试和服务管理的 Binder 服务
        ServiceManager.addService(ProcessStats.SERVICE_NAME, mProcessStats);
        ServiceManager.addService("meminfo", new MemBinder(this), /* allowIsolated= */ false,
                DUMP_FLAG_PRIORITY_HIGH);
        ServiceManager.addService("gfxinfo", new GraphicsBinder(this));
        ...
        //通过PMS查询 "android" 包的 ApplicationInfo
        //`"android"` 是系统框架包,对应 `/system/framework/framework-res.apk`
        //,包含了系统级别的资源(如 `android.R` 中的资源)。
        //`STOCK_PM_FLAGS` 通常包含 `GET_SHARED_LIBRARY_FILES` 等标志
        //`MATCH_SYSTEM_ONLY` 确保只匹配系统应用,防止第三方包名冲突
        ApplicationInfo info = mContext.getPackageManager().getApplicationInfo(
                "android", STOCK_PM_FLAGS | MATCH_SYSTEM_ONLY);
        //为 system_server 进程安装 ApplicationInfo
        //`mSystemThread` 是 `ActivityThread` 实例,代表 system_server 
        //进程的主线程。 这个方法将查询到的 `ApplicationInfo` 注入到
        //系统 Context 中,完成系统进程的 Context 初始化。
        //之后,system_server 就能正确访问 `android` 包中的资源文件了
        mSystemThread.installSystemApplicationInfo(info, getClass().getClassLoader());

        synchronized (this) {
            //为 system_server 进程创建 ProcessRecord 并加入管理
            //new HostingRecord("system")标记这个进程是由系统直接托管的,
            //而不是由某个应用组件(如 Activity)触发的
            ProcessRecord app = mProcessList.newProcessRecordLocked(info, info.processName,
                    false,
                    0,
                    new HostingRecord("system"));
            //设置为持久化进程,系统会永远保留它,不会被 Low Memory Killer 杀死
            app.setPersistent(true);
            //`MY_PID` 是 `Process.myPid()`,即 system_server 自身的 PID
            app.setPid(MY_PID);
            //设置进程的最大 OOM 调整值为 `SYSTEM_ADJ`(约 -900),这是极高的优先级
            app.mState.setMaxAdj(ProcessList.SYSTEM_ADJ);
            //将进程标记为活跃状态,关联其 `ApplicationThread`
            app.makeActive(mSystemThread.getApplicationThread(), mProcessStats);
            //将 PID 加入 AMS 的 PID 映射表,用于快速查找进程
            addPidLocked(app);
            //将 system_server 加入 LRU 管理列表
            updateLruProcessLocked(app, false, null);
            //立即计算一次所有进程的 OOM 优先级,确保 system_server 处于最高优先级
            updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_NONE);
        }
    } catch (PackageManager.NameNotFoundException e) {
        throw new RuntimeException(
                "Unable to find android system package", e);
    }

   ...
}

//frameworks/base/services/java/com/android/server/SystemServer.java
private void startOtherServices(@NonNull TimingsTraceAndSlog t) {
 //实际调用的是 `ContentProviderHelper` 的 `installSystemProviders()`方法 
 //查找需要安装的Provider,即SettingsProvider,将 Provider 注册到 AMS 中
 mActivityManagerService.getContentProviderHelper().installSystemProviders();
}

就绪与收尾

  1. 启动其他服务 :AMS 启动后,SystemServer 会继续启动 startCoreServices()startOtherServices() 中定义的其他大量系统服务。
  2. systemReady() :当所有服务准备就绪,会调用 AMS 的 systemReady() 方法,这标志着系统进入就绪状态。在此方法中,系统会启动 SystemUI 并最终启动 Launcher 桌面应用,完成整个开机流程。
相关推荐
Android-Flutter3 小时前
android 性能优化 详解
android·kotlin
vortex53 小时前
composer.json 可写场景下的利用手段
android·json·composer
studyForMokey3 小时前
【Android 内存管理】JVM 内存模型与 GC 原理
android·jvm
夜雪一千15 小时前
MySQL 全局锁是什么?原理、风险、备份踩坑完整实战
android·mysql·adb
又见情义21 小时前
RK3568 Android 13 驱动适配实战:从零开始让SDK在自己的板子上跑起来
android·arm开发·驱动开发
霸道流氓气质1 天前
MySQL 大表 DDL 变更 — 原理、方案与实践
android·数据库·mysql
明雨-开发1 天前
Android打包时候Execution failed for task ‘:launcher:lintVitalAnalyzeRelease‘.
android
游戏开发爱好者81 天前
开心上架是什么,一站式 Apple 开发者工作台总览
android·小程序·https·uni-app·iphone·webview