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              // 关闭Bouncer

2.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.javaPIN码控制器
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.javaMIUI生物识别控制器
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.javaKeyguardViewMediator注入器
packages/SystemUI/src/com/android/keyguard/injector/KeyguardUpdateMonitorInjector.javaKeyguardUpdateMonitor注入器

九、调试技巧

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)