Loading services/core/java/com/android/server/biometrics/log/BiometricFrameworkStatsLogger.java +22 −2 Original line number Diff line number Diff line Loading @@ -115,7 +115,7 @@ public class BiometricFrameworkStatsLogger { /** {@see FrameworkStatsLog.BIOMETRIC_ENROLLED}. */ public void enroll(int statsModality, int statsAction, int statsClient, int targetUserId, long latency, boolean enrollSuccessful, float ambientLightLux, int source) { int source, int templateId) { FrameworkStatsLog.write(FrameworkStatsLog.BIOMETRIC_ENROLLED, statsModality, targetUserId, Loading @@ -124,7 +124,27 @@ public class BiometricFrameworkStatsLogger { -1, /* sensorId */ ambientLightLux, source, -1 /* templateId*/); templateId); } /** {@see FrameworkStatsLog.BIOMETRIC_UNENROLLED} */ public void unenrolled(int statsModality, int targetUserId, int reason, int templateId) { FrameworkStatsLog.write(FrameworkStatsLog.BIOMETRIC_UNENROLLED, statsModality, targetUserId, reason, templateId); } /** {@see FrameworkStatsLog.BIOMETRIC_ENUMERATED} */ public void enumerated(int statsModality, int targetUserId, int result, int[] templateIdsHal, int[] templateIdsFramework) { FrameworkStatsLog.write(FrameworkStatsLog.BIOMETRIC_ENUMERATED, statsModality, targetUserId, result, templateIdsHal, templateIdsFramework); } /** {@see FrameworkStatsLog.BIOMETRIC_ERROR_OCCURRED}. */ Loading services/core/java/com/android/server/biometrics/log/BiometricLogger.java +50 −3 Original line number Diff line number Diff line Loading @@ -32,6 +32,8 @@ import com.android.internal.util.FrameworkStatsLog; import com.android.server.biometrics.AuthenticationStatsCollector; import com.android.server.biometrics.Utils; import java.util.Arrays; /** * Logger for all reported Biometric framework events. */ Loading Loading @@ -254,7 +256,7 @@ public class BiometricLogger { /** Log enrollment outcome. */ public void logOnEnrolled(int targetUserId, long latency, boolean enrollSuccessful, int source) { int source, int templateId) { if (!mShouldLogMetrics) { return; } Loading @@ -265,7 +267,8 @@ public class BiometricLogger { + ", Client: " + mStatsClient + ", Latency: " + latency + ", Lux: " + mALSProbe.getMostRecentLux() + ", Success: " + enrollSuccessful); + ", Success: " + enrollSuccessful + ", TemplateId: " + templateId); } else { Slog.v(TAG, "Enroll latency: " + latency); } Loading @@ -275,7 +278,51 @@ public class BiometricLogger { } mSink.enroll(mStatsModality, mStatsAction, mStatsClient, targetUserId, latency, enrollSuccessful, mALSProbe.getMostRecentLux(), source); targetUserId, latency, enrollSuccessful, mALSProbe.getMostRecentLux(), source, templateId); } /** Log un-enrollment. */ public void logOnUnEnrolled(int targetUserId, int reason, int templateId) { if (!mShouldLogMetrics) { return; } if (DEBUG) { Slog.v(TAG, "UnEnrolled! Modality: " + mStatsModality + ", User: " + targetUserId + ", reason: " + reason + ", templateId: " + templateId); } if (shouldSkipLogging()) { return; } mSink.unenrolled(mStatsModality, targetUserId, reason, templateId); } /** Log enumeration. */ public void logOnEnumerated(int targetUserId, int result, int[] templateIdsHal, int[] templateIdsFramework) { if (!mShouldLogMetrics) { return; } if (DEBUG) { Slog.v(TAG, "Enumerated! Modality: " + mStatsModality + ", User: " + targetUserId + ", result: " + result + ", templateIdsHal: " + Arrays.toString(templateIdsHal) + ", templateIdsFramework: " + Arrays.toString(templateIdsFramework)); } if (shouldSkipLogging()) { return; } mSink.enumerated(mStatsModality, targetUserId, result, templateIdsHal, templateIdsFramework); } /** Report unexpected enrollment reported by the HAL. */ Loading services/core/java/com/android/server/biometrics/sensors/EnrollClient.java +2 −2 Original line number Diff line number Diff line Loading @@ -95,7 +95,7 @@ public abstract class EnrollClient<T> extends AcquisitionClient<T> implements En mBiometricUtils.addBiometricForUser(getContext(), getTargetUserId(), identifier); getLogger().logOnEnrolled(getTargetUserId(), System.currentTimeMillis() - mEnrollmentStartTimeMs, true /* enrollSuccessful */, mEnrollReason); true /* enrollSuccessful */, mEnrollReason, identifier.getBiometricId()); mCallback.onClientFinished(this, true /* success */); } notifyUserActivity(); Loading Loading @@ -123,7 +123,7 @@ public abstract class EnrollClient<T> extends AcquisitionClient<T> implements En public void onError(int error, int vendorCode) { getLogger().logOnEnrolled(getTargetUserId(), System.currentTimeMillis() - mEnrollmentStartTimeMs, false /* enrollSuccessful */, mEnrollReason); false /* enrollSuccessful */, mEnrollReason, -1 /* templateId */); super.onError(error, vendorCode); } Loading services/core/java/com/android/server/biometrics/sensors/InternalCleanupClient.java +4 −2 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.server.biometrics.sensors; import android.annotation.NonNull; import android.content.Context; import android.hardware.biometrics.BiometricAuthenticator; import android.hardware.biometrics.BiometricsProtoEnums; import android.os.Build; import android.os.IBinder; import android.util.Slog; Loading Loading @@ -135,7 +136,7 @@ public abstract class InternalCleanupClient<S extends BiometricAuthenticator.Ide Supplier<T> lazyDaemon, IBinder token, int biometricId, int userId, String owner, BiometricUtils<S> utils, int sensorId, @NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext, Map<Integer, Long> authenticatorIds); Map<Integer, Long> authenticatorIds, int reason); protected InternalCleanupClient(@NonNull Context context, @NonNull Supplier<T> lazyDaemon, int userId, @NonNull String owner, int sensorId, Loading @@ -158,7 +159,8 @@ public abstract class InternalCleanupClient<S extends BiometricAuthenticator.Ide mCurrentTask = getRemovalClient(getContext(), mLazyDaemon, getToken(), template.mIdentifier.getBiometricId(), template.mUserId, getContext().getPackageName(), mBiometricUtils, getSensorId(), getLogger(), getBiometricContext(), mAuthenticatorIds); getLogger(), getBiometricContext(), mAuthenticatorIds, BiometricsProtoEnums.UNENROLL_REASON_DANGLING_HAL); getLogger().logUnknownEnrollmentInHal(); Loading services/core/java/com/android/server/biometrics/sensors/InternalEnumerateClient.java +46 −1 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.server.biometrics.sensors; import android.annotation.NonNull; import android.content.Context; import android.hardware.biometrics.BiometricAuthenticator; import android.hardware.biometrics.BiometricsProtoEnums; import android.os.IBinder; import android.util.Slog; Loading Loading @@ -46,6 +47,10 @@ public abstract class InternalEnumerateClient<T> extends HalClientMonitor<T> // List of templates to remove from the HAL private List<BiometricAuthenticator.Identifier> mUnknownHALTemplates = new ArrayList<>(); private final int mInitialEnrolledSize; private final int[] mEnrolledIdsFrameworkArray; private final List<Integer> mEnrolledIdsHalList = new ArrayList<>(); private boolean mIsDanglingFramework; private boolean mIsDanglingHal; protected InternalEnumerateClient(@NonNull Context context, @NonNull Supplier<T> lazyDaemon, @NonNull IBinder token, int userId, @NonNull String owner, Loading @@ -60,14 +65,26 @@ public abstract class InternalEnumerateClient<T> extends HalClientMonitor<T> mEnrolledList = enrolledList; mInitialEnrolledSize = mEnrolledList.size(); mUtils = utils; // Record ids from frameworks for metrics mEnrolledIdsFrameworkArray = new int[mInitialEnrolledSize]; for (int i = 0; i < mInitialEnrolledSize; i++) { mEnrolledIdsFrameworkArray[i] = mEnrolledList.get(i).getBiometricId(); } } @Override public void onEnumerationResult(BiometricAuthenticator.Identifier identifier, int remaining) { if (identifier != null) { // Record ids from hal for metrics mEnrolledIdsHalList.add(identifier.getBiometricId()); } handleEnumeratedTemplate(identifier); if (remaining == 0) { mIsDanglingHal = !mUnknownHALTemplates.isEmpty(); mIsDanglingFramework = !mEnrolledList.isEmpty(); doTemplateCleanup(); logEnumerationResult(); mCallback.onClientFinished(this, true /* success */); } } Loading Loading @@ -123,7 +140,9 @@ public abstract class InternalEnumerateClient<T> extends HalClientMonitor<T> + identifier.getBiometricId() + " " + identifier.getName()); mUtils.removeBiometricForUser(getContext(), getTargetUserId(), identifier.getBiometricId()); getLogger().logOnUnEnrolled(getTargetUserId(), BiometricsProtoEnums.UNENROLL_REASON_DANGLING_FRAMEWORK, identifier.getBiometricId()); getLogger().logUnknownEnrollmentInFramework(); } Loading @@ -134,6 +153,32 @@ public abstract class InternalEnumerateClient<T> extends HalClientMonitor<T> mEnrolledList.clear(); } private void logEnumerationResult() { final int result; if (mIsDanglingFramework && mIsDanglingHal) { result = BiometricsProtoEnums.ENUMERATION_RESULT_DANGLING_BOTH; } else if (mIsDanglingFramework) { result = BiometricsProtoEnums.ENUMERATION_RESULT_DANGLING_FRAMEWORK; } else if (mIsDanglingHal) { result = BiometricsProtoEnums.ENUMERATION_RESULT_DANGLING_HAL; } else { result = BiometricsProtoEnums.ENUMERATION_RESULT_OK; } final int[] idsHalArray = listToArray(mEnrolledIdsHalList); getLogger().logOnEnumerated( getTargetUserId(), result, idsHalArray, mEnrolledIdsFrameworkArray); } private int[] listToArray(List<Integer> ids) { final int size = ids.size(); int[] array = new int[size]; for (int i = 0; i < size; i++) { array[i] = ids.get(i); } return array; } public List<BiometricAuthenticator.Identifier> getUnknownHALTemplates() { return mUnknownHALTemplates; } Loading Loading
services/core/java/com/android/server/biometrics/log/BiometricFrameworkStatsLogger.java +22 −2 Original line number Diff line number Diff line Loading @@ -115,7 +115,7 @@ public class BiometricFrameworkStatsLogger { /** {@see FrameworkStatsLog.BIOMETRIC_ENROLLED}. */ public void enroll(int statsModality, int statsAction, int statsClient, int targetUserId, long latency, boolean enrollSuccessful, float ambientLightLux, int source) { int source, int templateId) { FrameworkStatsLog.write(FrameworkStatsLog.BIOMETRIC_ENROLLED, statsModality, targetUserId, Loading @@ -124,7 +124,27 @@ public class BiometricFrameworkStatsLogger { -1, /* sensorId */ ambientLightLux, source, -1 /* templateId*/); templateId); } /** {@see FrameworkStatsLog.BIOMETRIC_UNENROLLED} */ public void unenrolled(int statsModality, int targetUserId, int reason, int templateId) { FrameworkStatsLog.write(FrameworkStatsLog.BIOMETRIC_UNENROLLED, statsModality, targetUserId, reason, templateId); } /** {@see FrameworkStatsLog.BIOMETRIC_ENUMERATED} */ public void enumerated(int statsModality, int targetUserId, int result, int[] templateIdsHal, int[] templateIdsFramework) { FrameworkStatsLog.write(FrameworkStatsLog.BIOMETRIC_ENUMERATED, statsModality, targetUserId, result, templateIdsHal, templateIdsFramework); } /** {@see FrameworkStatsLog.BIOMETRIC_ERROR_OCCURRED}. */ Loading
services/core/java/com/android/server/biometrics/log/BiometricLogger.java +50 −3 Original line number Diff line number Diff line Loading @@ -32,6 +32,8 @@ import com.android.internal.util.FrameworkStatsLog; import com.android.server.biometrics.AuthenticationStatsCollector; import com.android.server.biometrics.Utils; import java.util.Arrays; /** * Logger for all reported Biometric framework events. */ Loading Loading @@ -254,7 +256,7 @@ public class BiometricLogger { /** Log enrollment outcome. */ public void logOnEnrolled(int targetUserId, long latency, boolean enrollSuccessful, int source) { int source, int templateId) { if (!mShouldLogMetrics) { return; } Loading @@ -265,7 +267,8 @@ public class BiometricLogger { + ", Client: " + mStatsClient + ", Latency: " + latency + ", Lux: " + mALSProbe.getMostRecentLux() + ", Success: " + enrollSuccessful); + ", Success: " + enrollSuccessful + ", TemplateId: " + templateId); } else { Slog.v(TAG, "Enroll latency: " + latency); } Loading @@ -275,7 +278,51 @@ public class BiometricLogger { } mSink.enroll(mStatsModality, mStatsAction, mStatsClient, targetUserId, latency, enrollSuccessful, mALSProbe.getMostRecentLux(), source); targetUserId, latency, enrollSuccessful, mALSProbe.getMostRecentLux(), source, templateId); } /** Log un-enrollment. */ public void logOnUnEnrolled(int targetUserId, int reason, int templateId) { if (!mShouldLogMetrics) { return; } if (DEBUG) { Slog.v(TAG, "UnEnrolled! Modality: " + mStatsModality + ", User: " + targetUserId + ", reason: " + reason + ", templateId: " + templateId); } if (shouldSkipLogging()) { return; } mSink.unenrolled(mStatsModality, targetUserId, reason, templateId); } /** Log enumeration. */ public void logOnEnumerated(int targetUserId, int result, int[] templateIdsHal, int[] templateIdsFramework) { if (!mShouldLogMetrics) { return; } if (DEBUG) { Slog.v(TAG, "Enumerated! Modality: " + mStatsModality + ", User: " + targetUserId + ", result: " + result + ", templateIdsHal: " + Arrays.toString(templateIdsHal) + ", templateIdsFramework: " + Arrays.toString(templateIdsFramework)); } if (shouldSkipLogging()) { return; } mSink.enumerated(mStatsModality, targetUserId, result, templateIdsHal, templateIdsFramework); } /** Report unexpected enrollment reported by the HAL. */ Loading
services/core/java/com/android/server/biometrics/sensors/EnrollClient.java +2 −2 Original line number Diff line number Diff line Loading @@ -95,7 +95,7 @@ public abstract class EnrollClient<T> extends AcquisitionClient<T> implements En mBiometricUtils.addBiometricForUser(getContext(), getTargetUserId(), identifier); getLogger().logOnEnrolled(getTargetUserId(), System.currentTimeMillis() - mEnrollmentStartTimeMs, true /* enrollSuccessful */, mEnrollReason); true /* enrollSuccessful */, mEnrollReason, identifier.getBiometricId()); mCallback.onClientFinished(this, true /* success */); } notifyUserActivity(); Loading Loading @@ -123,7 +123,7 @@ public abstract class EnrollClient<T> extends AcquisitionClient<T> implements En public void onError(int error, int vendorCode) { getLogger().logOnEnrolled(getTargetUserId(), System.currentTimeMillis() - mEnrollmentStartTimeMs, false /* enrollSuccessful */, mEnrollReason); false /* enrollSuccessful */, mEnrollReason, -1 /* templateId */); super.onError(error, vendorCode); } Loading
services/core/java/com/android/server/biometrics/sensors/InternalCleanupClient.java +4 −2 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.server.biometrics.sensors; import android.annotation.NonNull; import android.content.Context; import android.hardware.biometrics.BiometricAuthenticator; import android.hardware.biometrics.BiometricsProtoEnums; import android.os.Build; import android.os.IBinder; import android.util.Slog; Loading Loading @@ -135,7 +136,7 @@ public abstract class InternalCleanupClient<S extends BiometricAuthenticator.Ide Supplier<T> lazyDaemon, IBinder token, int biometricId, int userId, String owner, BiometricUtils<S> utils, int sensorId, @NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext, Map<Integer, Long> authenticatorIds); Map<Integer, Long> authenticatorIds, int reason); protected InternalCleanupClient(@NonNull Context context, @NonNull Supplier<T> lazyDaemon, int userId, @NonNull String owner, int sensorId, Loading @@ -158,7 +159,8 @@ public abstract class InternalCleanupClient<S extends BiometricAuthenticator.Ide mCurrentTask = getRemovalClient(getContext(), mLazyDaemon, getToken(), template.mIdentifier.getBiometricId(), template.mUserId, getContext().getPackageName(), mBiometricUtils, getSensorId(), getLogger(), getBiometricContext(), mAuthenticatorIds); getLogger(), getBiometricContext(), mAuthenticatorIds, BiometricsProtoEnums.UNENROLL_REASON_DANGLING_HAL); getLogger().logUnknownEnrollmentInHal(); Loading
services/core/java/com/android/server/biometrics/sensors/InternalEnumerateClient.java +46 −1 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.server.biometrics.sensors; import android.annotation.NonNull; import android.content.Context; import android.hardware.biometrics.BiometricAuthenticator; import android.hardware.biometrics.BiometricsProtoEnums; import android.os.IBinder; import android.util.Slog; Loading Loading @@ -46,6 +47,10 @@ public abstract class InternalEnumerateClient<T> extends HalClientMonitor<T> // List of templates to remove from the HAL private List<BiometricAuthenticator.Identifier> mUnknownHALTemplates = new ArrayList<>(); private final int mInitialEnrolledSize; private final int[] mEnrolledIdsFrameworkArray; private final List<Integer> mEnrolledIdsHalList = new ArrayList<>(); private boolean mIsDanglingFramework; private boolean mIsDanglingHal; protected InternalEnumerateClient(@NonNull Context context, @NonNull Supplier<T> lazyDaemon, @NonNull IBinder token, int userId, @NonNull String owner, Loading @@ -60,14 +65,26 @@ public abstract class InternalEnumerateClient<T> extends HalClientMonitor<T> mEnrolledList = enrolledList; mInitialEnrolledSize = mEnrolledList.size(); mUtils = utils; // Record ids from frameworks for metrics mEnrolledIdsFrameworkArray = new int[mInitialEnrolledSize]; for (int i = 0; i < mInitialEnrolledSize; i++) { mEnrolledIdsFrameworkArray[i] = mEnrolledList.get(i).getBiometricId(); } } @Override public void onEnumerationResult(BiometricAuthenticator.Identifier identifier, int remaining) { if (identifier != null) { // Record ids from hal for metrics mEnrolledIdsHalList.add(identifier.getBiometricId()); } handleEnumeratedTemplate(identifier); if (remaining == 0) { mIsDanglingHal = !mUnknownHALTemplates.isEmpty(); mIsDanglingFramework = !mEnrolledList.isEmpty(); doTemplateCleanup(); logEnumerationResult(); mCallback.onClientFinished(this, true /* success */); } } Loading Loading @@ -123,7 +140,9 @@ public abstract class InternalEnumerateClient<T> extends HalClientMonitor<T> + identifier.getBiometricId() + " " + identifier.getName()); mUtils.removeBiometricForUser(getContext(), getTargetUserId(), identifier.getBiometricId()); getLogger().logOnUnEnrolled(getTargetUserId(), BiometricsProtoEnums.UNENROLL_REASON_DANGLING_FRAMEWORK, identifier.getBiometricId()); getLogger().logUnknownEnrollmentInFramework(); } Loading @@ -134,6 +153,32 @@ public abstract class InternalEnumerateClient<T> extends HalClientMonitor<T> mEnrolledList.clear(); } private void logEnumerationResult() { final int result; if (mIsDanglingFramework && mIsDanglingHal) { result = BiometricsProtoEnums.ENUMERATION_RESULT_DANGLING_BOTH; } else if (mIsDanglingFramework) { result = BiometricsProtoEnums.ENUMERATION_RESULT_DANGLING_FRAMEWORK; } else if (mIsDanglingHal) { result = BiometricsProtoEnums.ENUMERATION_RESULT_DANGLING_HAL; } else { result = BiometricsProtoEnums.ENUMERATION_RESULT_OK; } final int[] idsHalArray = listToArray(mEnrolledIdsHalList); getLogger().logOnEnumerated( getTargetUserId(), result, idsHalArray, mEnrolledIdsFrameworkArray); } private int[] listToArray(List<Integer> ids) { final int size = ids.size(); int[] array = new int[size]; for (int i = 0; i < size; i++) { array[i] = ids.get(i); } return array; } public List<BiometricAuthenticator.Identifier> getUnknownHALTemplates() { return mUnknownHALTemplates; } Loading