ActivityManagerService

352 阅读5分钟

AMS 的启动过程

在 SystemServer 的 startBootstrapServices() 中启动了 AMS(本文源码基于 Android 11),代码如下:

public final class SystemServer {

    private void startBootstrapServices(@NonNull TimingsTraceAndSlog t) {
        ...
        ActivityTaskManagerService atm = mSystemServiceManager.startService(
                ActivityTaskManagerService.Lifecycle.class).getService();
        // 启动 AMS        
        mActivityManagerService = ActivityManagerService.Lifecycle.startService(
                mSystemServiceManager, atm);
        mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
        mActivityManagerService.setInstaller(installer);
        mWindowManagerGlobalLock = atm.getGlobalLock();
        t.traceEnd();
        ...
        t.traceBegin("InitPowerManagement");
        // 初始化电源管理属性
        mActivityManagerService.initPowerManagement();
        t.traceEnd();
        ...
        t.traceBegin("SetSystemProcess");
        // 为系统进程配置 Application 实例
        mActivityManagerService.setSystemProcess();
        t.traceEnd();
        ...      
   }      
}

可以看到 AMS 是通过 ActivityManagerService.Lifecycle.startService() 来启动的:

public class ActivityManagerService extends IActivityManager.Stub{

    public static final class Lifecycle extends SystemService {

        private final ActivityManagerService mService;

        private static ActivityTaskManagerService sAtm;

        public Lifecycle(Context context) {
            super(context);
            // 新建 ActivityManagerService 实例
            mService = new ActivityManagerService(context, sAtm);
        }

        public static ActivityManagerService startService(
                SystemServiceManager ssm, ActivityTaskManagerService atm) {
            ...
            // 调用 SystemServiceManager 的 startService() 方法
            return ssm.startService(ActivityManagerService.Lifecycle.class).getService();
        }

        @Override
        public void onStart() {
            // 调用 AMS 的 start() 方法
            mService.start();
        }
    }
}    

startService() 方法调用了 SystemServiceManager 的 startService() 方法:

public class SystemServiceManager {

    // Services that should receive lifecycle events.
    private final ArrayList<SystemService> mServices = new ArrayList<SystemService>();

    public SystemService startService(String className) {
        // 获取 ActivityManagerService.Lifecycle 类
        // ActivityManagerService.Lifecycle 继承自 SystemService
        final Class<SystemService> serviceClass = loadClassFromLoader(className,
                this.getClass().getClassLoader());
        return startService(serviceClass);
    }
    
    private static Class<SystemService> loadClassFromLoader(String className,
            ClassLoader classLoader) {
        try {
            return (Class<SystemService>) Class.forName(className, true, classLoader);
        } catch (ClassNotFoundException ex) {
            throw new RuntimeException("Failed to create service " + className
                    + " from class loader " + classLoader.toString() + ": service class not "
                    + "found, usually indicates that the caller should "
                    + "have called PackageManager.hasSystemFeature() to check whether the "
                    + "feature is available on this device before trying to start the "
                    + "services that implement it. Also ensure that the correct path for the "
                    + "classloader is supplied, if applicable.", ex);
        }
    }
    
    public <T extends SystemService> T startService(Class<T> serviceClass) {
        try {
            final String name = serviceClass.getName();
            ...
            final T service;
            ...
            Constructor<T> constructor = serviceClass.getConstructor(Context.class);
            // 反射创建 ActivityManagerService.Lifecycle 的实例
            service = constructor.newInstance(mContext);
            ...
            startService(service);
            return service;
        } finally {
            Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
        }
    }
     
    public void startService(@NonNull final SystemService service) {
        // 添加到 mServices 中
        mServices.add(service);
        // 调用 ActivityManagerService.Lifecycle 的 onStart() 方法
        service.onStart();
        ...
    }
  
}

在这里通过传进来的 ActivityManagerService.Lifecycle 类反射创建了 ActivityManagerService.Lifecycle 的实例(在 ActivityManagerService.Lifecycle 的构造方法中新建了 AMS 的实例), 然后调用了 ActivityManagerService.Lifecycle 的 onStart() 方法,ActivityManagerService.Lifecycle 的 onStart() 方法又会调用 AMS 的 start() 方法。

AMS 的源码分析

先来看看 AMS 的构造方法:

