SystemUI是一个系统级apk,位于frameworks\base\packages\SystemUI\ 主要功能有:
状态栏信息显示,比如电池,wifi信号,3G/4G等icon显示
通知面板,比如系统消息,第三方应用消息
近期任务栏显示面板,比如长按近期任务快捷键,显示近期使用的应用
截图服务
壁纸服务
SystemServer启动后,会在Main Thread启动ActivityManagerService,当ActivityManagerService systemReady后,会去启动SystemUIService。
- private void startOtherServices(@NonNull TimingsTraceAndSlog t) {
- mActivityManagerService.systemReady(() -> {
- Slog.i(TAG, "Making services ready");
- t.traceBegin("StartActivityManagerReadyPhase");
- mSystemServiceManager.startBootPhase(t, SystemService.PHASE_ACTIVITY_MANAGER_READY);
- t.traceEnd();
- t.traceBegin("StartObservingNativeCrashes");
- try {
- mActivityManagerService.startObservingNativeCrashes();
- } catch (Throwable e) {
- reportWtf("observing native crashes", e);
- }
- t.traceEnd();
-
- // No dependency on Webview preparation in system server. But this should
- // be completed before allowing 3rd party
- final String WEBVIEW_PREPARATION = "WebViewFactoryPreparation";
- Future<?> webviewPrep = null;
- if (!mOnlyCore && mWebViewUpdateService != null) {
- webviewPrep = SystemServerInitThreadPool.submit(() -> {
- Slog.i(TAG, WEBVIEW_PREPARATION);
- TimingsTraceAndSlog traceLog = TimingsTraceAndSlog.newAsyncLog();
- traceLog.traceBegin(WEBVIEW_PREPARATION);
- ConcurrentUtils.waitForFutureNoInterrupt(mZygotePreload, "Zygote preload");
- mZygotePreload = null;
- mWebViewUpdateService.prepareWebViewInSystemServer();
- traceLog.traceEnd();
- }, WEBVIEW_PREPARATION);
- }
-
- if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)) {
- t.traceBegin("StartCarServiceHelperService");
- mSystemServiceManager.startService(CAR_SERVICE_HELPER_SERVICE_CLASS);
- t.traceEnd();
- }
-
- t.traceBegin("StartSystemUI");
- 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();
- }
frameworks\base\services\core\java\android\content\pm\PackageManagerInternal.java
- /**
- * @return The SystemUI service component name.
- */
- public abstract ComponentName getSystemUiServiceComponent();
抽象方法,具体实现在 PackageManagerService
mContext 是系统的
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));
- }
frameworks\base\core\res\res\values\config.xml
-
- <string name="config_systemUIServiceComponent" translatable="false"
- >com.android.systemui/com.android.systemui.SystemUIServicestring>
启动SystemUIService
frameworks\base\packages\SystemUI\src\com\android\systemui\SystemUIService.java
调用startServicesIfNeeded启动一系列服务
- public void onCreate() {
- super.onCreate();
-
- // Start all of SystemUI
- ((SystemUIApplication) getApplication()).startServicesIfNeeded();
-
- // Finish initializing dump logic
- mLogBufferFreezer.attach(mBroadcastDispatcher);
-
- // For debugging RescueParty
- if (Build.IS_DEBUGGABLE && SystemProperties.getBoolean("debug.crash_sysui", false)) {
- throw new RuntimeException();
- }
-
- if (Build.IS_DEBUGGABLE) {
- // b/71353150 - looking for leaked binder proxies
- BinderInternal.nSetBinderProxyCountEnabled(true);
- BinderInternal.nSetBinderProxyCountWatermarks(1000,900);
- BinderInternal.setBinderProxyCountCallback(
- new BinderInternal.BinderProxyLimitListener() {
- @Override
- public void onLimitReached(int uid) {
- Slog.w(SystemUIApplication.TAG,
- "uid " + uid + " sent too many Binder proxies to uid "
- + Process.myUid());
- }
- }, mMainHandler);
- }
-
- // Bind the dump service so we can dump extra info during a bug report
- startServiceAsUser(
- new Intent(getApplicationContext(), SystemUIAuxiliaryDumpService.class),
- UserHandle.SYSTEM);
- }
frameworks\base\packages\SystemUI\src\com\android\systemui\SystemUIApplication.java
- public void startServicesIfNeeded() {
- String[] names = SystemUIFactory.getInstance().getSystemUIServiceComponents(getResources());
- startServicesIfNeeded(/* metricsPrefix= */ "StartServices", names);
- }
调用 mServices[i].start();启动service
- 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);
- obj = (SystemUI) constructor.newInstance(this);
- }
- mServices[i] = obj;
- } catch (ClassNotFoundException
- | NoSuchMethodException
- | IllegalAccessException
- | InstantiationException
- | InvocationTargetException ex) {
- throw new RuntimeException(ex);
- }
-
- 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 " + 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;
- }
mContext 是SystemUI
frameworks\base\packages\SystemUI\src\com\android\systemui\SystemUIFactory.java
- /** Returns the list of system UI components that should be started. */
- 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>
所有UI均继承自systemUI
frameworks\base\packages\SystemUI\src\com\android\systemui\SystemUI.java
public class PowerUI extends SystemUI implements CommandQueue.Callbacks {