Android8.1 SystemUI啟動(dòng)流程

初識(shí)SystemUI

SystemUI是為用戶提供的系統(tǒng)級(jí)別的信息顯示與交互的一套UI組件叫潦,盡管它的表現(xiàn)形式與普通Android應(yīng)用程序大相徑庭洞难,但它卻是以一個(gè)apk的其實(shí)存在于系統(tǒng)之中,即它與普通android應(yīng)用程序并沒有本質(zhì)上的區(qū)別风秤。它也是通過Android四大組件來接受外界的請(qǐng)求并執(zhí)行相關(guān)操作粱檀。

SystemUI啟動(dòng)流程

1.frameworks/base/services/java/com/android/server/SystemServer.java(它是在ZygoteInit中進(jìn)行創(chuàng)建,并且啟動(dòng)起來的)

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

接下來伙菊,我們看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();
    }
   ...
}

注意上述方法中的startOtherServices()方法蛀恩,

/**
 * Starts a miscellaneous grab bag of stuff that has yet to be refactored
 * and organized.
 */
private void startOtherServices() {
     ...
     ...
  try {
            startSystemUi(context, windowManagerF);
        } catch (Throwable e) {
            reportWtf("starting System UI", e);
        }
     ...
     ...
  }

接著看StartSystemUi方法,

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();
}

以上完成了SystemUIService的啟動(dòng)過程茂浮。

2.frameworks/base/packages/SystemUI/src/com/android/systemui/SystemUIService.java
SystemUIService繼承與Service双谆,首先看重寫的onCreate方法,

 @Override
public void onCreate() {
    super.onCreate();
    ((SystemUIApplication) getApplication()).startServicesIfNeeded();

    // For debugging RescueParty
    if (Build.IS_DEBUGGABLE && SystemProperties.getBoolean("debug.crash_sysui", false)) {
        throw new RuntimeException();
    }
}

它調(diào)用了SystemUIApplication的startServicesIfNeeded()方法席揽,接下來我們看SystemUIApplication中的startServicesIfNeeded()方法
3.frameworks/base/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java

/**
 * Makes sure that all the SystemUI services are running. If they are already running, this is 
  a
 * no-op. This is needed to conditinally start all the services, as we only need to have it in
 * the main process.
 * <p>This method must only be called from the main thread.</p>
 */

public void startServicesIfNeeded() {
    startServicesIfNeeded(SERVICES);
}

接著往下跟顽馋,

private void startServicesIfNeeded(Class<?>[] services) {
    if (mServicesStarted) {
        return;
    }
     ......
     ......
    final int N = services.length;
    for (int i = 0; i < N; i++) {
        Class<?> cl = services[i];
        if (DEBUG) Log.d(TAG, "loading: " + cl);
        log.traceBegin("StartServices" + cl.getSimpleName());
        long ti = System.currentTimeMillis();
        try {

            Object newService = SystemUIFactory.getInstance().createInstance(cl);
            mServices[i] = (SystemUI) ((newService == null) ? cl.newInstance() : newService);
        } 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();
        log.traceEnd();

        // Warn if initialization of component takes too long
        ti = System.currentTimeMillis() - ti;
        if (ti > 1000) {
            Log.w(TAG, "Initialization of " + cl.getName() + " took " + ti + " ms");
        }
        if (mBootCompleted) {
            mServices[i].onBootCompleted();
        }
    }
   ...
}

可以看到,上述代碼中幌羞,有一個(gè)for循環(huán)的遍歷寸谜,那么這個(gè)service[i]是什么呢?我們可以找到代碼中初始化的地方属桦,

/**
 * The classes of the stuff to start.
 */
private final Class<?>[] SERVICES = new Class[] {
        Dependency.class,
        NotificationChannels.class,
        CommandQueue.CommandQueueStart.class,
        KeyguardViewMediator.class,
        Recents.class,
        VolumeUI.class,
        Divider.class,
        SystemBars.class,
        StorageNotification.class,
        PowerUI.class,
        RingtonePlayer.class,
        KeyboardUI.class,
        PipUI.class,
        ShortcutKeyDispatcher.class,
        VendorServices.class,
        GarbageMonitor.Service.class,
        LatencyTester.class,
        GlobalActionsComponent.class,
        RoundedCorners.class,
};