public ActivityManagerService(Context systemContext, ActivityTaskManagerService atm) {
    LockGuard.installLock(this, LockGuard.INDEX_ACTIVITY);
    mInjector = new Injector(systemContext);
    mContext = systemContext; // 给 mContext 赋值

    mFactoryTest = FactoryTest.getMode();
    mSystemThread = ActivityThread.currentActivityThread(); // 获取当前的 ActivityThread
    mUiContext = mSystemThread.getSystemUiContext();

    Slog.i(TAG, "Memory class: " + ActivityManager.staticGetMemoryClass());

    // 创建 ServiceThread
    mHandlerThread = new ServiceThread(TAG,
            THREAD_PRIORITY_FOREGROUND, false /*allowIo*/);
    mHandlerThread.start();
    mHandler = new MainHandler(mHandlerThread.getLooper());
    mUiHandler = mInjector.getUiHandler(this);  // 处理 UI 相关信息的 Handler 

    mProcStartHandlerThread = new ServiceThread(TAG + ":procStart",
            THREAD_PRIORITY_FOREGROUND, false /* allowIo */);
    mProcStartHandlerThread.start();
    mProcStartHandler = new Handler(mProcStartHandlerThread.getLooper());
    // 管理 AMS 的一些常量,厂商定制系统可能修改此处
    mConstants = new ActivityManagerConstants(mContext, this, mHandler);
    final ActiveUids activeUids = new ActiveUids(this, true /* postChangesToAtm */);
    // 管理 apk 的兼容性配置
    mPlatformCompat = (PlatformCompat) ServiceManager.getService(
            Context.PLATFORM_COMPAT_SERVICE);
    mProcessList = mInjector.getProcessList(this);
    mProcessList.init(this, activeUids, mPlatformCompat);
    mLowMemDetector = new LowMemDetector(this);
    mOomAdjuster = new OomAdjuster(this, mProcessList, activeUids);

    // Broadcast policy parameters
    final BroadcastConstants foreConstants = new BroadcastConstants(
            Settings.Global.BROADCAST_FG_CONSTANTS);
    foreConstants.TIMEOUT = BROADCAST_FG_TIMEOUT;

    final BroadcastConstants backConstants = new BroadcastConstants(
            Settings.Global.BROADCAST_BG_CONSTANTS);
    backConstants.TIMEOUT = BROADCAST_BG_TIMEOUT;

    final BroadcastConstants offloadConstants = new BroadcastConstants(
            Settings.Global.BROADCAST_OFFLOAD_CONSTANTS);
    offloadConstants.TIMEOUT = BROADCAST_BG_TIMEOUT;
    // by default, no "slow" policy in this queue
    offloadConstants.SLOW_TIME = Integer.MAX_VALUE;

    mEnableOffloadQueue = SystemProperties.getBoolean(
            "persist.device_config.activity_manager_native_boot.offload_queue_enabled", false);
    // 初始化管理前台、后台广播的列表,系统会优先遍历发送前台广播
    mFgBroadcastQueue = new BroadcastQueue(this, mHandler,
            "foreground", foreConstants, false);
    mBgBroadcastQueue = new BroadcastQueue(this, mHandler,
            "background", backConstants, true);
    mOffloadBroadcastQueue = new BroadcastQueue(this, mHandler,
            "offload", offloadConstants, true);
    mBroadcastQueues[0] = mFgBroadcastQueue;
    mBroadcastQueues[1] = mBgBroadcastQueue;
    mBroadcastQueues[2] = mOffloadBroadcastQueue;
    // 初始化管理 Service 的 ActiveServices 对象
    mServices = new ActiveServices(this);
    mProviderMap = new ProviderMap(this); // 初始化 Provider 的管理者
    mPackageWatchdog = PackageWatchdog.getInstance(mUiContext); 
    mAppErrors = new AppErrors(mUiContext, this, mPackageWatchdog); // 初始化 App 错误日志的打印器

    final File systemDir = SystemServiceManager.ensureSystemDir();

    // TODO: Move creation of battery stats service outside of activity manager service.
    // 创建电池统计服务,并输出到指定目录
    mBatteryStatsService = new BatteryStatsService(systemContext, systemDir,
            BackgroundThread.get().getHandler());
    mBatteryStatsService.getActiveStatistics().readLocked();
    mBatteryStatsService.scheduleWriteToDisk();
    mOnBattery = DEBUG_POWER ? true
            : mBatteryStatsService.getActiveStatistics().getIsOnBattery();
    mBatteryStatsService.getActiveStatistics().setCallback(this);
    mOomAdjProfiler.batteryPowerChanged(mOnBattery);
    // 创建进程统计分析服务,追踪统计哪些进程有滥用或不良行为
    mProcessStats = new ProcessStatsService(this, new File(systemDir, "procstats"));

    mAppOpsService = mInjector.getAppOpsService(new File(systemDir, "appops.xml"), mHandler);

    mUgmInternal = LocalServices.getService(UriGrantsManagerInternal.class);
    // 负责管理多用户
    mUserController = new UserController(this);
    mPendingIntentController = new PendingIntentController(
            mHandlerThread.getLooper(), mUserController, mConstants);

    if (SystemProperties.getInt("sys.use_fifo_ui", 0) != 0) {
        mUseFifoUiScheduling = true;
    }

    mTrackingAssociations = "1".equals(SystemProperties.get("debug.track-associations"));
    mIntentFirewall = new IntentFirewall(new IntentFirewallInterface(), mHandler);

    mActivityTaskManager = atm;
    mActivityTaskManager.initialize(mIntentFirewall, mPendingIntentController,
            DisplayThread.get().getLooper());
    mAtmInternal = LocalServices.getService(ActivityTaskManagerInternal.class);
    // 启动一个线程专门监控 CPU 当前的状态
    mProcessCpuThread = new Thread("CpuTracker") {
        @Override
        public void run() {
            synchronized (mProcessCpuTracker) {
                mProcessCpuInitLatch.countDown();
                mProcessCpuTracker.init();
            }
            while (true) {
                try {
                    try {
                        synchronized(this) {
                            final long now = SystemClock.uptimeMillis();
                            long nextCpuDelay = (mLastCpuTime.get()+MONITOR_CPU_MAX_TIME)-now;
                            long nextWriteDelay = (mLastWriteTime+BATTERY_STATS_TIME)-now;
                            //Slog.i(TAG, "Cpu delay=" + nextCpuDelay
                            //        + ", write delay=" + nextWriteDelay);
                            if (nextWriteDelay < nextCpuDelay) {
                                nextCpuDelay = nextWriteDelay;
                            }
                            if (nextCpuDelay > 0) {
                                mProcessCpuMutexFree.set(true);
                                this.wait(nextCpuDelay);
                            }
                        }
                    } catch (InterruptedException e) {
                    }
                    updateCpuStatsNow();
                } catch (Exception e) {
                    Slog.e(TAG, "Unexpected exception collecting process stats", e);
                }
            }
        }
    };

    mHiddenApiBlacklist = new HiddenApiSettings(mHandler, mContext);
    // 看门狗,监听进程。这个类每分钟调用一次监听器,如果进程没有任何返回就杀掉。
    Watchdog.getInstance().addMonitor(this);
    Watchdog.getInstance().addThread(mHandler);

    // bind background threads to little cores
    // this is expected to fail inside of framework tests because apps can't touch cpusets directly
    // make sure we've already adjusted system_server's internal view of itself first
    updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_NONE);
    try {
        Process.setThreadGroupAndCpuset(BackgroundThread.get().getThreadId(),
                Process.THREAD_GROUP_SYSTEM);
        Process.setThreadGroupAndCpuset(
                mOomAdjuster.mCachedAppOptimizer.mCachedAppOptimizerThread.getThreadId(),
                Process.THREAD_GROUP_SYSTEM);
    } catch (Exception e) {
        Slog.w(TAG, "Setting background thread cpuset failed");
    }

    mInternal = new LocalService();
    mPendingStartActivityUids = new PendingStartActivityUids(mContext);
}

