系统启动流程分析之AMS服务启动流程分析(下)

395 阅读5分钟

「这是我参与2022首次更文挑战的第10天,活动详情查看:2022首次更文挑战」。

ActivityManagerService服务启动流程分析

在前篇AMS服务启动流程分析(上)中,我们分析了AMS服务的初始化流程,接下来我们接着从SystemServer类中进行分析

SystemServer.startBootstrapServices

private void startBootstrapServices(@NonNull TimingsTraceAndSlog t) {
    // ...... 
    mActivityManagerService.initPowerManagement();
    // ......
    mActivityManagerService.setSystemProcess();
    // ......
    watchdog.init(mSystemContext, mActivityManagerService);
    // ......
}

ActivityManagerService.initPowerManagement

首先先看ActivityManagerService.initPowerManagement函数的函数调用时序图:

图片.png

从上述的时序图来看,这个函数主要做了

  1. 首先调用ActivityTaskManagerService.initPowerManagement函数,在这个函数中, 首先调用ActivityStackSupervisor.initPowerManagement函数,在ActivityStackSupervisor对象中,初始化两个WakeLock,mGoingToSleepWakeLock和mLaunchingActivityWakeLock 其次赋值参数mPowerManagerInternal为PowerManagerService.LocalService对象 最后,初始化一个对象名为mVoiceWakeLock的PowerManager.WakeLock对象
  2. 其次调用BatteryStatsService.initPowerManagement函数,在这个函数中,主要注册一个低电量ContentObserver对象,用作监听低电量模式,并根据当前是否为低电量模式设置系统,最后记录系统被唤醒的原因
  3. 最后赋值参数mLocalPowerManager为PowerManagerService.LocalService对象

ActivityManagerService.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
        ServiceManager.addService(ProcessStats.SERVICE_NAME, mProcessStats);
        // 注册ActivityManagerService.MemBinder到ServiceManager
        ServiceManager.addService("meminfo", new MemBinder(this), /* allowIsolated= */ false,
                DUMP_FLAG_PRIORITY_HIGH);
        // 注册GraphicsBinder到ServiceManager
        ServiceManager.addService("gfxinfo", new GraphicsBinder(this));
        // 注册DbBinder到ServiceManager
        ServiceManager.addService("dbinfo", new DbBinder(this));
        if (MONITOR_CPU_USAGE) {
            // 注册CpuBinder到ServiceManager
            ServiceManager.addService("cpuinfo", new CpuBinder(this),
                    /* allowIsolated= */ false, DUMP_FLAG_PRIORITY_CRITICAL);
        }
        // 注册PermissionController到ServiceManager
        // AMS的权限管理类
        ServiceManager.addService("permission", new PermissionController(this));
        // 注册ProcessInfoService对象到ServiceManager
        // AMS进程管理类
        ServiceManager.addService("processinfo", new ProcessInfoService(this));
        // 注册CacheBinder对象到ServiceManager
        ServiceManager.addService("cacheinfo", new CacheBinder(this));

        // 获取一个包名为"android"的应用信息,并注册,这个在后续深入分析
        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 = app.mPidForCompact = 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);
        }
    });
}

这边主要注册了一些服务。然后初始化了一个ApplicationInfo并安装,通过ApplicationInfo对象创建一个ProcessRecord对象,并初始化,最后穹顶后台应用监听和Camera活跃监听

watchdog.init

public void init(Context context, ActivityManagerService activity) {
    mActivity = activity;
    context.registerReceiver(new RebootRequestReceiver(),
            new IntentFilter(Intent.ACTION_REBOOT),
            android.Manifest.permission.REBOOT, null);
}

这边主要是注册了一个Reboot的广播监听,并且在接收到广播的时候,触发重启操作

SystemServer.startCoreServices

private void startCoreServices(@NonNull TimingsTraceAndSlog t) {
    // ......
    mActivityManagerService.setUsageStatsManager(LocalServices.getService(UsageStatsManagerInternal.class));
    // ......
}

public void setUsageStatsManager(UsageStatsManagerInternal usageStatsManager) {
    mUsageStatsService = usageStatsManager;
    mActivityTaskManager.setUsageStatsManager(usageStatsManager);
}

初始化操作

SystemServer.startOtherServices

