欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

洞悉Android Keyguard

程序员文章站 2023-10-27 12:03:28
Android Keyguard自Android L以来一直没有多大变化。在Android L之前, Keyguard有自己独立的进程,KeyguardService自开机时启动并常驻。Android L之后到Android P,Keyguard和SystemUI共同享有一个进程。process i ......

      Android Keyguard自Android L以来一直没有多大变化。在Android L之前, Keyguard有自己独立的进程,KeyguardService自开机时启动并常驻。Android L之后到Android P,Keyguard和SystemUI共同享有一个进程。process id为com.android.systemui, Keyguard可以看做是SystemUI的一个lib库。可表示为如下:

                           洞悉Android Keyguard

Keyguard架构有较大变化,同时Keyguard UI界面也有很大变化, 包含两个主界面,一个是显示Notification的主界面,称为Notification Keyguard, 另一个是在系统锁屏方式为安全锁时用来用户输入密码解锁的界面,称为Bouncer界面。如下图所示(下面左图为Notification Keyguard界面, 上滑之后进入第二个界面,即Bouncer界面)。

                                              洞悉Android Keyguard                                        洞悉Android Keyguard

        一、System boot Create Keyguard Flow

        KeyguardService在System boot ready时开始bind, 同时会根据用户设置的锁屏方式去create对应keyguard, 锁屏方式可以分为None(无,即没有锁屏), Swipe(滑动,即滑动解锁),Pattern(图案,输入图案解锁,密码长度至少连接四个点), Password(密码,输入密码解锁,密码由数字和字母组合组成,密码长度至少为4),PIN(PIN, 密码只包含数字, 密码长度至少为4)。System boot时create keyguard flow如下:

 洞悉Android Keyguard

 

洞悉Android Keyguard

洞悉Android Keyguard

洞悉Android Keyguard

 

 洞悉Android Keyguard

 下面log是对应flow的关键log, 可以从log check create flow跑到了哪个阶段,可以迅速的debug出问题。

洞悉Android Keyguard

 

      二、系统灭屏时Create Keyguard Flow

      在系统灭屏时,也会去create keyguard, 默认在power key灭屏之后会去立即create keyguard, 但如果没有勾选"power key立即锁屏",或者是timeout灭屏(即系统无操作,隔一段时间后自动熄屏),则默认会在灭屏之后隔5s才去create keyguard. 灭屏去create keyguard的flow与boot 时去create keyguard flow差不多,只是触发条件不同而已,如下:

 洞悉Android Keyguard

洞悉Android Keyguard

 下面log是对应灭屏create keyguard flow的关键log。

洞悉Android Keyguard

 

      三、Power Key亮屏Flow

      在系统亮屏时,会等keyguard画好之后再亮屏(如果user有设置keyguard的话),即亮屏时会被keyguard block住,等keyguard画完之后会通知PowerManagerService去亮屏。亮屏flow相对简单,如下:

     洞悉Android Keyguard

 

洞悉Android Keyguard

  下面log是对应power key亮屏 flow的关键log。

 洞悉Android Keyguard

 

      四、Dismiss Keyguard Flow

      然后除了create keyguard外,另一重要的flow就是解锁了,用户滑动或者输入密码之后会去解锁。由于Keyguard和SystemUI同属一个进程,并与StatusBar共用一个window的关系,解锁flow比前面稍微复杂一点。下面是以pattern锁为例解锁flow图:

    洞悉Android Keyguard

洞悉Android Keyguard

洞悉Android Keyguard

   下面log是对应pattern锁屏解锁 flow的关键log。

 洞悉Android Keyguard

 

      至此,Keyguard几个重要的flow都已介绍完毕,除了常规的锁屏方式外,Android也支持人脸解锁,语音解锁,指纹解锁。这些生物识别的解锁方式也是需要Keyguard的配合才能完成,Android厂商如要开发自己的Keyguard, 不使用Android default Keyguard, 在接入这些生物识别的解锁方式时,需要做一些修改来和自己的Keyguard适配。Hardware -> kernel -> HAL -> framework -> keyguard.