Keyguard 与 SystemUI
PATH: /frameworks/base/packages/SystemUI/src/com/android/
Keyguard 与 SystemUI 进程
Keyguard 与 SystemUI 运行在同一进程中,即com.android.systemui进程。这点可以从manifest.xml文件就可以看出。
Keyguard
<application android:label="@string/app_name"
android:process="com.android.systemui"
android:persistent="true"
android:supportsRtl="true"
android:defaultToDeviceProtectedStorage="true"
android:directBootAware="true">
SystemUI
<application
android:name=".SystemUIApplication"
android:persistent="true"
android:allowClearUserData="false"
android:allowBackup="false"
android:hardwareAccelerated="true"
android:label="@string/app_label"
android:icon="@drawable/icon"
android:process="com.android.systemui"
android:supportsRtl="true"
android:theme="@style/systemui_theme"
android:defaultToDeviceProtectedStorage="true"
android:directBootAware="true">
通过Android.mk可知:在编译过程中,keyguard被打包成静态Java库. Keygaurd实际是由SystemUI来管理的.
# Keyguard Android.mk
include $(BUILD_STATIC_JAVA_LIBRARY)
# SystemUI:
LOCAL_STATIC_JAVA_LIBRARIES := \
com.mediatek.systemui.ext \
Keyguard \
类的简单含义
Android锁屏流程分析,主要用到的核心类如下:
keyguardUpdateMonitor是状态回调的管理类, 类似于一个监视器, 用于监听keyguard的更新变化.
keyguardBouncer 是锁屏view的通信交互类。
KeyguardServiceDelegate.java 继承了接口IKeyguardService; 同时KeyguardService完成了IKeyguardService的远程实现. 即这两个类通过底层aidl进行远程通信. 进入系统可以控制Keyguard服务的启动.
KeyguardServiceDelegate.java 是一个局部类,保存keyguard在崩溃之前的状态,用来恢复。同时它也可以运行时选择本地或远程的keyguard实例.
KeyguardViewMediator.java 作为一个中介类, 连接Keyguard与Systemui.其职能包括查询keyguard的状态, Keyguard在开关键的事件的动作,如显示或重置等。(KeyguardViewMediator 继承SystemUI, 是锁屏的核心类, 是交互的中转类,其它对象都通过KeyguardViewMediator对象相互交互。)
KeyguardSecurityContainer.java 这个类主要用于装载Pattern, password, pin等解锁视图的容器.
StatusBarKeyguardViewManger.java 在status bar中, 管理创建, 显示, 隐藏, 重置 状态栏中的 Keyguard.
锁屏流程概述
- SystemServer这个系统服务线程由底层开启, 该系统服务将开启一系列的服务, 其中Keyguard的流程会流到WindowManagerPolicy进行处理。
- WindowManagerPolicy的实现类是PhoneWindowManager。其将 keyguard 事件分发到 KeyguardServiceDelegate 进行处理.
- KeyguardServiceDelegate里绑定 KeyguardService 服务。 并调用onSystemReady方法。此时进入到SystemUI, 并调用KeyguardViewMediator决定是否显示视图。
(IkeyguardService 由KeyguardServiceWrapper包装类继承, 由KeyguardService远程实现. 实现底层与Systemui的通信,保证两者之间数据共享)。
- keyguard事件传递到了SystemUI, 并由KeyguardViewMediator进行事件的分派. 如部分视图由SystemUI显示, 即如StatusBarKeyguardViewManager来处理,并进入到KeyguardBouncer。 部分视图将传递到Keyguard, 由Keyguard来绘制, 如 KeyguardSecurityContainer来处理。
锁屏流程详述
- Zygote进程启动后会首先创建一个SystemServer进程;
/frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
/* Request to fork the system server process */
pid = Zygote.forkSystemServer ...
- SystemServer进程在调用startOtherServices时,同时也会调用WindowManagerService的systemReady()方法;
/frameworks/base/services/java/com/android/server/SystemServer.java
private void startOtherServices() {
...
wm = WindowManagerService.main(context, inputManager,
mFactoryTestMode != FactoryTest.FACTORY_TEST_LOW_LEVEL,
!mFirstBoot, mOnlyCore);
...
try {
wm.systemReady(); //WindowManagerService的systemReady()方法
} catch (Throwable e) {
reportWtf("making Window Manager Service ready", e);
}
}
- 在WindowManagerService服务中,直接调用了WindowManagerPolicy.java的systemReady()方法,而具体方法的实现在PhoneWindowManager.java中。
注: 窗口管理服务WindowManagerService的职责是对系统中的所有窗口进行管理
frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java
@VisibleForTesting
WindowManagerPolicy mPolicy;
public void systemReady() {
mSystemReady = true;
mPolicy.systemReady();
...
}
- 在PhoneWindowManager的systemReady()中,会依据一个Boolean值bindKeyguardNow来决定是否绑定keyguard service
frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManag