zoukankan      html  css  js  c++  java
  • Android 9.0 SystemServer 启动分析


    极力推荐文章:欢迎收藏
    Android 干货分享

    本篇文章主要介绍 Android 开发中 SystemServer进程启动 部分知识点,通过阅读本篇文章,您将收获以下内容:

    一、SystemServer 启动的服务有哪些
    二、SystemServer启动总体流程概述
    三、SystemServer 如何启动,是谁启动的?
    四、 SystemServer 启动入门 main 方法
    五、SystemServer Run 方法初始与启动
    六、SystemServer 的引导服务有哪些
    七、SystemServer 的核心服务有哪些
    八、SystemServer 的其他服务有哪些

    一、SystemServer 启动的服务有哪些

    SystemServer 主要启动 ActivityManagerServicePackageManagerServiceWindowManagerServiceLightsServiceLightsServiceBatteryServiceTelephonyRegistryRecoverySystemService 等等,主要分三大类,后文会详细列举。

    SystemServer 启动的服务 作用如下:

    SystemServer  启动的服务

    SystemServer  启动的服务

    二、SystemServer启动总体流程概述

    SystemServer 代码路径:

    alpsframeworksaseservicesjavacomandroidserverSystemServer.java

    SystemServer 进程启动导图

    三、SystemServer 如何启动,是谁启动的?

    SystemServer 是通过Zygote 启动的,在ZygoteInit.java类的(frameworksasecorejavacomandroidinternalosygoteInit.java) main 方法中通过forkSystemServer 启动。

    
        public static void main(String argv[]) {
            ....
                //设置变量区分是否启动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])) {
                       // 需要启动时候,将标志位设置为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.
         */
        public static void main(String[] args) {
            new SystemServer().run();
        }
    

    通过Main 入口,调用SystemServer 构造方法。

        public SystemServer() {
            // 检查工程模式.
            mFactoryTestMode = FactoryTest.getMode();
            // 判断是否是重启
            mRuntimeRestart = "1".equals(SystemProperties.get("sys.boot_completed"));
    
            mRuntimeStartElapsedTime = SystemClock.elapsedRealtime();
            mRuntimeStartUptime = SystemClock.uptimeMillis();
        }
    
        private void run() {
           ... ...
        }
    

    五、SystemServer Run 方法初始与启动

    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);
                }
    
                //设置默认时区
                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");
                }
                ... ... 
    
                // 开始进入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");
    
                // 检查最近一次关机是否失败
                performPendingShutdown();
    
                // 初始化 the system context.
                createSystemContext();
    
                // 创建 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. 启动引导服务  详见分析六
                startBootstrapServices();
                // 2. 启动核心服务  详见分析七
                startCoreServices();
                // 3.启动其他服务  详见分析八
                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 的引导服务有哪些

    SystemServer启动的常用引导服务有 installed 、DeviceIdentifiersPolicyService、 ActivityManagerService.、PowerManagerService 、 RecoverySystemService 、 LightsService 、 PackageManagerService、UserManagerService、OverlayManagerService等。

    启动的引导服务的大致流程

    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();
    
            //启动 设备标识符 服务
            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 的核心服务有哪些

    SystemServer 核心服务 有 BatteryService 、UsageStatsService、WebViewUpdateService、BinderCallsStatsService 4种核心服务。

    SystemServer 4种核心服务

    startCoreServices 代码部分如下:

    
        /**
         * Starts some essential services that are not tangled up in the bootstrap process.
         */
        private void startCoreServices() {
            // 启动 BatteryService 管理电池服务(电压、电量、温度)
            traceBeginAndSlog("StartBatteryService");
            // Tracks the battery level.  Requires LightService.
            mSystemServiceManager.startService(BatteryService.class);
            traceEnd();
    
            // 启动 UsageStatsService 收集应用持久化数据的服务
            traceBeginAndSlog("StartUsageService");
            mSystemServiceManager.startService(UsageStatsService.class);
            mActivityManagerService.setUsageStatsManager(
                    LocalServices.getService(UsageStatsManagerInternal.class));
            traceEnd();
    
            // 启动 WebViewUpdateService 监视 WebView 是否更新
            if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_WEBVIEW)) {
                traceBeginAndSlog("StartWebViewUpdateService");
                mWebViewUpdateService = mSystemServiceManager.startService(WebViewUpdateService.class);
                traceEnd();
            }
    
            //启动 CPU Binder 调度服务
            traceBeginAndSlog("StartBinderCallsStatsService");
            BinderCallsStatsService.start();
            traceEnd();
        }
    
    

    八、SystemServer 的其他服务有哪些

    startOtherServices 启动的服务主要有: KeyChainSystemService、TelecomLoaderService、AccountManagerService、ContentService、DropBoxManagerService、VibratorService、AlarmManagerService、Watchdog、 InputManagerService、WindowManagerService、IpConnectivityMetrics、NetworkWatchlistService、PinnerService等服务。

    SystemServer 的其他服务

    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();
    
                // 启动 用户管理服务 ,必现在StartContentService 之前
                traceBeginAndSlog("StartAccountManagerService");
                mSystemServiceManager.startService(ACCOUNT_SERVICE_CLASS);
                traceEnd();
                // 启动 ContentService
                traceBeginAndSlog("StartContentService");
                mSystemServiceManager.startService(CONTENT_SERVICE_CLASS);
                traceEnd();
                // 安装系统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 震动服务
                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) {
    
    

    至此,本篇已结束,如有不对的地方,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!

    微信关注公众号:  程序员Android,领福利

  • 相关阅读:
    POJ3094 UVALive3594 HDU2734 ZOJ2812 Quicksum【进制】
    UVALive5583 UVA562 Dividing coins
    POJ1979 HDU1312 Red and Black【DFS】
    POJ1979 HDU1312 Red and Black【DFS】
    POJ2386 Lake Counting【DFS】
    POJ2386 Lake Counting【DFS】
    HDU4394 Digital Square
    HDU4394 Digital Square
    UVA213 UVALive5152 Message Decoding
    UVA213 UVALive5152 Message Decoding
  • 原文地址:https://www.cnblogs.com/wangjie1990/p/11310917.html
Copyright © 2011-2022 走看看