下一届世界杯_世界杯揭幕战 - bjshiyanji.com

**SystemUI 超详细解析:架构、流程与核心实现**
2025-10-05 17:13:47

---

---

#### **一、SystemUI 入口与启动全流程**

##### **1. 系统级启动触发**

- **触发点**:`SystemServer` 完成关键服务初始化后,调用 `ActivityManagerService.systemReady()`,启动 SystemUI。

```java

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

mActivityManagerService.systemReady(() -> {

startSystemUi(context); // 触发SystemUI启动

}, BOOT_TIMINGS_TRACE_LOG);

```

- **启动命令**:通过 `SystemService` 启动 `SystemUIService`。

```java

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

public void onCreate() {

super.onCreate();

// 核心入口:SystemUIApplication

((SystemUIApplication) getApplication()).startServicesIfNeeded();

}

```

##### **2. SystemUIApplication 初始化细节**

- **组件加载**:从 `config.xml` 加载所有 SystemUI 组件。

```xml

com.android.systemui.statusbar.phone.StatusBar

com.android.systemui.navigationbar.NavigationBarController

com.android.systemui.keyguard.KeyguardViewMediator

com.android.systemui.recents.Recents

com.android.systemui.volume.VolumeUI

com.android.systemui.power.PowerUI

```

- **组件初始化**:动态实例化并初始化每个组件。

```java

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

public void startServicesIfNeeded() {

String[] services = getResources().getStringArray(R.array.config_systemUIServiceComponents);

for (String clsName : services) {

Class cls = Class.forName(clsName);

SystemUI service = (SystemUI) cls.newInstance();

service.initialize(this); // 调用每个组件的initialize()

mServices.add(service);

}

}

```

---

#### **二、SystemUI 核心架构与模块深度拆解**

##### **1. 模块层级与依赖关系**

```mermaid

classDiagram

class SystemUIApplication {

+startServicesIfNeeded()

-mServices: List~SystemUI~

}

class StatusBar {

-mNotificationPanel: NotificationPanelView

-mIconController: StatusBarIconController

+onNotificationPosted()

}

class NavigationBarController {

-mNavigationBars: SparseArray~NavigationBar~

+createNavigationBar()

}

class KeyguardViewMediator {

-mKeyguardViewManager: KeyguardViewManager

+showLocked()

}

SystemUIApplication --> StatusBar

SystemUIApplication --> NavigationBarController

SystemUIApplication --> KeyguardViewMediator

StatusBar --> NotificationPanelView

NavigationBarController --> NavigationBar

KeyguardViewMediator --> KeyguardSecurityContainer

```

##### **2. 状态栏(StatusBar)全流程解析**

###### **2.1 视图层级结构**

```xml

```

###### **2.2 通知处理流程**

```mermaid

sequenceDiagram

participant NMS as NotificationManagerService

participant StatusBar

participant NotificationPanelView

NMS->>StatusBar: onNotificationPosted()

StatusBar->>NotificationData: addEntry()

NotificationData->>StatusBarIconController: updateIcons()

StatusBarIconController->>PhoneStatusBarView: refreshIconSlot("notification")

StatusBar->>NotificationPanelView: updateNotifications()

NotificationPanelView->>NotificationStackScrollLayout: updateChildren()

```

- **关键代码**:通知图标更新逻辑

```java

// StatusBarIconControllerImpl.java

public void setIcon(String slot, StatusBarIcon icon) {

mIconGroups.forEach(group -> {

group.addIcon(slot, icon); // 更新所有注册的图标容器

});

}

```

##### **3. 导航栏(NavigationBar)实现细节**

###### **3.1 手势事件处理**

- **输入事件传递链**:

```mermaid

graph TB

InputReader --> InputDispatcher

InputDispatcher --> NavigationBarView

NavigationBarView --> NavigationBarGestureHandler

NavigationBarGestureHandler --> GestureDetector

```

- **手势识别代码**:

```java

// NavigationBarGestureHandler.java

public boolean onTouchEvent(MotionEvent event) {

mGestureDetector.onTouchEvent(event);

switch (event.getAction()) {

case MotionEvent.ACTION_UP:

if (isQuickStepSwipe(event)) {

startQuickStep(); // 触发多任务手势

}

break;

}

return true;

}

```

###### **3.2 虚拟按键逻辑**

- **按键映射与点击处理**:

