MiuiSystemUI 解锁流程知识图谱
文档提示词:
生成解锁流程知识图谱到本地doc目录
一、核心架构概览
┌─────────────────────────────────────────────────────────────┐
│ 解锁流程核心组件 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────────┐ ┌──────────────────┐ │
│ │ KeyguardView │◄────────│ KeyguardUpdate │ │
│ │ Mediator │ │ Monitor │ │
│ │ (中介者) │ │ (状态监控) │ │
│ └────────┬─────────┘ └────────┬─────────┘ │
│ │ │ │
│ │ │ │
│ ▼ ▼ │
│ ┌──────────────────┐ ┌──────────────────┐ │
│ │ StatusBarKeyguard│ │ BiometricUnlock │ │
│ │ ViewManager │◄────────│ Controller │ │
│ │ (视图管理) │ │ (生物识别) │ │
│ └────────┬─────────┘ └──────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────┐ │
│ │ KeyguardSecurity │ │
│ │ ContainerCtrl │ │
│ │ (安全容器) │ │
│ └──────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
二、核心组件详解
2.1 KeyguardViewMediator
文件路径: packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
职责: 锁屏的核心中介者,协调所有与锁屏相关的请求
关键功能:
- 管理锁屏的显示/隐藏状态
- 处理电源管理事件(屏幕开关)
- 响应解锁成功事件
- 协调锁屏动画
关键消息:
SHOW = 1 // 显示锁屏
HIDE = 2 // 隐藏锁屏
RESET = 3 // 重置锁屏
KEYGUARD_DONE = 7 // 解锁完成
KEYGUARD_DONE_DRAWING = 8 // 锁屏绘制完成
SET_OCCLUDED = 9 // 设置遮挡状态
KEYGUARD_TIMEOUT = 10 // 锁屏超时状态流转:
屏幕关闭 → SHOW → 显示锁屏
解锁成功 → KEYGUARD_DONE → HIDE → 隐藏锁屏
2.2 KeyguardUpdateMonitor
文件路径: packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
职责: 监控和分发锁屏相关的状态更新
监控内容:
- 生物识别状态(指纹、人脸)
- 电池状态
- SIM卡状态
- 用户切换
- 屏幕状态(亮屏/灭屏)
- 信任代理状态
关键消息:
MSG_TIME_UPDATE = 301 // 时间更新
MSG_BATTERY_UPDATE = 302 // 电池更新
MSG_STARTED_WAKING_UP = 319 // 开始唤醒
MSG_FINISHED_GOING_TO_SLEEP = 320 // 完成休眠
MSG_KEYGUARD_BOUNCER_CHANGED = 322 // Bouncer状态变化
MSG_BIOMETRIC_AUTHENTICATION_CONTINUE = 336 // 生物识别认证继续生物识别状态:
BIOMETRIC_STATE_STOPPED = 0 // 未监听
BIOMETRIC_STATE_RUNNING = 1 // 正在监听
BIOMETRIC_STATE_CANCELLING = 2 // 正在取消
BIOMETRIC_STATE_CANCELLING_RESTARTING = 3 // 取消后重启2.3 StatusBarKeyguardViewManager
文件路径: packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
职责: 管理状态栏中的锁屏视图,协调Bouncer显示
关键功能:
- 显示/隐藏Primary Bouncer(密码输入界面)
- 管理Alternate Bouncer(备用解锁方式)
- 处理遮挡状态(Occluded)
- 协调导航栏显示
Bouncer状态:
Primary Bouncer: 主要的密码输入界面(PIN/图案/密码)
Alternate Bouncer: 备用解锁方式(如信任代理)
2.4 BiometricUnlockController
文件路径: packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java
职责: 协调生物识别解锁与UI的交互
解锁模式:
MODE_NONE = 0 // 无需解锁
MODE_WAKE_AND_UNLOCK = 1 // 唤醒并解锁(灭屏指纹)
MODE_WAKE_AND_UNLOCK_PULSING = 2 // 从Doze唤醒并解锁
MODE_SHOW_BOUNCER = 3 // 显示Bouncer
MODE_ONLY_WAKE = 4 // 仅唤醒
MODE_UNLOCK_COLLAPSING = 5 // 解锁并折叠
MODE_WAKE_AND_UNLOCK_FROM_DREAM = 6 // 从Dream唤醒解锁
MODE_DISMISS_BOUNCER = 7 // 关闭Bouncer2.5 KeyguardSecurityContainerController
文件路径: packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java
职责: 管理安全输入容器,切换不同的安全模式
安全模式:
SecurityMode.None // 无安全
SecurityMode.Pattern // 图案
SecurityMode.Password // 密码
SecurityMode.PIN // PIN码
SecurityMode.SimPin // SIM PIN
SecurityMode.SimPuk // SIM PUK解锁类型:
BOUNCER_DISMISS_NONE_SECURITY = 0 // 无安全
BOUNCER_DISMISS_PASSWORD = 1 // 密码解锁
BOUNCER_DISMISS_BIOMETRIC = 2 // 生物识别解锁
BOUNCER_DISMISS_SIM = 3 // SIM卡解锁
BOUNCER_DISMISSIBLE_KEYGUARD = 4 // 可关闭的锁屏
BOUNCER_DISMISS_EXTENDED_ACCESS = 5 // 扩展访问
BOUNCER_DISMISS_MIUI_BLE = 6 // MIUI蓝牙解锁三、解锁流程详解
3.1 密码解锁流程
用户输入密码
↓
KeyguardAbsKeyInputViewController.verifyPasswordAndUnlock()
↓
LockPatternChecker.checkCredential() [异步验证]
↓
onPasswordChecked(matched, timeoutMs)
↓
├─ 成功 → KeyguardSecurityCallback.reportUnlockAttempt(true)
│ ↓
│ KeyguardSecurityCallback.dismiss(true)
│ ↓
│ KeyguardViewMediator.keyguardDone()
│ ↓
│ StatusBarKeyguardViewManager.hide()
│ ↓
│ 解锁完成
│
└─ 失败 → KeyguardSecurityCallback.reportUnlockAttempt(false)
↓
显示错误提示
↓
检查是否需要锁定(多次失败)
关键类:
KeyguardAbsKeyInputViewController: 密码输入基类控制器KeyguardPinViewController: PIN码输入控制器KeyguardPasswordViewController: 密码输入控制器KeyguardPatternViewController: 图案输入控制器
验证流程:
// 1. 开始验证
mLatencyTracker.onActionStart(ACTION_CHECK_CREDENTIAL);
// 2. 异步检查凭证
LockPatternChecker.checkCredential(
mLockPatternUtils,
credential,
userId,
this::onPasswordChecked
);
// 3. 验证回调
onPasswordChecked(boolean matched, int timeoutMs) {
if (matched) {
// 解锁成功
mKeyguardSecurityCallback.dismiss(true, userId);
} else {
// 解锁失败
mKeyguardSecurityCallback.reportUnlockAttempt(userId, false, timeoutMs);
}
}3.2 指纹解锁流程
用户按压指纹
↓
FingerprintManager.authenticate()
↓
KeyguardUpdateMonitor.onFingerprintAuthenticated()
↓
BiometricUnlockController.startWakeAndUnlock()
↓
确定解锁模式(MODE_WAKE_AND_UNLOCK等)
↓
├─ 灭屏状态 → MODE_WAKE_AND_UNLOCK
│ ↓
│ PowerManager.wakeUp() [唤醒屏幕]
│ ↓
│ MiuiBiometricUnlockController.biometricUnlock()
│ ↓
│ KeyguardViewMediator.keyguardDone()
│
├─ 亮屏锁屏 → MODE_UNLOCK_COLLAPSING
│ ↓
│ StatusBarKeyguardViewManager.hide()
│
└─ Bouncer显示 → MODE_DISMISS_BOUNCER
↓
PrimaryBouncerInteractor.hide()
↓
解锁完成
MIUI优化 - MiuiBiometricUnlockController:
// 快速解锁优化:提前隐藏锁屏
biometricUnlock() {
onStartBiometricUnlock(); // 通知开始解锁
updateBiometricUnlockState(); // 更新解锁状态
hideKeyguardBiometric(); // 隐藏锁屏(提前)
onFinishBiometricUnlock(); // 通知完成解锁
}
// 灭屏解锁标记
mBiometricUnlockInScreenOff = !isDeviceInteractive();光学指纹 - MiuiGxzwManager:
// 指纹图标显示管理
onKeyguardShow() → 显示指纹图标
onKeyguardHide() → 隐藏指纹图标
// 解锁模式
GXZW_UNLOCK_MODE_NONE = 0 // 无解锁
GXZW_UNLOCK_MODE_AOD = 1 // AOD模式解锁
GXZW_UNLOCK_MODE_KEYGUARD = 2 // 锁屏模式解锁3.3 人脸解锁流程
屏幕唤醒/用户抬起手机
↓
KeyguardUpdateMonitor.requestFaceAuth()
↓
FaceManager.authenticate()
↓
KeyguardUpdateMonitor.onFaceAuthenticated()
↓
BiometricUnlockController.startWakeAndUnlock()
↓
├─ 灭屏状态 → MODE_WAKE_AND_UNLOCK
│ ↓
│ 唤醒屏幕并解锁
│
└─ 亮屏状态 → MODE_UNLOCK_COLLAPSING
↓
直接解锁
↓
解锁完成
人脸识别特性:
- 支持灭屏解锁(需要配置)
- 与指纹解锁共享BiometricUnlockController
- 可配置是否需要注视屏幕
四、状态转换图
4.1 锁屏状态机
┌─────────────┐
│ UNLOCKED │ (解锁状态)
└──────┬──────┘
│ 屏幕关闭/锁定
▼
┌─────────────┐
│ SHOWING │ (显示锁屏)
└──────┬──────┘
│ 用户交互
▼
┌─────────────┐
│ BOUNCER │ (显示密码输入)
└──────┬──────┘
│ 验证成功
▼
┌─────────────┐
│ GOING_ │ (正在消失)
│ AWAY │
└──────┬──────┘
│ 动画完成
▼
┌─────────────┐
│ UNLOCKED │ (解锁状态)
└─────────────┘
4.2 生物识别状态机
┌─────────────┐
│ STOPPED │ (未监听)
└──────┬──────┘
│ startListening()
▼
┌─────────────┐
│ RUNNING │ (正在监听)
└──────┬──────┘
│
├─ 认证成功 → 解锁流程
│
├─ 认证失败 → 继续监听
│
└─ stopListening() → CANCELLING
↓
┌─────────────┐
│ CANCELLING │
└──────┬──────┘
│ 取消完成
▼
┌─────────────┐
│ STOPPED │
└─────────────┘
五、关键接口与回调
5.1 ViewMediatorCallback
interface ViewMediatorCallback {
void userActivity(); // 用户活动
void keyguardDone(boolean authenticated); // 锁屏完成
void keyguardDoneDrawing(); // 锁屏绘制完成
void setNeedsInput(boolean needsInput); // 设置是否需要输入
void keyguardGonePending(boolean pending); // 锁屏即将消失
void onCancelClicked(); // 取消点击
}5.2 KeyguardSecurityCallback
interface KeyguardSecurityCallback {
void dismiss(boolean authenticated, int targetUserId); // 关闭锁屏
void reportUnlockAttempt(int userId, boolean success, int timeoutMs); // 报告解锁尝试
void reset(); // 重置
void onUserInput(); // 用户输入
}5.3 KeyguardUpdateMonitorCallback
abstract class KeyguardUpdateMonitorCallback {
void onFingerprintAuthenticated(int userId); // 指纹认证成功
void onFaceAuthenticated(int userId); // 人脸认证成功
void onBiometricAuthFailed(BiometricSourceType type); // 生物识别失败
void onTrustChanged(int userId); // 信任状态改变
void onStartedWakingUp(); // 开始唤醒
void onFinishedGoingToSleep(int why); // 完成休眠
}六、MIUI特有优化
6.1 快速解锁优化
MiuiBiometricUnlockController:
- 提前隐藏锁屏界面,减少解锁延迟
- 支持灭屏解锁优化
- 壁纸动画联动优化
6.2 光学指纹优化
MiuiGxzwManager:
- 指纹图标动态显示管理
- AOD模式下的指纹识别
- 指纹识别动画优化
- 与主题系统集成
6.3 全屏AOD支持
- 支持全屏AOD下的灭屏解锁
- 壁纸压黑动画优化
- 解锁动画流畅度优化
七、时序图
7.1 密码解锁时序
用户 KeyguardPinView KeyguardAbsKeyInput LockPatternUtils KeyguardViewMediator
│ │ │ │ │
│─输入密码─────────>│ │ │ │
│ │─verifyPassword────>│ │ │
│ │ │─checkCredential─────>│ │
│ │ │ │ │
│ │ │<─验证结果(成功)──────│ │
│ │<─onPasswordChecked─│ │ │
│ │ │─dismiss─────────────────────────────────>│
│ │ │ │ │
│ │ │ │<─keyguardDone─────│
│<─解锁成功────────│ │ │ │
7.2 指纹解锁时序
用户 FingerprintManager KeyguardUpdateMonitor BiometricUnlockCtrl KeyguardViewMediator
│ │ │ │ │
│─按压指纹────>│ │ │ │
│ │─onAuthenticated───>│ │ │
│ │ │─startWakeAndUnlock──>│ │
│ │ │ │─wakeUp() │
│ │ │ │─biometricUnlock() │
│ │ │ │─keyguardDone()────>│
│ │ │ │ │
│<─解锁成功────────────────────────────────────────────────────────────────────│
八、关键文件清单
8.1 核心框架
| 文件路径 | 说明 |
|---|---|
packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java | 锁屏中介者 |
packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java | 状态监控器 |
packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java | 视图管理器 |
8.2 密码解锁
| 文件路径 | 说明 |
|---|---|
packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java | 安全容器控制器 |
packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputViewController.java | 密码输入基类 |
packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java | PIN码控制器 |
packages/SystemUI/src/com/android/keyguard/KeyguardPasswordViewController.java | 密码控制器 |
packages/SystemUI/src/com/android/keyguard/KeyguardPatternViewController.java | 图案控制器 |
8.3 生物识别
| 文件路径 | 说明 |
|---|---|
packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java | 生物识别解锁控制器 |
packages/SystemUI/miuiModules/MiuiBiometrics/src/main/java/com/miui/keyguard/biometrics/MiuiBiometricUnlockController.java | MIUI生物识别控制器 |
packages/SystemUI/miuiModules/MiuiBiometrics/src/main/java/com/miui/keyguard/biometrics/fod/MiuiGxzwManager.java | 光学指纹管理器 |
packages/SystemUI/miuiModules/MiuiBiometrics/src/main/java/com/miui/keyguard/biometrics/fod/MiuiGxzwIconView.java | 指纹图标视图 |
8.4 MIUI扩展
| 文件路径 | 说明 |
|---|---|
packages/SystemUI/src/com/android/keyguard/injector/KeyguardViewMediatorInjector.java | KeyguardViewMediator注入器 |
packages/SystemUI/src/com/android/keyguard/injector/KeyguardUpdateMonitorInjector.java | KeyguardUpdateMonitor注入器 |
九、调试技巧
9.1 日志标签
KeyguardViewMediator.TAG = "KeyguardViewMediator"
KeyguardUpdateMonitor.TAG = "KeyguardUpdateMonitor"
BiometricUnlockController.TAG = "BiometricUnlockController"
MiuiGxzwManager.TAG = "MiuiGxzwManager"9.2 关键日志点
# 查看解锁流程
adb logcat | grep -E "KeyguardViewMediator|KeyguardUpdateMonitor|BiometricUnlock"
# 查看指纹解锁
adb logcat | grep -E "MiuiGxzw|Fingerprint"
# 查看密码验证
adb logcat | grep -E "KeyguardAbsKeyInput|LockPatternChecker"9.3 系统属性
# 启用调试模式
adb shell setprop log.tag.KeyguardViewMediator DEBUG
adb shell setprop log.tag.KeyguardUpdateMonitor DEBUG十、常见问题
10.1 解锁延迟
原因:
- 密码验证耗时
- 动画执行时间
- 壁纸加载延迟
优化方案:
- 使用MiuiBiometricUnlockController提前隐藏锁屏
- 优化动画时长
- 预加载壁纸
10.2 生物识别失败
原因:
- 传感器状态异常
- 用户未注册生物特征
- 强制要求密码(如重启后)
检查点:
- KeyguardUpdateMonitor.isFingerprintDetectionRunning()
- LockPatternUtils.getStrongAuthForUser()
10.3 Bouncer不显示
原因:
- 安全模式配置错误
- 视图未正确初始化
- 状态同步问题
检查点:
- KeyguardSecurityModel.getSecurityMode()
- StatusBarKeyguardViewManager.showPrimaryBouncer()
文档版本: 1.0 生成时间: 2026-02-28 适用版本: MiuiSystemUI (HyperOS)