SystemUI启动分析

简介: SystemUI启动分析

一、前言



SystemUI 主要负责显示系统、应用状态,主要有以下几部分组成:导航栏(NavigationBar),快捷开关面板(QSPanel)和最近开启的应用面板(RecentPanel)状、态栏(StatusBar)及锁屏音量调节对话框、RingTonePlayer播发器界面、通知栏(Notification Panel)、PowerUI界面等等。


图片


StatusBar:状态显示(时间、电量、信号、蓝牙、GPS,Wifi、应用Icon)及通知消息提示。


NavigationBar:返回,HOME键,Recent(最近任务栏)


Recents:近期应用管理,以堆叠栈的形式展现。


KeyGuard:锁屏模块,保护个人信息。


Notification Panel:展示系统或应用通知信息,提供便捷的系统设置开关(亮度、wifi、蓝牙、数据、飞行模式、手电筒、位置信息、设置等内容)。


screenshot:长按电源键+音量下键后截屏,用以展示截取的屏幕照片/内容


PowerUI:主要处理和Power相关的事件,比如省电模式切换、电池电量变化和开关屏事件等。


RingtonePlayer:铃声播放


VolumeUI:来用展示或控制音量的变化:媒体音量、铃声音量与闹钟音量



二、启动分析



Android系统启动流程:


按下电源,系统上电


从固定地址启动固化在ROM的BootLoader程序


启动Linux内核,加载init进程


启动init进程,fork出zygote进程


启动SystemServer,启动Binder线程池以及各种服务


AMS启动Launcher, 然后你就看到该看到的了


SystemUI作为系统主要进程,就是在SystemServer启动的服务其中之一。

话不多说,read the fucking source code:


SystemServer.java


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


private void run() {
        ......
          // Start services.
    try {
        traceBeginAndSlog("StartServices");
        startBootstrapServices();
        startCoreServices();
        startOtherServices();
        SystemServerInitThreadPool.shutdown();
    } catch (Throwable ex) {
        Slog.e("System", "******************************************");
        Slog.e("System", "************ Failure starting system services", ex);
        throw ex;
    } finally {
        traceEnd();
    }
    ......


}


