<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          SystemServer 流程分析

          共 18120字,需瀏覽 37分鐘

           ·

          2024-04-01 04:30

          d68e1012fa3002c71ddd36f16cac38d9.webp

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

          經(jīng)典好文推薦,通過閱讀本文,您將收獲以下知識點:

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

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

          SystemServer 主要啟動 ActivityManagerServicePackageManagerService、WindowManagerService、LightsServiceLightsService、BatteryService、TelephonyRegistryRecoverySystemService 等等,主要分三大類,后文會詳細(xì)列舉。

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

          693022deaed750e3ff085bcafe3055d1.webp

          SystemServer 啟動的服務(wù)

          49a1a9979c20acfc1d0e7effca2e32c7.webp

          SystemServer 啟動的服務(wù)

          二、SystemServer啟動總體流程概述

          1.SystemServer 代碼

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

          97624f66ed0983242fd4444a9b292bd0.webp

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

          三、SystemServer 如何啟動,是誰啟動的?

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

                  public static void main(String argv[]) {
          ....
          //設(shè)置變量區(qū)分是否啟動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])) {
          // 需要啟動時候,將標(biāo)志位設(shè)置為true
          startSystemServer = true;
          } else if ("--enable-lazy-preload".equals(argv[i])) {
          enableLazyPreload = true;
          }
          ... ...

          if (startSystemServer) {
          // 通過 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 啟動入門 main 方法

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

          main 入口代碼如下:

              

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

          * The main entry point from zygote.
          */

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

          通過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 方法初始與啟動

          1.SystemServer Run 方法

              

          private void run() {

          try {
          traceBeginAndSlog("InitBeforeStartServices");
          //初始化時間
          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)時區(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
          }
          ... ...

          // 開始啟動 services.
          try {
          traceBeginAndSlog("StartServices");
          // 1. 啟動引導(dǎo)服務(wù) 詳見分析六
          startBootstrapServices();
          // 2. 啟動核心服務(wù) 詳見分析七
          startCoreServices();
          // 3.啟動其他服務(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ǎo)服務(wù)有installed 、DeviceIdentifiersPolicyService、 ActivityManagerService.、PowerManagerService 、 RecoverySystemService 、 LightsService 、 PackageManagerService、UserManagerService、OverlayManagerService等。

          e480c3df857e11e5cf7b2c985d258979.webp

          啟動的引導(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();

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

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

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

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

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

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

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

          // 啟動 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;
          }

          // 啟動 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();
          }
          }
          }
          //啟動多用戶 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();
          /// @}

          // 啟動 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() {
          // 啟動 BatteryService 管理電池服務(wù)(電壓、電量、溫度)
          traceBeginAndSlog("StartBatteryService");
          // Tracks the battery level. Requires LightService.
          mSystemServiceManager.startService(BatteryService.class);
          traceEnd();

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

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

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

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

          1.startOtherServices 啟動的服務(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();
          // 啟動 KeyChainSystemService
          traceBeginAndSlog("StartKeyChainSystemService");
          mSystemServiceManager.startService(KeyChainSystemService.class);
          traceEnd();

          traceBeginAndSlog("StartSchedulingPolicyService");
          ServiceManager.addService("scheduling_policy", new SchedulingPolicyService());
          traceEnd();
          // 啟動 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();

          // 啟動 用戶管理服務(wù) ,必現(xiàn)在StartContentService 之前
          traceBeginAndSlog("StartAccountManagerService");
          mSystemServiceManager.startService(ACCOUNT_SERVICE_CLASS);
          traceEnd();
          // 啟動 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();

          // 啟動 DropBoxManagerService
          // 由于 依賴SettingsProvider,必須在InstallSystemProviders之后啟動
          traceBeginAndSlog("StartDropBoxManager");
          mSystemServiceManager.startService(DropBoxManagerService.class);
          traceEnd();
          //啟動 VibratorService 震動服務(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();
          }
          // 啟動 AlarmManagerService
          traceBeginAndSlog("StartAlarmManagerService");
          if(!sMtkSystemServerIns.startMtkAlarmManagerService()){
          mSystemServiceManager.startService(AlarmManagerService.class);
          }
          traceEnd();
          // 初始化 看門狗
          traceBeginAndSlog("InitWatchdog");
          final Watchdog watchdog = Watchdog.getInstance();
          watchdog.init(context, mActivityManagerService);
          traceEnd();
          //啟動 InputManagerService
          traceBeginAndSlog("StartInputManagerService");
          inputManager = new InputManagerService(context);
          traceEnd();
          //啟動 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();
          }
          // 啟動 IpConnectivityMetrics
          traceBeginAndSlog("IpConnectivityMetrics");
          mSystemServiceManager.startService(IpConnectivityMetrics.class);
          traceEnd();
          // 啟動 NetworkWatchlistService
          traceBeginAndSlog("NetworkWatchlistService");
          mSystemServiceManager.startService(NetworkWatchlistService.Lifecycle.class);
          traceEnd();
          // 啟動 PinnerService
          traceBeginAndSlog("PinnerService");
          mSystemServiceManager.startService(PinnerService.class);
          traceEnd();
          } catch (RuntimeException e) {

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

          點個在看,方便您使用時快速查找!

          瀏覽 46
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  色婷婷久久 | 91久操| 日本免费看黄色片视频 | 能免费看AV的网站 | 天天色天天干天天色 |