国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

[Android14] SystemUI的啟動

這篇具有很好參考價值的文章主要介紹了[Android14] SystemUI的啟動。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1. 什么是System UI

? ? ? ? SystemUI是Android系統(tǒng)級應(yīng)用,負責反饋系統(tǒng)及應(yīng)用狀態(tài)并與用戶保持大量的交互。業(yè)務(wù)主要涉及的組成部分包括狀態(tài)欄(Status Bar),通知欄(Notification Panel),鎖屏(Keyguard),控制中心(Quick Setting),音量調(diào)節(jié)(VolumeUI), 近期任務(wù)(Recents)等等。

圖例如下所示:

[Android14] SystemUI的啟動,Android SystemUI,Android,SystemUI

2. 源碼位置

package name: ? ?com.android.systemui

SystemUI源碼目錄位于: framework/base/packages/SystemUI

Application位于: ? ? ? ?frameworks\base\packages\SystemUI\SystemUIApplication

Service位于: ? ? ? ? ? ?frameworks\base\services\java\com\android\server\

3. systemUI 啟動流程

SystemServer.run()-> startOtherServices()-> startSystemUi()

SystemServer由ZygoteInit進程創(chuàng)建并啟動

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

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



    private void run() {
    ......
    // Start services.
        try {
            t.traceBegin("StartServices");
            startBootstrapServices(t);
            startCoreServices(t);
            startOtherServices(t);  //在這里會啟動startSystemUi()
        } catch (Throwable ex) {
            Slog.e("System", "******************************************");
            Slog.e("System", "************ Failure starting system services", ex);
            throw ex;
        } finally {
            t.traceEnd(); // StartServices
        }
    ......
    }


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

    private static void startSystemUi(Context context, WindowManagerService windowManager) {
        PackageManagerInternal pm = LocalServices.getService(PackageManagerInternal.class);
        Intent intent = new Intent();
        intent.setComponent(pm.getSystemUiServiceComponent());  //這里
        intent.addFlags(Intent.FLAG_DEBUG_TRIAGED_MISSING);
        //Slog.d(TAG, "Starting service: " + intent);
        context.startServiceAsUser(intent, UserHandle.SYSTEM);
        windowManager.onSystemUiStarted();
    }

注意看這一段?

intent.setComponent(pm.getSystemUiServiceComponent());

pm是PackageManagerInternal實例,它的getSystemUiServiceComponent()方法是一個抽象方法

frameworks/base/services/core/java/android/content/pm/PackageManagerInternal.java

    /**
     * @return The SystemUI service component name.
     */
    public abstract ComponentName getSystemUiServiceComponent();

PackageManagerService實現(xiàn)了該方法,如下:

frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java

        @Override
        public ComponentName getSystemUiServiceComponent() {
            return ComponentName.unflattenFromString(mContext.getResources().getString(
                    com.android.internal.R.string.config_systemUIServiceComponent));
        }

?com.android.internal.R.string.config_systemUIServiceComponent的值是

frameworks/base/core/res/res/values/config.xml

<!-- SystemUi service component -->
    <string name="config_systemUIServiceComponent" translatable="false"
            >com.android.systemui/com.android.systemui.SystemUIService</string>

?unflattenFromString返回的是ComponentName(“com.android.systemui”, “com.android.systemui.SystemUIService”);