AMS 的 start() 方法如下:

private void start() {
    removeAllProcessGroups();
    mProcessCpuThread.start();   // 启动 CPU 监控线程

    mBatteryStatsService.publish();  // 添加电池状态服务
    mAppOpsService.publish();  // 添加权限管理服务
    Slog.d("AppOps", "AppOpsService published");
    LocalServices.addService(ActivityManagerInternal.class, mInternal);
    mActivityTaskManager.onActivityManagerInternalAdded();
    mPendingIntentController.onActivityManagerInternalAdded();
    ...
}

前面看到,AMS 启动后会调用 initPowerManagement() 方法,代码如下:

public void initPowerManagement() {
    mActivityTaskManager.onInitPowerManagement();
    mBatteryStatsService.initPowerManagement();
    mLocalPowerManager = LocalServices.getService(PowerManagerInternal.class);
}

该方法会初始化电源管理。

然后 AMS 又调用了 setSystemProcess() 方法,代码如下:

public void setSystemProcess() {
    try {
        // 添加 AMS 到 ServiceManager 中
        ServiceManager.addService(Context.ACTIVITY_SERVICE, this, /* allowIsolated= */ true,
                DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PRIORITY_NORMAL | DUMP_FLAG_PROTO);
        // 添加服务 ProcessStats,进程状态       
        ServiceManager.addService(ProcessStats.SERVICE_NAME, mProcessStats);
        // 添加服务 meminfo,内存信息
        ServiceManager.addService("meminfo", new MemBinder(this), /* allowIsolated= */ false,
                DUMP_FLAG_PRIORITY_HIGH);
        // 添加服务 gfxinfo,图像信息        
        ServiceManager.addService("gfxinfo", new GraphicsBinder(this));
        // 添加服务 dbinfo,数据库信息
        ServiceManager.addService("dbinfo", new DbBinder(this));
        if (MONITOR_CPU_USAGE) {
            // 添加服务 cpuinfo,cpu信息
            ServiceManager.addService("cpuinfo", new CpuBinder(this),
                    /* allowIsolated= */ false, DUMP_FLAG_PRIORITY_CRITICAL);
        }
        // 添加服务 permission,权限
        ServiceManager.addService("permission", new PermissionController(this));
        // 添加服务 processinfo,进程信息
        ServiceManager.addService("processinfo", new ProcessInfoService(this));
        // 添加服务 cacheinfo,缓存信息
        ServiceManager.addService("cacheinfo", new CacheBinder(this));
        
        // 查询包名为 android 的 apk 的 ApplicationInfo
        ApplicationInfo info = mContext.getPackageManager().getApplicationInfo(
                "android", STOCK_PM_FLAGS | MATCH_SYSTEM_ONLY);
        mSystemThread.installSystemApplicationInfo(info, getClass().getClassLoader());

        synchronized (this) {
            // 创建 ProcessRecord 维护进程的相关信息
            ProcessRecord app = mProcessList.newProcessRecordLocked(info, info.processName,
                    false,
                    0,
                    new HostingRecord("system"));
            app.setPersistent(true);
            app.pid = MY_PID;
            app.getWindowProcessController().setPid(MY_PID);
            app.maxAdj = ProcessList.SYSTEM_ADJ;
            app.makeActive(mSystemThread.getApplicationThread(), mProcessStats);
            addPidLocked(app);
            mProcessList.updateLruProcessLocked(app, false, null);
            updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_NONE);
        }
    } catch (PackageManager.NameNotFoundException e) {
        throw new RuntimeException(
                "Unable to find android system package", e);
    }

    // Start watching app ops after we and the package manager are up and running.
    mAppOpsService.startWatchingMode(AppOpsManager.OP_RUN_IN_BACKGROUND, null,
            new IAppOpsCallback.Stub() {
                @Override public void opChanged(int op, int uid, String packageName) {
                    if (op == AppOpsManager.OP_RUN_IN_BACKGROUND && packageName != null) {
                        if (getAppOpsManager().checkOpNoThrow(op, uid, packageName)
                                != AppOpsManager.MODE_ALLOWED) {
                            runInBackgroundDisabled(uid);
                        }
                    }
                }
            });

    final int[] cameraOp = {AppOpsManager.OP_CAMERA};
    mAppOpsService.startWatchingActive(cameraOp, new IAppOpsActiveCallback.Stub() {
        @Override
        public void opActiveChanged(int op, int uid, String packageName, boolean active) {
            cameraActiveChanged(uid, active);
        }
    });
}