private void startOtherServices(@NonNull TimingsTraceAndSlog t) {
    // ......
    // 注册拥有系统权限的所有ContentProvider
    mActivityManagerService.installSystemProviders();
    // ......
    // 设置WindowManagerService对象
    mActivityManagerService.setWindowManager(wm);
    // ......
    mActivityManagerService.systemReady(() -> {
        // ...... 功能无关代码,省略
        // 调用SystemServiceManager.startBootPhase函数
        // 此前SystemServiceManager.startService函数调用的时候,会将所有启动的服务添加到该对象的mServices中
        // 此时会在这个函数中调用所有mServices包含的服务的onBootPhase函数
        // 需要注意的是第二个参数,它标识着onBootPhase响应的阶段
        mSystemServiceManager.startBootPhase(t, SystemService.PHASE_ACTIVITY_MANAGER_READY);
        // ...... 功能无关代码,省略
        try {
            // 启动监听Native Crash异常
            mActivityManagerService.startObservingNativeCrashes();
        }
        // ...... 功能无关代码,省略
        // No dependency on Webview preparation in system server. But this should
        // be completed before allowing 3rd party
        final String WEBVIEW_PREPARATION = "WebViewFactoryPreparation";
        Future<?> webviewPrep = null;
        if (!mOnlyCore && mWebViewUpdateService != null) {
            webviewPrep = SystemServerInitThreadPool.submit(() -> {
                Slog.i(TAG, WEBVIEW_PREPARATION);
                TimingsTraceAndSlog traceLog = TimingsTraceAndSlog.newAsyncLog();
                traceLog.traceBegin(WEBVIEW_PREPARATION);
                ConcurrentUtils.waitForFutureNoInterrupt(mZygotePreload, "Zygote preload");
                mZygotePreload = null;
                mWebViewUpdateService.prepareWebViewInSystemServer();
                traceLog.traceEnd();
            }, WEBVIEW_PREPARATION);
        }

        // ...... 功能无关代码,省略
        try {
            // 启动SystemUI服务
            startSystemUi(context, windowManagerF);
        }
        // ...... 功能无关代码,省略
        // Enable airplane mode in safe mode. setAirplaneMode() cannot be called
        // earlier as it sends broadcasts to other services.
        // TODO: This may actually be too late if radio firmware already started leaking
        // RF before the respective services start. However, fixing this requires changes
        // to radio firmware and interfaces.
        // 判断当前是否为安全模式,当安全模式时,飞行模式会被打开
        if (safeMode) {
            t.traceBegin("EnableAirplaneModeInSafeMode");
            try {
                connectivityF.setAirplaneMode(true);
            }
            // ...... catch语句,此处省略
        }
        // ...... 功能无关代码,省略
        try {
            // AMS启动完成后,准备守护进程的相关资源
            if (networkManagementF != null) {
                networkManagementF.systemReady();
            }
        }
        // ...... 功能无关代码,省略
        // 网络准备完成,注册必要的广播,注册省电模式的状态变化等
        CountDownLatch networkPolicyInitReadySignal = null;
        if (networkPolicyF != null) {
            networkPolicyInitReadySignal = networkPolicyF
                    .networkScoreAndNetworkManagementServiceReady();
        }
        // ...... 功能无关代码,省略
        try {
            if (ipSecServiceF != null) {
                ipSecServiceF.systemReady();
            }
        }
        // ...... 功能无关代码,省略
        try {
            if (networkStatsF != null) {
                networkStatsF.systemReady();
            }
        }
        // ...... 功能无关代码,省略
        try {
            if (connectivityF != null) {
                connectivityF.systemReady();
            }
        }
        // ...... 功能无关代码,省略
        try {
            if (networkPolicyF != null) {
                networkPolicyF.systemReady(networkPolicyInitReadySignal);
            }
        }
        // ...... 功能无关代码,省略
    
        // Wait for all packages to be prepared
        // 等待系统应用的Data数据的加载
        mPackageManagerService.waitForAppDataPrepared();
    
        // It is now okay to let the various system services start their
        // third party code...
        // ...... 功能无关代码,省略
        // confirm webview completion before starting 3rd party
        if (webviewPrep != null) {
            ConcurrentUtils.waitForFutureNoInterrupt(webviewPrep, WEBVIEW_PREPARATION);
        }
        mSystemServiceManager.startBootPhase(t, SystemService.PHASE_THIRD_PARTY_APPS_CAN_START);
        // ...... 功能无关代码,省略
        try {
            // Note : the network stack is creating on-demand objects that need to send
            // broadcasts, which means it currently depends on being started after
            // ActivityManagerService.mSystemReady and ActivityManagerService.mProcessesReady
            // are set to true. Be careful if moving this to a different place in the
            // startup sequence.
            NetworkStackClient.getInstance().start();
        }
        // ...... 功能无关代码,省略
        try {
            // TODO: hide implementation details, b/146312721.
            ConnectivityModuleConnector.getInstance().startModuleService(
                    TETHERING_CONNECTOR_CLASS,
                    PERMISSION_MAINLINE_NETWORK_STACK, service -> {
                        ServiceManager.addService(Context.TETHERING_SERVICE, service,
                                false /* allowIsolated */,
                                DUMP_FLAG_PRIORITY_HIGH | DUMP_FLAG_PRIORITY_NORMAL);
                    });
        }
        // ...... 功能无关代码,省略
        try {
            if (countryDetectorF != null) {
                countryDetectorF.systemRunning();
            }
        }
        // ...... 功能无关代码,省略
        try {
            if (networkTimeUpdaterF != null) {
                networkTimeUpdaterF.systemRunning();
            }
        }
        // ...... 功能无关代码,省略
        try {
            // TODO(BT) Pass parameter to input manager
            if (inputManagerF != null) {
                inputManagerF.systemRunning();
            }
        }
        // ...... 功能无关代码,省略
        try {
            if (telephonyRegistryF != null) {
                telephonyRegistryF.systemRunning();
            }
        }
        // ...... 功能无关代码,省略
        try {
            if (mediaRouterF != null) {
                mediaRouterF.systemRunning();
            }
        }
        // ...... 功能无关代码,省略
        try {
            if (mmsServiceF != null) {
                mmsServiceF.systemRunning();
            }
        }
        // ...... 功能无关代码,省略
        try {
            // TODO: Switch from checkService to getService once it's always
            // in the build and should reliably be there.
            final IIncidentManager incident = IIncidentManager.Stub.asInterface(
                    ServiceManager.getService(Context.INCIDENT_SERVICE));
            if (incident != null) {
                incident.systemRunning();
            }
        }
        // ...... 功能无关代码,省略
        if (mIncrementalServiceHandle != 0) {
            t.traceBegin("MakeIncrementalServiceReady");
            setIncrementalServiceSystemReady(mIncrementalServiceHandle);
            t.traceEnd();
        }
    }, t);
    // ......
}

可以看到,这个函数表明AMS服务的启动已经完成,在完成的同时会通知其他应用完成自己的加载,由于这块会有多个模块加载完成,而且流程比较复杂,对于这部分的分析待后续对特定的类或者模块分析时再行实际分析,暂时只更新流程时序图

图片.png

图片.png