```java

// NavigationBarView.java

public void setOnButtonTouchListener(View v, int buttonType) {

v.setOnTouchListener((view, event) -> {

if (event.getAction() == MotionEvent.ACTION_DOWN) {

mButtonListeners.get(buttonType).onPress();

} else if (event.getAction() == MotionEvent.ACTION_UP) {

mButtonListeners.get(buttonType).onRelease();

}

return true;

});

}

```

---

#### **三、SystemUI 与系统服务交互机制**

##### **1. 与 WindowManagerService 的交互**

- **窗口添加示例**:状态栏窗口注册

```java

// StatusBar.java

protected void createAndAddWindows() {

mWindowManager.addView(mStatusBarView, mLayoutParams); // 添加状态栏窗口

}

```

- **布局参数定义**:状态栏窗口层级

```java

mLayoutParams = new WindowManager.LayoutParams(

ViewGroup.LayoutParams.MATCH_PARENT,

height,

WindowManager.LayoutParams.TYPE_STATUS_BAR, // 层级类型

WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,

PixelFormat.TRANSLUCENT

);

```

##### **2. 与 ActivityManagerService 的协作**

- **获取当前任务栈**:

```java

// Recents.java

public void loadTasks() {

List tasks = mActivityManager.getRecentTasks();

mTaskStackView.setTasks(tasks); // 更新多任务视图

}

```

---

#### **四、SystemUI 插件化与主题系统**

##### **1. 插件机制实现细节**

- **插件接口定义**:

```java

// Plugin.java

public interface Plugin {

void onCreate(Context sysuiContext, Context pluginContext);

void onDestroy();

String getVersion();

}

```

- **动态加载插件**:

```java

// PluginManagerImpl.java

public void loadPlugin(File apkFile) {

PackageManager pm = mContext.getPackageManager();

PackageInfo pkgInfo = pm.getPackageArchiveInfo(apkFile.getPath(), PackageManager.GET_META_DATA);

// 反射加载插件类

ClassLoader cl = new PathClassLoader(apkFile.getPath(), ClassLoader.getSystemClassLoader());

Class pluginClass = cl.loadClass(pkgInfo.packageName + ".MainPlugin");

Plugin plugin = (Plugin) pluginClass.newInstance();

plugin.onCreate(mContext, pluginContext);

}

```

##### **2. 主题覆盖与资源管理**

- **叠加层(Overlay)配置**:

```xml

```

- **动态切换主题**:

```java

// ThemeOverlayController.java

public void applyThemeOverlay(String overlayPkg) {

OverlayManager om = getOverlayManager();

om.setEnabledExclusiveInCategory(overlayPkg, UserHandle.USER_SYSTEM);

}

```

---

#### **五、调试与性能优化实战**

##### **1. 关键调试命令**

- **查看 SystemUI 窗口信息**:

```bash

adb shell dumpsys window windows | grep "Window #"

```

- **分析通知状态**:

```bash

adb shell dumpsys notification

```

- **追踪输入事件**:

```bash

adb shell getevent -lt

```

##### **2. 性能优化案例**

- **减少主线程阻塞**:

```java

// 异步加载图标资源

new AsyncTask() {

protected Bitmap doInBackground(Void... params) {

return BitmapFactory.decodeResource(res, R.drawable.icon);

}

protected void onPostExecute(Bitmap bitmap) {

mImageView.setImageBitmap(bitmap);

}

}.execute();

```

- **布局层级优化**:

```xml

```

---

#### **六、完整流程图:SystemUI 启动到界面渲染**

```mermaid

graph TD

A[SystemServer启动] --> B[AMS.systemReady()]

B --> C[启动SystemUIService]

C --> D[SystemUIApplication初始化]

D --> E[加载config_systemUIServiceComponents]

E --> F[初始化StatusBar]

E --> G[初始化NavigationBar]

E --> H[初始化Keyguard]

F --> I[注册NotificationListener]

G --> J[绑定手势监听]

H --> K[加载锁屏布局]

I --> L[接收并显示通知]

J --> M[处理虚拟按键事件]

K --> N[显示锁屏界面]

```

---

#### **七、扩展:自定义 SystemUI 组件示例**

##### **1. 添加自定义状态栏图标**

- **实现步骤**:

1. 创建图标控制器:

```java

public class CustomIconController implements StatusBarIconController.IconManager {

public void setIcon(String slot, StatusBarIcon icon) {

if (slot.equals("custom_icon")) {

// 更新自定义图标

}

}

}

```

2. 注册到 StatusBar:

```java

mStatusBarIconController.addIconGroup(new CustomIconController());

```

##### **2. 修改导航栏按钮布局**

- **布局文件修改**:

```xml