粗略了解下指纹的录入和解锁流程, 记录如下
Android P
Finger Enroll:
1.Settings
FingerprintEnrollIntroduction
FingerprintEnrollFindSensor
FingerprintEnrollEnrolling
FingerprintEnrollSidecar(Fragment)
->onStart
->startEnrollment()
// FingerprintManager
2.framework/base/core
->mFingerprintManager.enroll(mToken, mEnrollmentCancel,mFingerprintIndex /* flags */, mUserId, mEnrollmentCallback);
// FingerprintService
->mService.enroll(mToken, token, userId, mServiceReceiver, flags,mContext.getOpPackageName());
->startEnrollment(token, cryptoToken, userId, receiver, flags,restricted, opPackageName);
->FingerprintService.this.getFingerprintDaemon();
->mHalDeviceId = mDaemon.setNotify(mDaemonCallback);
->handleEnrollResult(deviceId, fingerId, groupId, remaining);
// EnrollClient
->client.onEnrollResult(fingerId, groupId, remaining)
->FingerprintUtils.getInstance().addFingerprintForUser(getContext(), fingerId,getTargetUserId(), mIndex);
->getStateForUser(ctx, userId).addFingerprintWithIndex(fingerId, userId, index);
// FingerprintsUserState
->scheduleWriteStateLocked();
->doWriteState()
// new File(Environment.getUserSystemDirectory(userId), FINGERPRINT_FILE);
// settings_fingerprint.xmlFinger Authentication:
// FingerprintService
handleAuthenticated(deviceId, fingerId, groupId, token);
client.onAuthenticated(fingerId, groupId)
// AuthenticationClient
(IFingerprintServiceReceiver) receiver.onAuthenticationSucceeded(getHalDeviceId(), fp, getTargetUserId());
// FingerprintManager
mHandler.obtainMessage(MSG_AUTHENTICATION_SUCCEEDED, userId, 0, fp).sendToTarget();
mAuthenticationCallback.onAuthenticationSucceeded(result);
// KeyguardUpdateMonitor
handleFingerprintAuthenticated(result.getUserId());
Android Q
// Authentation Finger Schedule: (close Screen, Authentation with finger(Success))
// PhoneWindowManager
mKeyguardDelegate.onStartedGoingToSleep(why);
// KeyguardServiceDelegate
mKeyguardService.onStartedGoingToSleep(why);
// KeyguardServiceWrapper
mService.onStartedGoingToSleep(reason);
// KeyguardService
mKeyguardViewMediator.onStartedGoingToSleep(reason);
// KeyguardViewMediator
KeyguardUpdateMonitor.getInstance(mContext).dispatchStartedGoingToSleep(why);
// KeyguardUpdateMonitor#
handleStartedGoingToSleep(msg.arg1);
updateBiometricListeningState();
updateFingerprintListeningState()
startListeningForFingerprint()
mFpm.authenticate(null, mFingerprintCancelSignal, 0, mFingerprintAuthenticationCallback,null, userId);
// FingerprintManager
-> authenticate(
-> (IFingerprintService)mService.authenticate(mToken, sessionId, userId, mServiceReceiver, flags,mContext.getOpPackageName());
-> // FingerprintService# private final class FingerprintServiceWrapper extends IFingerprintService.Stub {
-> public void authenticate(final IBinder token, final long opId, final int groupId,
-> authenticateInternal(
-> startAuthentication(
startClient(client, true /* initiatedByClient */);
// AuthenticationClient#start()
final int result = getDaemonWrapper().authenticate(mOpId, getGroupId());
BiometricServiceBase#protected interface DaemonWrapper { -> int authenticate(long operationId, int groupId) throws RemoteException;
IBiometricsFingerprint daemon = getFingerprintDaemon();
IBiometricsFingerprint daemon = getFingerprintDaemon();
mHalDeviceId = mDaemon.setNotify(mDaemonCallback);
public void onAuthenticated(final long deviceId, final int fingerId, final int groupId,
FingerprintService.super.handleAuthenticated(fp, token);
client.onAuthenticated(identifier, authenticated, token)
// AuthenticationClient#
(BiometricServiceBase.ServiceListener)listener.onAuthenticationSucceeded(getHalDeviceId(), identifier, getTargetUserId());
Or: listener.onAuthenticationFailed(getHalDeviceId());
// FingerprintService#
mFingerprintServiceReceiver.onAuthenticationSucceeded(deviceId, (Fingerprint) biometric, userId);
//FingerprintManager#
mHandler.obtainMessage(MSG_AUTHENTICATION_SUCCEEDED, userId, 0, fp).sendToTarget();
sendAuthenticatedSucceeded((Fingerprint) msg.obj, msg.arg1 /* userId */);
mAuthenticationCallback.onAuthenticationSucceeded(result);
// KeyguardUpdateMonitor
handleFingerprintAuthenticated(result.getUserId());// Enroll finger Schedule:
// package/apps/Settings
// FingerprintEnrollIntroduction extends BiometricEnrollIntroduction
onNextButtonClick( # launchNextEnrollingActivity(mToken);
// FingerprintEnrollFindSensor#
startLookingForFingerprint()
// FingerprintEnrollEnrolling extens BiometricsEnrollEnrolling
startEnrollment() # mSidecar.setListener(this);
// BiometricEnrollSidecar#onStart()
startEnrollment()
// FingerprintEnrollSidecar
startEnrollment()
// FingerprintManager
mFingerprintManager.enroll(mToken, mEnrollmentCancel,0 /* flags */, mUserId, mEnrollmentCallback);
// FingerprintService
enroll(final IBinder token, final byte[] cryptoToken, final int userId,
enrollInternal(
startClient(client, true /* initiatedByClient */);
startCurrentClient(mCurrentClient.getCookie());
mCurrentClient.start();
// EnrollClient
final int result = getDaemonWrapper().enroll(mCryptoToken, getGroupId(), timeout,disabledFeatures);
// FingerprintService
IBiometricsFingerprint daemon = getFingerprintDaemon();
public void onEnrollResult(final long deviceId, final int fingerId, final int groupId,
FingerprintService.super.handleEnrollResult(fingerprint, remaining);
client.onEnrollResult(identifier, remaining)
// EnrollClient
mBiometricUtils.addBiometricForUser(getContext(), getTargetUserId(), identifier);
// FingerprintUtils
getStateForUser(context, userId).addBiometric(identifier);
// FingerprintUserState
super.addBiometric(identifier);
// BiometricUserState
scheduleWriteStateLocked()
// FingerprintUserState
doWriteState()
destination.finishWrite(out);
File(Environment.getUserSystemDirectory(userId), getBiometricFile());