SystemUI启动流程

首先我们来看一个时序图:
SystemUI启动时序

SystemServer前面的部分不再多说,有兴趣的朋友可以参考这篇博客《Android系统启动流程》

SystemServer 名为系统服务进程,负责启动 Android 系统的关键服务。SystemServer进程其实也是由Zygote进程fork出来的,并且执行其main方法,那么这里我们以android23的源码为例,看一下SystemServer的main方法的执行逻辑:SystemServer.main():

vim frameworks/base/services/java/com/android/server/SystemServer.java

/**
     * The main entry point from zygote.
     */
    public static void main(String[] args) {
        new SystemServer().run();
    }

可以看到main()中生成了SystemServer对象并执行了run方法。
SystemServer.run():

private void run() {
		//***1. 时间判断
		
        // If a device's clock is before 1970 (before 0), a lot of
        // APIs crash dealing with negative numbers, notably
        // java.io.File#setLastModified, so instead we fake it and
        // hope that time from cell towers or NTP fixes it shortly.
        if (System.currentTimeMillis() < EARLIEST_SUPPORTED_TIME) {
            Slog.w(TAG, "System clock is before 1970; setting to 1970.");
            SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME);
        }

       ....
}

首先判断系统当前时间,若当前时间小于1970年1月1日,则一些初始化操作可能会处所,所以当系统的当前时间小于1970年1月1日的时候,设置系统当前时间为该时间点。

private void run() {
		/***1. 时间判断 ***/
		...
		/***2. 设置系统的语言环境 ***/
		// Enable the sampling profiler.
        if (SamplingProfilerIntegration.isEnabled()) {
            SamplingProfilerIntegration.start();
            mProfilerSnapshotTimer = new Timer();
            mProfilerSnapshotTimer.schedule(new TimerTask() {
                @Override
                public void run() {
                    SamplingProfilerIntegration.writeSnapshot("system_server", null);
                }
            }, SNAPSHOT_INTERVAL, SNAPSHOT_INTERVAL);
        }
        ...
}

下面的主要是设置虚拟机运行内存,加载运行库,设置SystemServer的异步消息,具体的异步消息机制可参见《 android源码解析之(二)–>异步消息机制》

private void run() {
		/***1. 时间判断 ***/
		...
		/***2. 设置系统的语言环境 ***/

		/***3. 设置运行内存等 ***/
		 // Mmmmmm... more memory!
        VMRuntime.getRuntime().clearGrowthLimit();

        // The system server has to run all of the time, so it needs to be
        // as efficient as possible with its memory usage.
        VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);

        // Some devices rely on runtime fingerprint generation, so make sure
        // we've defined it before booting further.
        Build.ensureFingerprintProperty();

        // Within the system server, it is an error to access Environment paths without
        // explicitly specifying a user.
        Environment.setUserRequired(true);

        // Ensure binder calls into the system always run at foreground priority.
        BinderInternal.disableBackgroundScheduling(true);

        // Prepare the main looper thread (this thread).
        android.os.Process.setThreadPriority(
                android.os.Process.THREAD_PRIORITY_FOREGROUND);
        android.os.Process.setCanSelfBackground(false);
        Looper.prepareMainLooper();

        // Initialize native services.
        System.loadLibrary("android_servers");
        nativeInit();

        ///M:Add for low storage feature,to delete the reserver file.@{
        try {
            Runtime.getRuntime().exec("rm -r /data/piggybank");
        } catch (IOException e) {
            Slog.e(TAG, "system server init delete piggybank fail" + e);
        }
        ///@}

        // Check whether we failed to shut down last time we tried.
        // This call may not return.
        performPendingShutdown();
	 
		 /***4.创建Context ***/
		// Initialize the system context.
        createSystemContext();
		
		/***5.new 了一个SystemServiceManager ***/
        // Create the system service manager.
        mSystemServiceManager = new SystemServiceManager(mSystemContext);
        
        /***6.把创建的SystemServiceManager加入到LocalServices ***/
        LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
		 ...
 }
private void createSystemContext() {
        ActivityThread activityThread = ActivityThread.systemMain();
        mSystemContext = activityThread.getSystemContext();
        mSystemContext.setTheme(android.R.style.Theme_DeviceDefault_Light_DarkActionBar);
    }

可以看到在SystemServer进程中也存在着Context对象,并且是通过ActivityThread.systemMain方法创建context的,这一部分的逻辑以后会通过介绍Activity的启动流程来介绍,这里就不在扩展,这里我们只知道在SystemServer进程中也需要创建Context对象。