這里是拿到每個(gè)和 SystemUI 相關(guān)的類的反射熊痴,存到了 service[] 里,然后賦值給cl地啰,緊接著將通過反射將其轉(zhuǎn)化為具體類的對(duì)象愁拭,存到了mService[i]數(shù)組里讲逛,最后對(duì)象調(diào) start() 方法啟動(dòng)相關(guān)類的服務(wù)亏吝,啟動(dòng)完成后,回調(diào) onBootCompleted( ) 方法盏混。
mService[i] 里的值不同時(shí)蔚鸥,調(diào)用的 start() 方法也不相同。
以上就是SystemUI啟動(dòng)的大致流程许赃,具體的對(duì)應(yīng)的每個(gè)不同的會(huì)在后續(xù)做詳細(xì)的分析止喷。

ps:其實(shí)接觸開發(fā)的時(shí)間并不久,而framework更是剛接觸幾天混聊,壓力其實(shí)挺大的弹谁。但每份努力都是為了成就最后的自己吧,共勉!Tし摺沟于!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市植康,隨后出現(xiàn)的幾起案子旷太,更是在濱河造成了極大的恐慌,老刑警劉巖销睁,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件供璧,死亡現(xiàn)場離奇詭異,居然都是意外死亡冻记,警方通過查閱死者的電腦和手機(jī)睡毒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來冗栗,“玉大人吕嘀,你說我怎么就攤上這事≌曷鳎” “怎么了偶房?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長军浆。 經(jīng)常有香客問我棕洋,道長,這世上最難降的妖魔是什么乒融? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任掰盘,我火速辦了婚禮,結(jié)果婚禮上赞季,老公的妹妹穿的比我還像新娘愧捕。我一直安慰自己,他們只是感情好申钩,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布次绘。 她就那樣靜靜地躺著,像睡著了一般撒遣。 火紅的嫁衣襯著肌膚如雪邮偎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天义黎,我揣著相機(jī)與錄音禾进,去河邊找鬼。 笑死廉涕,一個(gè)胖子當(dāng)著我的面吹牛泻云,可吹牛的內(nèi)容都是我干的艇拍。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼宠纯,長吁一口氣:“原來是場噩夢啊……” “哼淑倾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起征椒,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤娇哆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后勃救,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體碍讨,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年蒙秒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了勃黍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡晕讲,死狀恐怖覆获,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瓢省,我是刑警寧澤弄息,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站勤婚,受9級(jí)特大地震影響摹量,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜馒胆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一缨称、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧祝迂,春花似錦睦尽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至四啰,卻和暖如春宁玫,著一層夾襖步出監(jiān)牢的瞬間粗恢,已是汗流浹背柑晒。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留眷射,地道東北人匙赞。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓佛掖,卻偏偏與公主長得像,于是被迫代替她去往敵國和親涌庭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子芥被,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,114評(píng)論 25 707
  • Android系統(tǒng)源代碼情景分析筆記 Activity組件的啟動(dòng)過程分析 [toc] 根Activity啟動(dòng)的過程...
    一只胖Wa牛閱讀 2,121評(píng)論 0 6
  • 杏白桃紅雪如梨,含羞不語正可期坐榆。 東風(fēng)壓倒西風(fēng)日拴魄,自是人間晴暖時(shí)。
    梅心梅飛閱讀 287評(píng)論 7 24
  • G189 -1組 谷琪宇 我是G189期1組的谷琪宇席镀,很高興迎著清晨的陽光和大家分享匹中。先介紹一下我的三個(gè)標(biāo)簽。...
    GokGiU閱讀 226評(píng)論 0 1
  • 文/寧汐染 那年盛夏 薔薇花爬滿了圍墻 銀杏樹青蔥翠綠 香樟樹下的我們笑靨如花 那年盛夏 老舊的風(fēng)扇發(fā)出“吱呀”的...
    寧汐染閱讀 483評(píng)論 2 8