unflattenFromString?具體方法如下,很簡單,感興趣的可以看看,不感興趣的直接跳過就好,這個方法不是重點。

    /**
     * Recover a ComponentName from a String that was previously created with
     * {@link #flattenToString()}.  It splits the string at the first '/',
     * taking the part before as the package name and the part after as the
     * class name.  As a special convenience (to use, for example, when
     * parsing component names on the command line), if the '/' is immediately
     * followed by a '.' then the final class name will be the concatenation
     * of the package name with the string following the '/'.  Thus
     * "com.foo/.Blah" becomes package="com.foo" class="com.foo.Blah".
     *
     * @param str The String that was returned by flattenToString().
     * @return Returns a new ComponentName containing the package and class
     * names that were encoded in <var>str</var>
     *
     * @see #flattenToString()
     */
    public static @Nullable ComponentName unflattenFromString(@NonNull String str) {
        int sep = str.indexOf('/');
        if (sep < 0 || (sep+1) >= str.length()) {
            return null;
        }
        String pkg = str.substring(0, sep);
        String cls = str.substring(sep+1);
        if (cls.length() > 0 && cls.charAt(0) == '.') {
            cls = pkg + cls;
        }
        return new ComponentName(pkg, cls);
    }

以上代碼功能為通過Intent啟動了SystemUIService。

于是走到SystemUIService的onCreate()方法

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

    public void onCreate() {
        super.onCreate();

        // Start all of SystemUI
        ((SystemUIApplication) getApplication()).startServicesIfNeeded();
        ......
    }


    public void startServicesIfNeeded() {
        String[] names = SystemUIFactory.getInstance().getSystemUIServiceComponents(getResources());
        startServicesIfNeeded(/* metricsPrefix= */ "StartServices", names);
    }

通過工廠模式獲得SystemUI組件列表

frameworks/base/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
    public String[] getSystemUIServiceComponents(Resources resources) {
        return resources.getStringArray(R.array.config_systemUIServiceComponents);
    }

?列表如下:

frameworks/base/packages/SystemUI/res/values/config.xml
    <!-- SystemUI Services: The classes of the stuff to start. -->
    <string-array name="config_systemUIServiceComponents" translatable="false">
        <item>com.android.systemui.util.NotificationChannels</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.statusbar.phone.StatusBar</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.biometrics.AuthController</item>
        <item>com.android.systemui.SliceBroadcastRelayHandler</item>
        <item>com.android.systemui.SizeCompatModeActivityController</item>
        <item>com.android.systemui.statusbar.notification.InstantAppNotifier</item>
        <item>com.android.systemui.theme.ThemeOverlayController</item>
        <item>com.android.systemui.accessibility.WindowMagnification</item>
        <item>com.android.systemui.accessibility.SystemActions</item>
        <item>com.android.systemui.toast.ToastUI</item>
    </string-array>

?這個列表是要傳到上面的String[] names里的,作為參數(shù),下一步執(zhí)行startServicesIfNeeded(/* metricsPrefix= */ "StartServices", names);

方法如下:

大致內(nèi)容就是通過反射獲得上面列表的類的構(gòu)造函數(shù),然后通過構(gòu)造函數(shù)創(chuàng)建上面那些類的實例,然后調(diào)用這些類的start方法,啟動這些systemuI組件。

private void startServicesIfNeeded(String metricsPrefix, String[] services) {
        if (mServicesStarted) {
            return;
        }
        mServices = new SystemUI[services.length];

        if (!mBootCompleteCache.isBootComplete()) {
            // check to see if maybe it was already completed long before we began
            // see ActivityManagerService.finishBooting()
            if ("1".equals(SystemProperties.get("sys.boot_completed"))) {
                mBootCompleteCache.setBootComplete();
                if (DEBUG) {
                    Log.v(TAG, "BOOT_COMPLETED was already sent");
                }
            }
        }

        final DumpManager dumpManager = mRootComponent.createDumpManager();

        Log.v(TAG, "Starting SystemUI services for user " +
                Process.myUserHandle().getIdentifier() + ".");
        TimingsTraceLog log = new TimingsTraceLog("SystemUIBootTiming",
                Trace.TRACE_TAG_APP);
        log.traceBegin(metricsPrefix);
        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(metricsPrefix + clsName);
            long ti = System.currentTimeMillis();
            try {
                SystemUI obj = mComponentHelper.resolveSystemUI(clsName);
                if (obj == null) {
                    Constructor constructor = Class.forName(clsName).getConstructor(Context.class);  //獲取構(gòu)造函數(shù)
                    obj = (SystemUI) constructor.newInstance(this); //通過構(gòu)造函數(shù)獲取實例
                }
                mServices[i] = obj; //把實例放入到mServices數(shù)組中
            } catch (ClassNotFoundException
                    | NoSuchMethodException
                    | IllegalAccessException
                    | InstantiationException
                    | InvocationTargetException ex) {
                throw new RuntimeException(ex);
            }

            if (DEBUG) Log.d(TAG, "running: " + mServices[i]);
            mServices[i].start(); //執(zhí)行start方法
            log.traceEnd();

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

            dumpManager.registerDumpable(mServices[i].getClass().getName(), mServices[i]);
        }
        mRootComponent.getInitController().executePostInitTasks();
        log.traceEnd();

        mServicesStarted = true;
    }