然后将SystemServiceManager对象保存SystemServer进程中的一个数据结构中。

继续分析:

private void run() {
		/***1. 时间判断 ***/
		...
		/***2. 设置系统的语言环境 ***/

		/***3. 设置运行内存等 ***/
		
		/***4.创建Context ***/
		
		/***5.new 了一个SystemServiceManager ***/
		
		/***6.把创建的SystemServiceManager加入到LocalServices ***/

		/***7.启动服务 ***/
		// Start services.
        try {
            startBootstrapServices();
            startCoreServices();
            startOtherServices();
        } catch (Throwable ex) {
            Slog.e("System", "******************************************");
            Slog.e("System", "************ Failure starting system services", ex);
            /// M: RecoveryManagerService  @{
            if (mRecoveryManagerService != null && ex instanceof RuntimeException) {
                mRecoveryManagerService.handleException((RuntimeException)ex, true);
            }
            /// @}
        }

里面主要涉及了是三个方法:
startBootstrapServices() 主要用于启动系统Boot级服务
startCoreServices() 主要用于启动系统核心的服务
startOtherServices() 主要用于启动一些非紧要或者是非需要及时启动的服务

下面我们重点介绍这三个启动服务的方法,包括启动那些系统服务已经如何启动系统服务等。

private void startBootstrapServices() {
        /*** 1. 获取installer ***/
        Installer installer = mSystemServiceManager.startService(Installer.class);

		/*** 2. 获取并配置 mActivityManagerService ***/
		
		/*** 这段代码主要是用于启动ActivityManagerService服务,并为其设置SystemServiceManager和Installer。ActivityManagerService是系统中一个非常重要的服务,Activity,service,Broadcast,contentProvider都需要通过其与系统交互。 ***/
		/*** Lifecycle可以看到其实ActivityManagerService的一个静态内部类,在其构造方法中会创建一个ActivityManagerService,通过刚刚对Installer服务的分析我们知道,SystemServiceManager的startService方法会调用服务的onStart()方法,而在Lifecycle类的定义中我们看到其onStart()方法直接调用了mService.start()方法,mService是Lifecycle类中对ActivityManagerService的引用***/
		
        // Activity manager runs the show.
        // Activity manager runs the show.
        mActivityManagerService = mSystemServiceManager.startService(
                ActivityManagerService.Lifecycle.class).getService();
        mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
        mActivityManagerService.setInstaller(installer);
		
		/*** 3. 获取并配置 mPowerManagerService ***/

        // Power manager needs to be started early because other services need it.
        // Native daemons may be watching for it to be registered so it must be ready
        // to handle incoming binder calls immediately (including being able to verify
        // the permissions for those calls).
        mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);

        // Now that the power manager has been started, let the activity manager
        // initialize power management features.
        mActivityManagerService.initPowerManagement();
        
		/*** 4. 获取并配置 mDisplayManagerService 主要是手机显示方面的服务***/
		
		// Display manager is needed to provide display metrics before package manager
        // starts up.
        mDisplayManagerService = mSystemServiceManager.startService(DisplayManagerService.class);
        
         // We need the default display before we can initialize the package manager.
        mSystemServiceManager.startBootPhase(SystemService.PHASE_WAIT_FOR_DEFAULT_DISPLAY);

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

        /// M: RecoveryManagerService  @{
        boolean disabled = "0".equals(SystemProperties.get("ro.mtk_antibricking_level"));
        if (!disabled) {
            try {
                Slog.i(TAG, "Recovery Manager");
                mRecoveryManagerService = new RecoveryManagerService(mSystemContext);
                if (mRecoveryManagerService != null) {
                    ServiceManager.addService(Context.RECOVERY_SERVICE, mRecoveryManagerService.asBinder());
                    mRecoveryManagerService.startBootMonitor();
                }
            } catch (Throwable e) {
                reportWtf("Failure starting Recovery Manager", e);
            }
        }
        /// @}

		/*** 5. 开启PackageManagerService包管理服务  ***/
		
		/***该服务也是android系统中一个比较重要的服务,包括多apk文件的安装,解析,删除,卸载等等操作。***/
		/***PackageManagerService服务的启动方式与其他服务的启动方式有一些区别,直接调用了PackageManagerService的静态main方法,在静态方法里面也是直接使用new的方式创建了一个PackageManagerService对象,并在其构造方法中初始化相关变量。***/
		/*** 最后调用了ServiceManager.addService方法,主要是通过Binder机制与JNI层交互,这里不再扩展 ***/
        // Start the package manager.
        Slog.i(TAG, "Package Manager");
        mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
        mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
        mFirstBoot = mPackageManagerService.isFirstBoot();
        mPackageManager = mSystemContext.getPackageManager();
		
		/*** 6.然后启动UserManagerService和SensorService,至此startBootstrapServices方法执行完成。 ***/
        Slog.i(TAG, "User Service");
        ServiceManager.addService(Context.USER_SERVICE, UserManagerService.getInstance());

        // Initialize attribute cache used to cache resources from packages.
        AttributeCache.init(mSystemContext);

        // Set up the Application instance for the system process and get started.
        mActivityManagerService.setSystemProcess();
 }

