FingerprintService

类图

  1. 客户端进程执行指纹enroll、remove、authenticate等操作时,FingerprintService 里都会创建一个对应的ClientMonitor对象。
  2. 同一时间只能有一个ClientMonitor对象处于active状态。
  3. InternalEnumerateClient和InternalRemovalClient只由 FingerprintService内部创建使用,客户端进程无法触发创建。
  4. android支持多用户,每个用户对应一个FingerprintsUserState对象。FingerprintsUserState对象负责把用户所属的指纹信息例如name、groupId、fingerId、deviceId保存到settings_fingerprint.xml。

binder通信接口

指纹录入流程

息屏监听指纹解锁

指纹录入身份认证

主要FEATURES

1:TaskStackListener mTaskStackListener;
监听除Keyguard外AuthenticationClient,如果client切换到backgroud,则AuthenticationClient执行stop()停止指纹认证操作。指纹hal层onError(FINGERPRINT_ERROR_CANCELED)通知client。

2:multi user
指纹框架服务支持多用户,每个用户有其唯一的指纹存储路径,例如:android O是/data/system/users/0/fpdata,android P
是/data/vendor_de/0/fpdata。当监听到user切换时,调用updateActiveGroup()把新用户的指纹存储路径传给指纹hal层,同时调用doFingerprintCleanupForUser()执行指纹清除操作。

3:doFingerprintCleanupForUser()
在指纹服务初始化或用户切换时都会调用doFingerprintCleanupForUser()执行指纹清除操作。
其原理如下:
构造InternalEnumerateClient对象,其成员mEnrolledList保存了从settings_fingerprint.xml文件读取到的指纹列表。InternalEnumerateClient对象枚举底层所有指纹,如果枚举指纹ID在mEnrolledList存在,则从mEnrolledList里删除对应指纹id,如果不存在把枚举指纹ID保存到mUnknownFingerprints里。最后mEnrolledList保存的是要从settings_fingerprint.xml文件删除的指纹,mUnknownFingerprints保存的是通过InternalRemovalClient删除的底层指纹。在指纹枚举过程中当remaining == 0时启动指纹删除操作。

4:ClientMonitor对象不能并存
一个ClientMonitor对象start时,会cancel()当前的ClientMonitor对象。cancel()调用期望底层上报FINGERPRINT_ERROR_CANCELED error消息,
handleError()函数里start()新的ClientMonitor对象。为了防止底层不上报FINGERPRINT_ERROR_CANCELED error消息,延迟启动Runnable对象mResetClientState 来start()新的ClientMonitor对象。所以正常情况下这个Runnable对象不会执行。

5:lockout
lockout功能就是指纹验证失败次数达到某一阈值后,指纹验证操作处于lockout状态,client无法进行指纹验证。
lockout既可以在底层指纹hal层实现也可以在指纹服务实现。目前指纹服务已经实现此FEATURE。
lockout状态有TIMED和PERMANENT:
private static final long FAIL_LOCKOUT_TIMEOUT_MS = 30*1000;
private static final int MAX_FAILED_ATTEMPTS_LOCKOUT_TIMED = 5;
private static final int MAX_FAILED_ATTEMPTS_LOCKOUT_PERMANENT = 20;

posted @ 2020-11-25 22:49  bobfly1984  阅读(136)  评论(0编辑  收藏  举报