---
---
#### **一、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
<!-- frameworks/base/packages/SystemUI/res/values/config.xml -->
<string-array name="config_systemUIServiceComponents">
<item>com.android.systemui.statusbar.phone.StatusBar</item>
<item>com.android.systemui.navigationbar.NavigationBarController</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.power.PowerUI</item>
</string-array>
```
- **组件初始化**:动态实例化并初始化每个组件。
```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
<!-- StatusBar 主布局文件:status_bar.xml -->
<FrameLayout>
<com.android.systemui.statusbar.phone.PhoneStatusBarView>
<LinearLayout android:id="@+id/status_bar_contents">
<!-- 左侧:系统图标(信号、电池等) -->
<LinearLayout android:id="@+id/system_icon_area">
<ImageView android:id="@+id/battery"/>
<ImageView android:id="@+id/wifi"/>
</LinearLayout>
<!-- 右侧:通知图标 -->
<LinearLayout android:id="@+id/notification_icon_area"/>
</LinearLayout>
<!-- 下拉通知面板 -->
<com.android.systemui.statusbar.phone.NotificationPanelView/>
</com.android.systemui.statusbar.phone.PhoneStatusBarView>
</FrameLayout>
```
###### **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<ActivityManager.RecentTaskInfo> 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
<!-- overlay/framework-res.apk/res/values/styles.xml -->
<style name="Theme.SystemUI" parent="Theme.DeviceDefault">
<item name="colorPrimary">@color/system_ui_primary</item>
</style>
```
- **动态切换主题**:
```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<Void, Void, Bitmap>() {
protected Bitmap doInBackground(Void... params) {
return BitmapFactory.decodeResource(res, R.drawable.icon);
}
protected void onPostExecute(Bitmap bitmap) {
mImageView.setImageBitmap(bitmap);
}
}.execute();
```
- **布局层级优化**:
```xml
<!-- 使用ConstraintLayout替代多层嵌套LinearLayout -->
<androidx.constraintlayout.widget.ConstraintLayout>
<ImageView app:layout_constraintLeft_toLeftOf="parent"/>
<TextView app:layout_constraintRight_toRightOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
```
---
#### **六、完整流程图: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
<!-- navigation_bar.xml -->
<com.android.systemui.navigationbar.buttons.ReverseLinearLayout>
<Button android:id="@+id/custom_button"/>
<include layout="@layout/nav_buttons"/>
</com.android.systemui.navigationbar.buttons.ReverseLinearLayout>
```
---
通过此超详细解析,您可以从源码级掌握 SystemUI 的完整架构与核心实现逻辑,为深度定制与性能优化提供坚实基础。