SystemUI的啟動就是這樣。剩下的就是啟動具體組件了,例如com.android.systemui.statusbar.phone.StatusBar。

StatusBar也就是狀態(tài)欄,想看狀態(tài)欄怎么啟動的可以跟到它的start方法,這篇就先到這里。

?文章來源地址http://www.zghlxwxcb.cn/news/detail-859549.html

?

?

?

?

到了這里,關(guān)于[Android14] SystemUI的啟動的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Android 10.0 SystemUI啟動流程

    Android 10.0 SystemUI啟動流程

    1、手機開機后,Android系統(tǒng)首先會創(chuàng)建一個Zygote(核心進程)。 2、由Zygote啟動SystemServer。 3、SystemServer會啟動系統(tǒng)運行所需的眾多核心服務(wù)和普通服務(wù)、以及一些應(yīng)用及數(shù)據(jù)。例如:SystemUI 啟動就是從 SystemServer 里啟動的。 4、進入鎖屏界面,開機完成。 SystemServer 中有一個

    2024年02月05日
    瀏覽(30)
  • Android 14.0 SystemUI修改狀態(tài)欄電池圖標樣式為橫屏顯示

    Android 14.0 SystemUI修改狀態(tài)欄電池圖標樣式為橫屏顯示

    在14.0的系統(tǒng)rom產(chǎn)品定制化開發(fā)中,對于原生系統(tǒng)中SystemUId 狀態(tài)欄的電池圖標是豎著顯示的,一般手機的電池圖標都是橫屏顯示的 可以覺得樣式挺不錯的,所以由于產(chǎn)品開發(fā)要求電池圖標橫著顯示和手機的樣式一樣,所以就得重新更換SystemUI狀態(tài)欄的電池樣式了 如圖: systemu

    2024年04月29日
    瀏覽(103)
  • Android 12 源碼分析 —— 應(yīng)用層 二(SystemUI大體組織和啟動過程)

    Android 12 源碼分析 —— 應(yīng)用層 二(SystemUI大體組織和啟動過程)

    在前一篇文章中,我們介紹了SystemUI怎么使用IDE進行編輯和調(diào)試。這是分析SystemUI的最基礎(chǔ),希望讀者能盡量掌握。 本篇文章,將會介紹SystemUI的大概組織架構(gòu),以及它的啟動過程。本篇文章讀完,將會知道: SystemUI為什么選擇使用Dagger2 SystemUI怎么新建一個模塊 SystemUI的啟動

    2024年02月06日
    瀏覽(38)
  • 我的NPI項目之設(shè)備系統(tǒng)啟動(八) -- Android14的GKI項目

    我的NPI項目之設(shè)備系統(tǒng)啟動(八) -- Android14的GKI項目

    GKI是什么? Google為什么要推行GKI? GKI全稱General Kernel Image。GKI在framework和kernel之間提供了標準接口,使得android OS能夠輕松適配/維護/兼容不同的設(shè)備和linux kernel。 Google引入GKI的目的是將Framework和Kernel進一步的解耦。因為,android一直高度依賴linux kernel, linux kernel一更新,an

    2024年04月12日
    瀏覽(19)
  • Android SystemUI梳理

    Android SystemUI梳理

    ?? 團隊博客: 汽車電子社區(qū) ??在Android系統(tǒng)中SystemUI是一個系統(tǒng)級的APP,它提供了系統(tǒng)的用戶界面,由system_server進程啟動。SystemUI本身不屬于system_server進程,它是一個獨立的進程。它的HMI包括了狀態(tài)欄、導航欄、通知欄、鎖屏、近期任務(wù)等等。 ??SystemServer是一個由Zog

    2024年01月20日
    瀏覽(19)
  • Android10 SystemUI系列(一)概述

    由于筆者之前負責過SystemUI,之前沒有抽空把很多東西整理出來,趁著最近不太忙,就慢慢動手梳理一下,順便把自己遇到的問題也整理一下,當然自己之前主要看的是android11 之后的源碼。這次主要是Android10 的源碼,當然原理大差不差,也算是自己沉淀一下了 SystemUI 是 And

    2024年02月10日
    瀏覽(16)
  • Android 車載應(yīng)用開發(fā)指南(3) - SystemUI 詳解

    Android 車載應(yīng)用開發(fā)指南(3) - SystemUI 詳解

    Android 車載應(yīng)用開發(fā)指南系列文章 Android 車載應(yīng)用開發(fā)指南(1)- 車載操作系統(tǒng)全解析 Android 車載應(yīng)用開發(fā)指南(2)- 應(yīng)用開發(fā)入門 Android 車載應(yīng)用開發(fā)指南(3)- SystemUI 詳解 SystemUI 全稱 System User Interface ,直譯過來就是 系統(tǒng)級用戶交互界面 ,在 Android 系統(tǒng)中由 SystemUI 負責

    2024年02月19日
    瀏覽(50)
  • 關(guān)于Android SystemUI Flag詳解及使用情景

    觸摸屏幕任何位置 頂部下拉狀態(tài)欄 底部上拉導航欄 Window的變化(如:跳轉(zhuǎn)到其他界面、彈出鍵盤等) View.SYSTEM_UI_FLAG_HIDE_NAVIGATION:(=api16) 作用是隱藏系統(tǒng)NavigationBar。 但是用戶的任何交互,都會導致此Flag被系統(tǒng)清除,進而導航欄自動重新顯示,同時View.SYSTEM_UI_FLAG_FULLSCREEN也會

    2024年02月08日
    瀏覽(13)
  • Android 9系統(tǒng)源碼_SystemUI(十)SystemUIVisibility屬性

    在Android系統(tǒng)中,很多應(yīng)用都需要根據(jù)具體情況來控制狀態(tài)欄和導航欄的顯示和隱藏,又或者將狀態(tài)欄透明,實現(xiàn)諸如沉浸式、全面屏燈效果,而要實現(xiàn)這些效果,都離不開SystemUIVisibility屬性。由于SystemUIVisibilityy屬性主要用來控制系統(tǒng)狀態(tài)欄和導航欄的行為,而狀態(tài)欄和導航

    2024年02月11日
    瀏覽(20)
  • Android 12系統(tǒng)源碼_SystemUI(八)SystemUIVisibility屬性

    在Android系統(tǒng)中,很多應(yīng)用都需要根據(jù)具體情況來控制狀態(tài)欄和導航欄的顯示和隱藏,又或者將狀態(tài)欄透明,實現(xiàn)諸如沉浸式、全面屏燈效果,而要實現(xiàn)這些效果,都離不開SystemUIVisibility屬性。由于SystemUIVisibilityy屬性主要用來控制系統(tǒng)狀態(tài)欄和導航欄的行為,而狀態(tài)欄和導航

    2024年02月06日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包