private void startOtherServices() {
  ......
    mActivityManagerService.systemReady(() -> {
        Slog.i(TAG, "Making services ready");
        traceBeginAndSlog("StartActivityManagerReadyPhase");
        ......
        try {
            startSystemUi(context, windowManagerF);
        } catch (Throwable e) {
            reportWtf("starting System UI", e);
        }
        ......
   }
}
static final void startSystemUi(Context context, WindowManagerService windowManager) {
    Intent intent = new Intent();
    intent.setComponent(new ComponentName("com.android.systemui",
                "com.android.systemui.SystemUIService"));
    intent.addFlags(Intent.FLAG_DEBUG_TRIAGED_MISSING);
    //Slog.d(TAG, "Starting service: " + intent);
    context.startServiceAsUser(intent, UserHandle.SYSTEM);
    windowManager.onSystemUiStarted();
}


总结下代码流程:SystemServermain()方法会调用SystemServer.run()方法,在run方法中,会启动bootStrapService,coreService,以及其他服务otherService,在startOtherServices()中,会注册AMS的systemReady回调,在回调中启动SystemUI,其实就是启动了SystemUIService。


SystemUIService.java


@Override
    public void onCreate() {
        super.onCreate();
        ((SystemUIApplication) getApplication()).startServicesIfNeeded();
        .....
    }
SystemUIApplication.java
@Override
    public void startServicesIfNeeded() {
        String[] names = getResources().getStringArray(R.array.config_systemUIServiceComponents);
        startServicesIfNeeded(names);
    }
  private void startServicesIfNeeded(String[] services) {
        if (mServicesStarted) {
            return;
        }
        mServices = new SystemUI[services.length];


 

if (!mBootCompleted) {
        // check to see if maybe it was already completed long before we began
        // see ActivityManagerService.finishBooting()
        if ("1".equals(SystemProperties.get("sys.boot_completed"))) {
            mBootCompleted = true;
            if (DEBUG) Log.v(TAG, "BOOT_COMPLETED was already sent");
        }
    }
    Log.v(TAG, "Starting SystemUI services for user " +
            Process.myUserHandle().getIdentifier() + ".");
    TimingsTraceLog log = new TimingsTraceLog("SystemUIBootTiming",
            Trace.TRACE_TAG_APP);
    log.traceBegin("StartServices");
    final int N = services.length;
    for (int i = 0; i < N; i++) {
        String clsName = services[i];
        if (DEBUG) Log.d(TAG, "loading: " + clsName);
        log.traceBegin("StartServices" + clsName);
        long ti = System.currentTimeMillis();
        Class cls;
        try {
            cls = Class.forName(clsName);
            mServices[i] = (SystemUI) cls.newInstance();
        } catch(ClassNotFoundException ex){
            throw new RuntimeException(ex);
        } catch (IllegalAccessException ex) {
            throw new RuntimeException(ex);
        } catch (InstantiationException ex) {
            throw new RuntimeException(ex);
        }
        mServices[i].mContext = this;
        mServices[i].mComponents = mComponents;
        if (DEBUG) Log.d(TAG, "running: " + mServices[i]);
        mServices[i].start();
        ......
    }
}


<string-array name="config_systemUIServiceComponents" translatable="false">
    <item>com.android.systemui.Dependency</item>
    <item>com.android.systemui.util.NotificationChannels</item>
    <item>com.android.systemui.statusbar.CommandQueue$CommandQueueStart</item>
    <item>com.android.systemui.keyguard.KeyguardViewMediator</item>
    <item>com.android.systemui.recents.Recents</item>
    <item>com.android.systemui.volume.VolumeUI</item>
    <item>com.android.systemui.stackdivider.Divider</item>
    <item>com.android.systemui.SystemBars</item>
    <item>com.android.systemui.usb.StorageNotification</item>
    <item>com.android.systemui.power.PowerUI</item>
    <item>com.android.systemui.media.RingtonePlayer</item>
    <item>com.android.systemui.keyboard.KeyboardUI</item>
    <item>com.android.systemui.pip.PipUI</item>
    <item>com.android.systemui.shortcut.ShortcutKeyDispatcher</item>
    <item>@string/config_systemUIVendorServiceComponent</item>
    <item>com.android.systemui.util.leak.GarbageMonitor$Service</item>
    <item>com.android.systemui.LatencyTester</item>
    <item>com.android.systemui.globalactions.GlobalActionsComponent</item>
    <item>com.android.systemui.ScreenDecorations</item>
    <item>com.android.systemui.fingerprint.FingerprintDialogImpl</item>
    <item>com.android.systemui.SliceBroadcastRelayHandler</item>
</string-array>
<!-- SystemUI vender service, used in config_systemUIServiceComponents. -->
<string name="config_systemUIVendorServiceComponent" translatable="false">com.android.systemui.VendorServices</string>


SystemUIService的onCreate()方法中,直接调用SystemUIApplication.startServicesIfNeeded()方法,最终会将所有服务一一加载并通过start()方法启动起来。


至此,SystemUI基本启动流程就结束了。


相关文章
|
Android开发 数据安全/隐私保护 容器
Android10.0 SystemUI—锁屏加载分析
Android10.0 SystemUI—锁屏加载分析
1356 0
Android10.0 SystemUI—锁屏加载分析
|
7月前
|
Java Android开发 容器
SystemUI 的启动过程
SystemUI 的启动过程
71 3
|
7月前
|
存储 前端开发 Android开发
Andorid Launcher程序代码分析
Andorid Launcher程序代码分析
37 1
|
Android开发
[√]Android 通过adb内存监测方法
[√]Android 通过adb内存监测方法
540 1
|
监控 Java Android开发
Launcher点击图标启动App流程分析(基于Android N)1
Launcher点击图标启动App流程分析(基于Android N)
114 0
|
Java Android开发
Android 7.1 SystemUI近期任务打开应用流程
Android 7.1 SystemUI近期任务打开应用流程
410 0
Android 7.1 SystemUI近期任务打开应用流程
|
XML 数据库 网络虚拟化
Android8.1 MTK平台 SystemUI源码分析之 网络信号栏显示刷新(上)
Android8.1 MTK平台 SystemUI源码分析之 网络信号栏显示刷新
337 0
|
XML Java Android开发
Android8.1 MTK平台 SystemUI源码分析之 网络信号栏显示刷新(下)
Android8.1 MTK平台 SystemUI源码分析之 网络信号栏显示刷新(下)
239 0
|
Java Android开发
Android核心服务解析篇(三)——Android系统的启动(二)
Android核心服务解析篇(三)——Android系统的启动(二)
374 0
Android核心服务解析篇(三)——Android系统的启动(二)