我们看到里面的服务都是通过SystemServiceManager启动的,调用startService方法,文件在frameworks/base/services/core/java/com/android/server/SystemServiceManager.java
SystemServiceManager的startService但是其实就是一句话,调用了所需要调用的Service中的onStart()方法,代码这里就不贴出来了;

然后查看startCoreServices方法:

/**
     * Starts some essential services that are not tangled up in the bootstrap process.
     */
    private void startCoreServices() {
        // Manages LEDs and display backlight.
        mSystemServiceManager.startService(LightsService.class);

        // Tracks the battery level.  Requires LightService.
        mSystemServiceManager.startService(BatteryService.class);

        // Tracks application usage stats.
        mSystemServiceManager.startService(UsageStatsService.class);
        mActivityManagerService.setUsageStatsManager(
                LocalServices.getService(UsageStatsManagerInternal.class));
        // Update after UsageStatsService is available, needed before performBootDexOpt.
        mPackageManagerService.getUsageStatsIfNoPackageUsageInfo();

        // Tracks whether the updatable WebView is in a ready state and watches for update installs.
        mSystemServiceManager.startService(WebViewUpdateService.class);
    }

可以看到这里启动了BatteryService(电池相关服务),UsageStatsService,WebViewUpdateService服务等。

最后看一下startOtherServices方法,主要用于启动系统中其他的服务,代码很多,这里就不贴代码了,启动的流程和ActivityManagerService的流程类似,会调用服务的构造方法与onStart方法初始化变量。

/*** 1.读配置 ***/
/*** 比如是否禁用SystemUI ****/
...
boolean disableSystemUI = SystemProperties.getBoolean("config.disable_systemui", false);
...

/***2.初始化各种服务****/
...
Slog.i(TAG, "Init Watchdog");
final Watchdog watchdog = Watchdog.getInstance();
watchdog.init(context, mActivityManagerService);

Slog.i(TAG, "Input Manager");
inputManager = new InputManagerService(context);
...

/***3.开启各种服务****/
mSystemServiceManager.startService(NotificationManagerService.class);
notification = INotificationManager.Stub.asInterface(
		  ServiceManager.getService(Context.NOTIFICATION_SERVICE));
networkPolicy.bindNotificationManager(notification);

mSystemServiceManager.startService(DeviceStorageMonitorService.class);

/***调用各种服务的systemReady方法***/
 mActivityManagerService.systemReady(new Runnable() {
            @Override
            public void run() {
                Slog.i(TAG, "Making services ready");
				...
				try {//SystemUIService就是在这里启动的  larsonzhong@163.com
                    startSystemUi(context);
                } catch (Throwable e) {
                    reportWtf("starting System UI", e);
                }
				...
			}
}

,到了这里我们知道SystemUIService是通过组件的方式启动的,这个组件则是在编译的时候清单文件配置的方式配置到了系统中,这个SystemUIService的源码在

frameworks/base/packages/SystemUI/src/com/android/systemui/SystemUIService.java

我们继续分析;
SystemUIService的onCreate方法里面调用了Application的startServicesIfNeeded方法,就是在SystemUIService启动的时候把所有SystemUI应用里面相关服务都重新启动启动一遍;
这些服务包括:

 com.android.systemui.keyguard.KeyguardViewMediator.class,
 com.android.systemui.recent.Recents.class,
 com.android.systemui.volume.VolumeUI.class,
 com.android.systemui.statusbar.SystemBars.class,
 com.android.systemui.usb.StorageNotification.class,
 com.android.systemui.power.PowerUI.class,
 com.android.systemui.media.RingtonePlayer.class

嗯,下一节我们来分析SystemUI内部启动流程;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

疯人院的院长大人

给点实际性的支持不?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值