Loading services/core/java/com/android/server/biometrics/sensors/BiometricScheduler.java +13 −0 Original line number Original line Diff line number Diff line Loading @@ -543,6 +543,10 @@ public class BiometricScheduler { return mCurrentOperation.clientMonitor; return mCurrentOperation.clientMonitor; } } public int getCurrentPendingCount() { return mPendingOperations.size(); } public void recordCrashState() { public void recordCrashState() { if (mCrashStates.size() >= CrashState.NUM_ENTRIES) { if (mCrashStates.size() >= CrashState.NUM_ENTRIES) { mCrashStates.removeFirst(); mCrashStates.removeFirst(); Loading Loading @@ -573,4 +577,13 @@ public class BiometricScheduler { pw.println("Crash State " + crashState); pw.println("Crash State " + crashState); } } } } /** * Clears the scheduler of anything work-related. This should be used for example when the * HAL dies. */ public void reset() { mPendingOperations.clear(); mCurrentOperation = null; } } } services/core/java/com/android/server/biometrics/sensors/ClientMonitor.java +1 −1 Original line number Original line Diff line number Diff line Loading @@ -219,7 +219,7 @@ public abstract class ClientMonitor<T> extends LoggableMonitor implements IBinde return mSensorId; return mSensorId; } } public final T getFreshDaemon() { public T getFreshDaemon() { return mLazyDaemon.getDaemon(); return mLazyDaemon.getDaemon(); } } Loading services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java +6 −1 Original line number Original line Diff line number Diff line Loading @@ -41,6 +41,7 @@ import android.util.Slog; import android.util.SparseArray; import android.util.SparseArray; import android.util.proto.ProtoOutputStream; import android.util.proto.ProtoOutputStream; import com.android.internal.annotations.VisibleForTesting; import com.android.server.biometrics.Utils; import com.android.server.biometrics.Utils; import com.android.server.biometrics.sensors.AuthenticationClient; import com.android.server.biometrics.sensors.AuthenticationClient; import com.android.server.biometrics.sensors.ClientMonitor; import com.android.server.biometrics.sensors.ClientMonitor; Loading Loading @@ -71,7 +72,8 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider { @NonNull private final Context mContext; @NonNull private final Context mContext; @NonNull private final String mHalInstanceName; @NonNull private final String mHalInstanceName; @NonNull private final SparseArray<Sensor> mSensors; // Map of sensors that this HAL supports @NonNull @VisibleForTesting final SparseArray<Sensor> mSensors; // Map of sensors that this HAL supports @NonNull private final ClientMonitor.LazyDaemon<IFace> mLazyDaemon; @NonNull private final ClientMonitor.LazyDaemon<IFace> mLazyDaemon; @NonNull private final Handler mHandler; @NonNull private final Handler mHandler; @NonNull private final LockoutResetDispatcher mLockoutResetDispatcher; @NonNull private final LockoutResetDispatcher mLockoutResetDispatcher; Loading Loading @@ -596,8 +598,11 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider { mHandler.post(() -> { mHandler.post(() -> { mDaemon = null; mDaemon = null; for (int i = 0; i < mSensors.size(); i++) { for (int i = 0; i < mSensors.size(); i++) { final Sensor sensor = mSensors.valueAt(i); final int sensorId = mSensors.keyAt(i); final int sensorId = mSensors.keyAt(i); PerformanceTracker.getInstanceForSensorId(sensorId).incrementHALDeathCount(); PerformanceTracker.getInstanceForSensorId(sensorId).incrementHALDeathCount(); sensor.getScheduler().recordCrashState(); sensor.getScheduler().reset(); } } }); }); } } Loading services/core/java/com/android/server/biometrics/sensors/face/hidl/Face10.java +9 −6 Original line number Original line Diff line number Diff line Loading @@ -333,16 +333,17 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider { } } @VisibleForTesting @VisibleForTesting public Face10(@NonNull Context context, int sensorId, Face10(@NonNull Context context, int sensorId, @BiometricManager.Authenticators.Types int strength, @BiometricManager.Authenticators.Types int strength, @NonNull LockoutResetDispatcher lockoutResetDispatcher, @NonNull LockoutResetDispatcher lockoutResetDispatcher, boolean supportsSelfIllumination, int maxTemplatesAllowed) { boolean supportsSelfIllumination, int maxTemplatesAllowed, @NonNull BiometricScheduler scheduler) { mSensorProperties = new FaceSensorPropertiesInternal(sensorId, mSensorProperties = new FaceSensorPropertiesInternal(sensorId, Utils.authenticatorStrengthToPropertyStrength(strength), Utils.authenticatorStrengthToPropertyStrength(strength), maxTemplatesAllowed, false /* supportsFaceDetect */, supportsSelfIllumination); maxTemplatesAllowed, false /* supportsFaceDetect */, supportsSelfIllumination); mContext = context; mContext = context; mSensorId = sensorId; mSensorId = sensorId; mScheduler = new BiometricScheduler(TAG, null /* gestureAvailabilityTracker */); mScheduler = scheduler; mHandler = new Handler(Looper.getMainLooper()); mHandler = new Handler(Looper.getMainLooper()); mUsageStats = new UsageStats(context); mUsageStats = new UsageStats(context); mAuthenticatorIds = new HashMap<>(); mAuthenticatorIds = new HashMap<>(); Loading @@ -369,7 +370,8 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider { @NonNull LockoutResetDispatcher lockoutResetDispatcher) { @NonNull LockoutResetDispatcher lockoutResetDispatcher) { this(context, sensorId, strength, lockoutResetDispatcher, this(context, sensorId, strength, lockoutResetDispatcher, context.getResources().getBoolean(R.bool.config_faceAuthSupportsSelfIllumination), context.getResources().getBoolean(R.bool.config_faceAuthSupportsSelfIllumination), context.getResources().getInteger(R.integer.config_faceMaxTemplatesPerUser)); context.getResources().getInteger(R.integer.config_faceMaxTemplatesPerUser), new BiometricScheduler(TAG, null /* gestureAvailabilityTracker */)); } } @Override @Override Loading @@ -388,12 +390,13 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider { interruptable.onError(BiometricConstants.BIOMETRIC_ERROR_HW_UNAVAILABLE, interruptable.onError(BiometricConstants.BIOMETRIC_ERROR_HW_UNAVAILABLE, 0 /* vendorCode */); 0 /* vendorCode */); mScheduler.recordCrashState(); FrameworkStatsLog.write(FrameworkStatsLog.BIOMETRIC_SYSTEM_HEALTH_ISSUE_DETECTED, FrameworkStatsLog.write(FrameworkStatsLog.BIOMETRIC_SYSTEM_HEALTH_ISSUE_DETECTED, BiometricsProtoEnums.MODALITY_FACE, BiometricsProtoEnums.MODALITY_FACE, BiometricsProtoEnums.ISSUE_HAL_DEATH); BiometricsProtoEnums.ISSUE_HAL_DEATH); } } mScheduler.recordCrashState(); mScheduler.reset(); }); }); } } Loading services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java +6 −1 Original line number Original line Diff line number Diff line Loading @@ -41,6 +41,7 @@ import android.util.Slog; import android.util.SparseArray; import android.util.SparseArray; import android.util.proto.ProtoOutputStream; import android.util.proto.ProtoOutputStream; import com.android.internal.annotations.VisibleForTesting; import com.android.server.biometrics.Utils; import com.android.server.biometrics.Utils; import com.android.server.biometrics.sensors.AuthenticationClient; import com.android.server.biometrics.sensors.AuthenticationClient; import com.android.server.biometrics.sensors.ClientMonitor; import com.android.server.biometrics.sensors.ClientMonitor; Loading @@ -67,7 +68,8 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi @NonNull private final Context mContext; @NonNull private final Context mContext; @NonNull private final String mHalInstanceName; @NonNull private final String mHalInstanceName; @NonNull private final SparseArray<Sensor> mSensors; // Map of sensors that this HAL supports @NonNull @VisibleForTesting final SparseArray<Sensor> mSensors; // Map of sensors that this HAL supports @NonNull private final ClientMonitor.LazyDaemon<IFingerprint> mLazyDaemon; @NonNull private final ClientMonitor.LazyDaemon<IFingerprint> mLazyDaemon; @NonNull private final Handler mHandler; @NonNull private final Handler mHandler; @NonNull private final LockoutResetDispatcher mLockoutResetDispatcher; @NonNull private final LockoutResetDispatcher mLockoutResetDispatcher; Loading Loading @@ -607,8 +609,11 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi mDaemon = null; mDaemon = null; for (int i = 0; i < mSensors.size(); i++) { for (int i = 0; i < mSensors.size(); i++) { final Sensor sensor = mSensors.valueAt(i); final int sensorId = mSensors.keyAt(i); final int sensorId = mSensors.keyAt(i); PerformanceTracker.getInstanceForSensorId(sensorId).incrementHALDeathCount(); PerformanceTracker.getInstanceForSensorId(sensorId).incrementHALDeathCount(); sensor.getScheduler().recordCrashState(); sensor.getScheduler().reset(); } } }); }); } } Loading Loading
services/core/java/com/android/server/biometrics/sensors/BiometricScheduler.java +13 −0 Original line number Original line Diff line number Diff line Loading @@ -543,6 +543,10 @@ public class BiometricScheduler { return mCurrentOperation.clientMonitor; return mCurrentOperation.clientMonitor; } } public int getCurrentPendingCount() { return mPendingOperations.size(); } public void recordCrashState() { public void recordCrashState() { if (mCrashStates.size() >= CrashState.NUM_ENTRIES) { if (mCrashStates.size() >= CrashState.NUM_ENTRIES) { mCrashStates.removeFirst(); mCrashStates.removeFirst(); Loading Loading @@ -573,4 +577,13 @@ public class BiometricScheduler { pw.println("Crash State " + crashState); pw.println("Crash State " + crashState); } } } } /** * Clears the scheduler of anything work-related. This should be used for example when the * HAL dies. */ public void reset() { mPendingOperations.clear(); mCurrentOperation = null; } } }
services/core/java/com/android/server/biometrics/sensors/ClientMonitor.java +1 −1 Original line number Original line Diff line number Diff line Loading @@ -219,7 +219,7 @@ public abstract class ClientMonitor<T> extends LoggableMonitor implements IBinde return mSensorId; return mSensorId; } } public final T getFreshDaemon() { public T getFreshDaemon() { return mLazyDaemon.getDaemon(); return mLazyDaemon.getDaemon(); } } Loading
services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java +6 −1 Original line number Original line Diff line number Diff line Loading @@ -41,6 +41,7 @@ import android.util.Slog; import android.util.SparseArray; import android.util.SparseArray; import android.util.proto.ProtoOutputStream; import android.util.proto.ProtoOutputStream; import com.android.internal.annotations.VisibleForTesting; import com.android.server.biometrics.Utils; import com.android.server.biometrics.Utils; import com.android.server.biometrics.sensors.AuthenticationClient; import com.android.server.biometrics.sensors.AuthenticationClient; import com.android.server.biometrics.sensors.ClientMonitor; import com.android.server.biometrics.sensors.ClientMonitor; Loading Loading @@ -71,7 +72,8 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider { @NonNull private final Context mContext; @NonNull private final Context mContext; @NonNull private final String mHalInstanceName; @NonNull private final String mHalInstanceName; @NonNull private final SparseArray<Sensor> mSensors; // Map of sensors that this HAL supports @NonNull @VisibleForTesting final SparseArray<Sensor> mSensors; // Map of sensors that this HAL supports @NonNull private final ClientMonitor.LazyDaemon<IFace> mLazyDaemon; @NonNull private final ClientMonitor.LazyDaemon<IFace> mLazyDaemon; @NonNull private final Handler mHandler; @NonNull private final Handler mHandler; @NonNull private final LockoutResetDispatcher mLockoutResetDispatcher; @NonNull private final LockoutResetDispatcher mLockoutResetDispatcher; Loading Loading @@ -596,8 +598,11 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider { mHandler.post(() -> { mHandler.post(() -> { mDaemon = null; mDaemon = null; for (int i = 0; i < mSensors.size(); i++) { for (int i = 0; i < mSensors.size(); i++) { final Sensor sensor = mSensors.valueAt(i); final int sensorId = mSensors.keyAt(i); final int sensorId = mSensors.keyAt(i); PerformanceTracker.getInstanceForSensorId(sensorId).incrementHALDeathCount(); PerformanceTracker.getInstanceForSensorId(sensorId).incrementHALDeathCount(); sensor.getScheduler().recordCrashState(); sensor.getScheduler().reset(); } } }); }); } } Loading
services/core/java/com/android/server/biometrics/sensors/face/hidl/Face10.java +9 −6 Original line number Original line Diff line number Diff line Loading @@ -333,16 +333,17 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider { } } @VisibleForTesting @VisibleForTesting public Face10(@NonNull Context context, int sensorId, Face10(@NonNull Context context, int sensorId, @BiometricManager.Authenticators.Types int strength, @BiometricManager.Authenticators.Types int strength, @NonNull LockoutResetDispatcher lockoutResetDispatcher, @NonNull LockoutResetDispatcher lockoutResetDispatcher, boolean supportsSelfIllumination, int maxTemplatesAllowed) { boolean supportsSelfIllumination, int maxTemplatesAllowed, @NonNull BiometricScheduler scheduler) { mSensorProperties = new FaceSensorPropertiesInternal(sensorId, mSensorProperties = new FaceSensorPropertiesInternal(sensorId, Utils.authenticatorStrengthToPropertyStrength(strength), Utils.authenticatorStrengthToPropertyStrength(strength), maxTemplatesAllowed, false /* supportsFaceDetect */, supportsSelfIllumination); maxTemplatesAllowed, false /* supportsFaceDetect */, supportsSelfIllumination); mContext = context; mContext = context; mSensorId = sensorId; mSensorId = sensorId; mScheduler = new BiometricScheduler(TAG, null /* gestureAvailabilityTracker */); mScheduler = scheduler; mHandler = new Handler(Looper.getMainLooper()); mHandler = new Handler(Looper.getMainLooper()); mUsageStats = new UsageStats(context); mUsageStats = new UsageStats(context); mAuthenticatorIds = new HashMap<>(); mAuthenticatorIds = new HashMap<>(); Loading @@ -369,7 +370,8 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider { @NonNull LockoutResetDispatcher lockoutResetDispatcher) { @NonNull LockoutResetDispatcher lockoutResetDispatcher) { this(context, sensorId, strength, lockoutResetDispatcher, this(context, sensorId, strength, lockoutResetDispatcher, context.getResources().getBoolean(R.bool.config_faceAuthSupportsSelfIllumination), context.getResources().getBoolean(R.bool.config_faceAuthSupportsSelfIllumination), context.getResources().getInteger(R.integer.config_faceMaxTemplatesPerUser)); context.getResources().getInteger(R.integer.config_faceMaxTemplatesPerUser), new BiometricScheduler(TAG, null /* gestureAvailabilityTracker */)); } } @Override @Override Loading @@ -388,12 +390,13 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider { interruptable.onError(BiometricConstants.BIOMETRIC_ERROR_HW_UNAVAILABLE, interruptable.onError(BiometricConstants.BIOMETRIC_ERROR_HW_UNAVAILABLE, 0 /* vendorCode */); 0 /* vendorCode */); mScheduler.recordCrashState(); FrameworkStatsLog.write(FrameworkStatsLog.BIOMETRIC_SYSTEM_HEALTH_ISSUE_DETECTED, FrameworkStatsLog.write(FrameworkStatsLog.BIOMETRIC_SYSTEM_HEALTH_ISSUE_DETECTED, BiometricsProtoEnums.MODALITY_FACE, BiometricsProtoEnums.MODALITY_FACE, BiometricsProtoEnums.ISSUE_HAL_DEATH); BiometricsProtoEnums.ISSUE_HAL_DEATH); } } mScheduler.recordCrashState(); mScheduler.reset(); }); }); } } Loading
services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java +6 −1 Original line number Original line Diff line number Diff line Loading @@ -41,6 +41,7 @@ import android.util.Slog; import android.util.SparseArray; import android.util.SparseArray; import android.util.proto.ProtoOutputStream; import android.util.proto.ProtoOutputStream; import com.android.internal.annotations.VisibleForTesting; import com.android.server.biometrics.Utils; import com.android.server.biometrics.Utils; import com.android.server.biometrics.sensors.AuthenticationClient; import com.android.server.biometrics.sensors.AuthenticationClient; import com.android.server.biometrics.sensors.ClientMonitor; import com.android.server.biometrics.sensors.ClientMonitor; Loading @@ -67,7 +68,8 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi @NonNull private final Context mContext; @NonNull private final Context mContext; @NonNull private final String mHalInstanceName; @NonNull private final String mHalInstanceName; @NonNull private final SparseArray<Sensor> mSensors; // Map of sensors that this HAL supports @NonNull @VisibleForTesting final SparseArray<Sensor> mSensors; // Map of sensors that this HAL supports @NonNull private final ClientMonitor.LazyDaemon<IFingerprint> mLazyDaemon; @NonNull private final ClientMonitor.LazyDaemon<IFingerprint> mLazyDaemon; @NonNull private final Handler mHandler; @NonNull private final Handler mHandler; @NonNull private final LockoutResetDispatcher mLockoutResetDispatcher; @NonNull private final LockoutResetDispatcher mLockoutResetDispatcher; Loading Loading @@ -607,8 +609,11 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi mDaemon = null; mDaemon = null; for (int i = 0; i < mSensors.size(); i++) { for (int i = 0; i < mSensors.size(); i++) { final Sensor sensor = mSensors.valueAt(i); final int sensorId = mSensors.keyAt(i); final int sensorId = mSensors.keyAt(i); PerformanceTracker.getInstanceForSensorId(sensorId).incrementHALDeathCount(); PerformanceTracker.getInstanceForSensorId(sensorId).incrementHALDeathCount(); sensor.getScheduler().recordCrashState(); sensor.getScheduler().reset(); } } }); }); } } Loading