1. SystemServer 流程分析

        共 18120字,需瀏覽 37分鐘

         ·

        2024-04-01 04:30

        d68e1012fa3002c71ddd36f16cac38d9.webp

        和你一起終身學(xué) 習(xí),這里是程序員Android

        經(jīng)典好文推薦,通過(guò)閱讀本文,您將收獲以下知識(shí)點(diǎn):

        一、SystemServer 啟動(dòng)的服務(wù)有哪些
        二、SystemServer啟動(dòng)總體流程概述
        三、SystemServer 如何啟動(dòng),是誰(shuí)啟動(dòng)的?
        四、 SystemServer 啟動(dòng)入門 main 方法
        五、SystemServer Run 方法初始與啟動(dòng)
        六、SystemServer 的引導(dǎo)服務(wù)有哪些
        七、SystemServer 的核心服務(wù)有哪些
        八、SystemServer 的其他服務(wù)有哪些

        一、SystemServer 啟動(dòng)的服務(wù)有哪些

        SystemServer 主要啟動(dòng) ActivityManagerServicePackageManagerService、WindowManagerService、LightsService、LightsService、BatteryService、TelephonyRegistry、RecoverySystemService 等等,主要分三大類,后文會(huì)詳細(xì)列舉。

        1.SystemServer 啟動(dòng)的服務(wù)

        693022deaed750e3ff085bcafe3055d1.webp

        SystemServer 啟動(dòng)的服務(wù)

        49a1a9979c20acfc1d0e7effca2e32c7.webp

        SystemServer 啟動(dòng)的服務(wù)

        二、SystemServer啟動(dòng)總體流程概述

        1.SystemServer 代碼

        \alps\frameworks\base\services\java\com\android\server\SystemServer.java

        97624f66ed0983242fd4444a9b292bd0.webp

        SystemServer 進(jìn)程啟動(dòng)導(dǎo)圖

        三、SystemServer 如何啟動(dòng),是誰(shuí)啟動(dòng)的?

        SystemServer是通過(guò)Zygote 啟動(dòng)的,在ZygoteInit.java類的(frameworks\base\core\java\com\android\internal\os\ZygoteInit.java) main方法中通過(guò)forkSystemServer啟動(dòng)。

                public static void main(String argv[]) {
        ....
        //設(shè)置變量區(qū)分是否啟動(dòng)SystemServer
        boolean startSystemServer = false;
        String socketName = "zygote";
        String abiList = null;
        boolean enableLazyPreload = false;
        for (int i = 1; i < argv.length; i++) {
        if ("start-system-server".equals(argv[i])) {
        // 需要啟動(dòng)時(shí)候,將標(biāo)志位設(shè)置為true
        startSystemServer = true;
        } else if ("--enable-lazy-preload".equals(argv[i])) {
        enableLazyPreload = true;
        }
        ... ...

        if (startSystemServer) {
        // 通過(guò) Zygote fork 出 SystemServer
        Runnable r = forkSystemServer(abiList, socketName, zygoteServer);

        // {@code r == null} in the parent (zygote) process, and {@code r != null} in the
        // child (system_server) process.
        if (r != null) {
        r.run();
        return;
        }
        }
        四、 SystemServer 啟動(dòng)入門 main 方法

        main 入口 通過(guò) new SystemServer().run();開啟SystemServer啟動(dòng)。

        main 入口代碼如下:

            

        /**
        * The main entry point from zygote.
        */

        * The main entry point from zygote.
        */

        public static void main(String[] args) {
        new SystemServer().run();
        }

        通過(guò)Main入口,調(diào)用SystemServer 構(gòu)造方法。

            

        public SystemServer() {

        // 檢查工程模式.
        mFactoryTestMode = FactoryTest.getMode();
        // 判斷是否是重啟
        mRuntimeRestart = "1".equals(SystemProperties.get("sys.boot_completed"));

        mRuntimeStartElapsedTime = SystemClock.elapsedRealtime();
        mRuntimeStartUptime = SystemClock.uptimeMillis();
        }

        private void run() {
        ... ...
        }
        五、SystemServer Run 方法初始與啟動(dòng)

        1.SystemServer Run 方法

            

        private void run() {

        try {
        traceBeginAndSlog("InitBeforeStartServices");
        //初始化時(shí)間
        if (System.currentTimeMillis() < EARLIEST_SUPPORTED_TIME) {
        Slog.w(TAG, "System clock is before 1970; setting to 1970.");
        SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME);
        }

        //設(shè)置默認(rèn)時(shí)區(qū)
        String timezoneProperty = SystemProperties.get("persist.sys.timezone");
        if (timezoneProperty == null || timezoneProperty.isEmpty()) {
        Slog.w(TAG, "Timezone not set; setting to GMT.");
        SystemProperties.set("persist.sys.timezone", "GMT");
        }
        ... ...

        // 開始進(jìn)入Android SystemServer
        Slog.i(TAG, "Entered the Android system server!");
        int uptimeMillis = (int) SystemClock.elapsedRealtime();
        EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_SYSTEM_RUN, uptimeMillis);
        if (!mRuntimeRestart) {
        MetricsLogger.histogram(null, "boot_system_server_init", uptimeMillis);
        }
        ... ...

        //如果支持指紋,需初始化指紋ro.build.fingerprint
        Build.ensureFingerprintProperty();

        ... ...

        // 初始化 native services.
        System.loadLibrary("android_servers");

        // 檢查最近一次關(guān)機(jī)是否失敗
        performPendingShutdown();

        // 初始化 the system context.
        createSystemContext();

        // 創(chuàng)建 system service manager.
        mSystemServiceManager = new SystemServiceManager(mSystemContext);
        mSystemServiceManager.setStartInfo(mRuntimeRestart,
        mRuntimeStartElapsedTime, mRuntimeStartUptime);
        LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
        // 初始化SystemServer 線程池
        SystemServerInitThreadPool.get();
        } finally {
        traceEnd(); // InitBeforeStartServices
        }
        ... ...

        // 開始啟動(dòng) services.
        try {
        traceBeginAndSlog("StartServices");
        // 1. 啟動(dòng)引導(dǎo)服務(wù) 詳見分析六
        startBootstrapServices();
        // 2. 啟動(dòng)核心服務(wù) 詳見分析七
        startCoreServices();
        // 3.啟動(dòng)其他服務(wù) 詳見分析八
        startOtherServices();
        SystemServerInitThreadPool.shutdown();
        } catch (Throwable ex) {
        Slog.e("System", "******************************************");
        Slog.e("System", "************ Failure starting system services", ex);
        throw ex;
        } finally {
        traceEnd();
        }

        StrictMode.initVmDefaults(null);


        }
        六、SystemServer 的引導(dǎo)服務(wù)有哪些

        SystemServer啟動(dòng)的常用引導(dǎo)服務(wù)有installed 、DeviceIdentifiersPolicyService、 ActivityManagerService.、PowerManagerService 、 RecoverySystemService 、 LightsService 、 PackageManagerService、UserManagerService、OverlayManagerService等。

        e480c3df857e11e5cf7b2c985d258979.webp

        啟動(dòng)的引導(dǎo)服務(wù)的大致流程

        1.startBootstrapServices代碼

                /**
        * Starts the small tangle of critical services that are needed to get
        * the system off the ground. These services have complex mutual dependencies
        * which is why we initialize them all in one place here. Unless your service
        * is also entwined in these dependencies, it should be initialized in one of
        * the other functions.
        */

        private void startBootstrapServices() {
        Slog.i(TAG, "Reading configuration...");
        final String TAG_SYSTEM_CONFIG = "ReadingSystemConfig";
        traceBeginAndSlog(TAG_SYSTEM_CONFIG);
        SystemServerInitThreadPool.get().submit(SystemConfig::getInstance, TAG_SYSTEM_CONFIG);
        traceEnd();

        // 啟動(dòng) installed
        traceBeginAndSlog("StartInstaller");
        Installer installer = mSystemServiceManager.startService(Installer.class);
        traceEnd();

        //啟動(dòng) 設(shè)備標(biāo)識(shí)符 服務(wù)
        traceBeginAndSlog("DeviceIdentifiersPolicyService");
        mSystemServiceManager.startService(DeviceIdentifiersPolicyService.class);
        traceEnd();

        // 啟動(dòng) AMS.
        traceBeginAndSlog("StartActivityManager");
        mActivityManagerService = mSystemServiceManager.startService(
        ActivityManagerService.Lifecycle.class).getService();
        mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
        mActivityManagerService.setInstaller(installer);
        traceEnd();

        //啟動(dòng) PMS
        traceBeginAndSlog("StartPowerManager");
        mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);
        traceEnd();

        //初始化電源管理功能
        traceBeginAndSlog("InitPowerManagement");
        mActivityManagerService.initPowerManagement();
        traceEnd();

        // 啟動(dòng) RecoverySystemService
        traceBeginAndSlog("StartRecoverySystemService");
        mSystemServiceManager.startService(RecoverySystemService.class);
        traceEnd();

        // 為啟動(dòng)事件添加記錄
        RescueParty.noteBoot(mSystemContext);

        // 啟動(dòng) LightsService 管理LEDs 和背光顯示
        traceBeginAndSlog("StartLightsService");
        mSystemServiceManager.startService(LightsService.class);
        traceEnd();

        traceBeginAndSlog("StartSidekickService");
        // Package manager isn't started yet; need to use SysProp not hardware feature
        if (SystemProperties.getBoolean("config.enable_sidekick_graphics", false)) {
        mSystemServiceManager.startService(WEAR_SIDEKICK_SERVICE_CLASS);
        }
        traceEnd();

        // Display manager is needed to provide display metrics before package manager
        // starts up.
        traceBeginAndSlog("StartDisplayManager");
        mDisplayManagerService = mSystemServiceManager.startService(LightsService.class);
        traceEnd();

        // We need the default display before we can initialize the package manager.
        traceBeginAndSlog("WaitForDisplay");
        mSystemServiceManager.startBootPhase(SystemService.PHASE_WAIT_FOR_DEFAULT_DISPLAY);
        traceEnd();

        // Only run "core" apps if we're encrypting the device.
        String cryptState = SystemProperties.get("vold.decrypt");
        if (ENCRYPTING_STATE.equals(cryptState)) {
        Slog.w(TAG, "Detected encryption in progress - only parsing core apps");
        mOnlyCore = true;
        } else if (ENCRYPTED_STATE.equals(cryptState)) {
        Slog.w(TAG, "Device encrypted - only parsing core apps");
        mOnlyCore = true;
        }

        // 啟動(dòng) PackageManagerService
        if (!mRuntimeRestart) {
        MetricsLogger.histogram(null, "boot_package_manager_init_start",
        (int) SystemClock.elapsedRealtime());
        }
        traceBeginAndSlog("StartPackageManagerService");
        mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
        mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
        mFirstBoot = mPackageManagerService.isFirstBoot();
        mPackageManager = mSystemContext.getPackageManager();
        traceEnd();
        if (!mRuntimeRestart && !isFirstBootOrUpgrade()) {
        MetricsLogger.histogram(null, "boot_package_manager_init_ready",
        (int) SystemClock.elapsedRealtime());
        }
        // Manages A/B OTA dexopting. This is a bootstrap service as we need it to rename
        // A/B artifacts after boot, before anything else might touch/need them.
        // Note: this isn't needed during decryption (we don't have /data anyways).
        if (!mOnlyCore) {
        boolean disableOtaDexopt = SystemProperties.getBoolean("config.disable_otadexopt",
        false);
        if (!disableOtaDexopt) {
        traceBeginAndSlog("StartOtaDexOptService");
        try {
        OtaDexoptService.main(mSystemContext, mPackageManagerService);
        } catch (Throwable e) {
        reportWtf("starting OtaDexOptService", e);
        } finally {
        traceEnd();
        }
        }
        }
        //啟動(dòng)多用戶 UserManagerService
        traceBeginAndSlog("StartUserManagerService");
        mSystemServiceManager.startService(UserManagerService.LifeCycle.class);
        traceEnd();

        // 初始化屬性緩存
        traceBeginAndSlog("InitAttributerCache");
        AttributeCache.init(mSystemContext);
        traceEnd();

        // Set up the Application instance for the system process and get started.
        traceBeginAndSlog("SetSystemProcess");
        mActivityManagerService.setSystemProcess();
        traceEnd();

        // DisplayManagerService needs to setup android.display scheduling related policies
        // since setSystemProcess() would have overridden policies due to setProcessGroup
        mDisplayManagerService.setupSchedulerPolicies();

        /// M: CTA requirement - permission control @{
        /*
        * M: MOTA for CTA permissions handling
        * This function is used for granting CTA permissions after OTA upgrade.
        * This should be placed after AMS is added to ServiceManager and before
        * starting other services since granting permissions needs AMS instance
        * to do permission checking.
        */

        mPackageManagerService.onAmsAddedtoServiceMgr();
        /// @}

        // 啟動(dòng) OverlayManagerService
        traceBeginAndSlog("StartOverlayManagerService");
        mSystemServiceManager.startService(new OverlayManagerService(mSystemContext, installer));
        traceEnd();

        // The sensor service needs access to package manager service, app ops
        // service, and permissions service, therefore we start it after them.
        // Start sensor service in a separate thread. Completion should be checked
        // before using it.
        mSensorServiceStart = SystemServerInitThreadPool.get().submit(() -> {
        TimingsTraceLog traceLog = new TimingsTraceLog(
        SYSTEM_SERVER_TIMING_ASYNC_TAG, Trace.TRACE_TAG_SYSTEM_SERVER);
        traceLog.traceBegin(START_SENSOR_SERVICE);
        startSensorService();
        traceLog.traceEnd();
        }, START_SENSOR_SERVICE);
        }


        七、SystemServer 的核心服務(wù)有哪些

        1.SystemServer 核心服務(wù)

        有 BatteryService 、UsageStatsService、WebViewUpdateService、BinderCallsStatsService4種核心服務(wù)。

        7ce8b4b20c988acfbafb0d2297dbf1a0.webp

        SystemServer 4種核心服務(wù)

        2.startCoreServices 代碼

                /**
        * Starts some essential services that are not tangled up in the bootstrap process.
        */

        private void startCoreServices() {
        // 啟動(dòng) BatteryService 管理電池服務(wù)(電壓、電量、溫度)
        traceBeginAndSlog("StartBatteryService");
        // Tracks the battery level. Requires LightService.
        mSystemServiceManager.startService(BatteryService.class);
        traceEnd();

        // 啟動(dòng) UsageStatsService 收集應(yīng)用持久化數(shù)據(jù)的服務(wù)
        traceBeginAndSlog("StartUsageService");
        mSystemServiceManager.startService(UsageStatsService.class);
        mActivityManagerService.setUsageStatsManager(
        LocalServices.getService(UsageStatsManagerInternal.class));
        traceEnd();

        // 啟動(dòng) WebViewUpdateService 監(jiān)視 WebView 是否更新
        if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_WEBVIEW)) {
        traceBeginAndSlog("StartWebViewUpdateService");
        mWebViewUpdateService = mSystemServiceManager.startService(WebViewUpdateService.class);
        traceEnd();
        }

        //啟動(dòng) CPU Binder 調(diào)度服務(wù)
        traceBeginAndSlog("StartBinderCallsStatsService");
        BinderCallsStatsService.start();
        traceEnd();
        }

        八、SystemServer 的其他服務(wù)有哪些

        1.startOtherServices 啟動(dòng)的服務(wù)主要有:

        KeyChainSystemService、TelecomLoaderService、AccountManagerService、ContentService、DropBoxManagerService、VibratorService、AlarmManagerService、Watchdog、 InputManagerService、WindowManagerService、IpConnectivityMetrics、NetworkWatchlistService、PinnerService等服務(wù)。

        c1f0f8119bbbd8fec7b0932471ff4b40.webp

        SystemServer 的其他服務(wù)

        2.startOtherServices 代碼

                /**
        * Starts a miscellaneous grab bag of stuff that has yet to be refactored
        * and organized.
        */

        private void startOtherServices() {
        ... ...


        traceBeginAndSlog("StartKeyAttestationApplicationIdProviderService");
        ServiceManager.addService("sec_key_att_app_id_provider",
        new KeyAttestationApplicationIdProviderService(context));
        traceEnd();
        // 啟動(dòng) KeyChainSystemService
        traceBeginAndSlog("StartKeyChainSystemService");
        mSystemServiceManager.startService(KeyChainSystemService.class);
        traceEnd();

        traceBeginAndSlog("StartSchedulingPolicyService");
        ServiceManager.addService("scheduling_policy", new SchedulingPolicyService());
        traceEnd();
        // 啟動(dòng) TelecomLoaderService
        traceBeginAndSlog("StartTelecomLoaderService");
        mSystemServiceManager.startService(TelecomLoaderService.class);
        traceEnd();

        traceBeginAndSlog("StartTelephonyRegistry");
        telephonyRegistry = new TelephonyRegistry(context);
        ServiceManager.addService("telephony.registry", telephonyRegistry);
        traceEnd();

        traceBeginAndSlog("StartEntropyMixer");
        mEntropyMixer = new EntropyMixer(context);
        traceEnd();

        mContentResolver = context.getContentResolver();

        // 啟動(dòng) 用戶管理服務(wù) ,必現(xiàn)在StartContentService 之前
        traceBeginAndSlog("StartAccountManagerService");
        mSystemServiceManager.startService(ACCOUNT_SERVICE_CLASS);
        traceEnd();
        // 啟動(dòng) ContentService
        traceBeginAndSlog("StartContentService");
        mSystemServiceManager.startService(CONTENT_SERVICE_CLASS);
        traceEnd();
        // 安裝系統(tǒng)Provider 例如 SettingProvider CantacttProvider
        traceBeginAndSlog("InstallSystemProviders");
        mActivityManagerService.installSystemProviders();
        // Now that SettingsProvider is ready, reactivate SQLiteCompatibilityWalFlags
        SQLiteCompatibilityWalFlags.reset();
        traceEnd();

        // 啟動(dòng) DropBoxManagerService
        // 由于 依賴SettingsProvider,必須在InstallSystemProviders之后啟動(dòng)
        traceBeginAndSlog("StartDropBoxManager");
        mSystemServiceManager.startService(DropBoxManagerService.class);
        traceEnd();
        //啟動(dòng) VibratorService 震動(dòng)服務(wù)
        traceBeginAndSlog("StartVibratorService");
        vibrator = new VibratorService(context);
        ServiceManager.addService("vibrator", vibrator);
        traceEnd();

        if (!isWatch) {
        traceBeginAndSlog("StartConsumerIrService");
        consumerIr = new ConsumerIrService(context);
        ServiceManager.addService(Context.CONSUMER_IR_SERVICE, consumerIr);
        traceEnd();
        }
        // 啟動(dòng) AlarmManagerService
        traceBeginAndSlog("StartAlarmManagerService");
        if(!sMtkSystemServerIns.startMtkAlarmManagerService()){
        mSystemServiceManager.startService(AlarmManagerService.class);
        }
        traceEnd();
        // 初始化 看門狗
        traceBeginAndSlog("InitWatchdog");
        final Watchdog watchdog = Watchdog.getInstance();
        watchdog.init(context, mActivityManagerService);
        traceEnd();
        //啟動(dòng) InputManagerService
        traceBeginAndSlog("StartInputManagerService");
        inputManager = new InputManagerService(context);
        traceEnd();
        //啟動(dòng) WindowManagerService
        traceBeginAndSlog("StartWindowManagerService");
        // WMS needs sensor service ready
        ConcurrentUtils.waitForFutureNoInterrupt(mSensorServiceStart, START_SENSOR_SERVICE);
        mSensorServiceStart = null;
        wm = WindowManagerService.main(context, inputManager,
        mFactoryTestMode != FactoryTest.FACTORY_TEST_LOW_LEVEL,
        !mFirstBoot, mOnlyCore, new PhoneWindowManager());
        ServiceManager.addService(Context.WINDOW_SERVICE, wm, /* allowIsolated= */ false,
        DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PROTO);
        ServiceManager.addService(Context.INPUT_SERVICE, inputManager,
        /* allowIsolated= */ false, DUMP_FLAG_PRIORITY_CRITICAL);
        traceEnd();

        traceBeginAndSlog("SetWindowManagerService");
        mActivityManagerService.setWindowManager(wm);
        traceEnd();

        traceBeginAndSlog("WindowManagerServiceOnInitReady");
        wm.onInitReady();
        traceEnd();

        // Start receiving calls from HIDL services. Start in in a separate thread
        // because it need to connect to SensorManager. This have to start
        // after START_SENSOR_SERVICE is done.
        SystemServerInitThreadPool.get().submit(() -> {
        TimingsTraceLog traceLog = new TimingsTraceLog(
        SYSTEM_SERVER_TIMING_ASYNC_TAG, Trace.TRACE_TAG_SYSTEM_SERVER);
        traceLog.traceBegin(START_HIDL_SERVICES);
        startHidlServices();
        traceLog.traceEnd();
        }, START_HIDL_SERVICES);

        if (!isWatch) {
        traceBeginAndSlog("StartVrManagerService");
        mSystemServiceManager.startService(VrManagerService.class);
        traceEnd();
        }

        traceBeginAndSlog("StartInputManager");
        inputManager.setWindowManagerCallbacks(wm.getInputMonitor());
        inputManager.start();
        traceEnd();

        // TODO: Use service dependencies instead.
        traceBeginAndSlog("DisplayManagerWindowManagerAndInputReady");
        mDisplayManagerService.windowManagerAndInputReady();
        traceEnd();

        // Skip Bluetooth if we have an emulator kernel
        // TODO: Use a more reliable check to see if this product should
        // support Bluetooth - see bug 988521
        if (isEmulator) {
        Slog.i(TAG, "No Bluetooth Service (emulator)");
        } else if (mFactoryTestMode == FactoryTest.FACTORY_TEST_LOW_LEVEL) {
        Slog.i(TAG, "No Bluetooth Service (factory test)");
        } else if (!context.getPackageManager().hasSystemFeature
        (PackageManager.FEATURE_BLUETOOTH)) {
        Slog.i(TAG, "No Bluetooth Service (Bluetooth Hardware Not Present)");
        } else {
        traceBeginAndSlog("StartBluetoothService");
        mSystemServiceManager.startService(BluetoothService.class);
        traceEnd();
        }
        // 啟動(dòng) IpConnectivityMetrics
        traceBeginAndSlog("IpConnectivityMetrics");
        mSystemServiceManager.startService(IpConnectivityMetrics.class);
        traceEnd();
        // 啟動(dòng) NetworkWatchlistService
        traceBeginAndSlog("NetworkWatchlistService");
        mSystemServiceManager.startService(NetworkWatchlistService.Lifecycle.class);
        traceEnd();
        // 啟動(dòng) PinnerService
        traceBeginAndSlog("PinnerService");
        mSystemServiceManager.startService(PinnerService.class);
        traceEnd();
        } catch (RuntimeException e) {

        至此,本篇已結(jié)束。轉(zhuǎn)載網(wǎng)絡(luò)的文章,小編覺得很優(yōu)秀,歡迎點(diǎn)擊閱讀原文,支持原創(chuàng)作者,如有侵權(quán),懇請(qǐng)聯(lián)系小編刪除。同時(shí)感謝您的閱讀,期待您的關(guān)注。

        點(diǎn)個(gè)在看,方便您使用時(shí)快速查找!

        瀏覽 46
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
          
          

            1. 91色秘 乱一区二区三区 | 一级黄色操逼大片 | 黄色成人网站在线观看免费 | 91精品人妻 | 一呦二呦三呦国产精品 |