这里主要做了下面几件事情:

  • 1.添加服务。将 AMS 和各种管理 App 状态信息的服务添加到 ServiceManager 中。
  • 2.查询并处理 ApplicaitonInfo。调用 PackageManagerService 的接口查询包名为 android 的应用程序的 ApplicationInfo,对应于 framework-res.apk,然后调用 ActivityThread 的 installSystemApplicationInfo() 方法为系统进程配置 application info。
  • 3.创建并处理 ProcessRecord。调用 ProcessList 的 newProcessRecordLocked() 方法创建 ProcessRecord 对象,并保存该对象信息。

在 SystemServer 的 startOtherServices() 方法中,AMS 还会监听 Native Crash。

private void startOtherServices(@NonNull TimingsTraceAndSlog t) {
        ...
        mActivityManagerService.systemReady(() -> {
            Slog.i(TAG, "Making services ready");
            t.traceBegin("StartActivityManagerReadyPhase");
            mSystemServiceManager.startBootPhase(t, SystemService.PHASE_ACTIVITY_MANAGER_READY);
            t.traceEnd();
            t.traceBegin("StartObservingNativeCrashes");
            try {
                // 监听 Native Crash
                mActivityManagerService.startObservingNativeCrashes();
            } catch (Throwable e) {
                reportWtf("observing native crashes", e);
            }
            t.traceEnd();
            ...
         }  
}

总结一下,AMS 的职责包括:

  1. 启动线程,监控 CPU 的状态;
  2. 添加电池状态服务和权限管理服务;
  3. 初始化电池管理;
  4. 添加各种管理 App 状态信息的服务,创建 ProcessRecord 维护进程的相关信息;
  5. 监听 Native Crash;