From 1fad0f695d03a27ab830db6959cf2dce26190cf3 Mon Sep 17 00:00:00 2001 From: joshmccloskey Date: Mon, 1 Apr 2019 13:32:53 -0700 Subject: [PATCH 1/2] Adding debug value to Biometric atoms. Bug: 129438832 Test: It builds Change-Id: I86e3a39f0bd1ac0986a350611657a34b512e0aef Merged-In: I86e3a39f0bd1ac0986a350611657a34b512e0aef (cherry picked from commit 7d7cad22899df12d44edfccb0245e972c14c005e) Change-Id: I1a62086556093bea800e0756c757ba47a01b2c13 --- cmds/statsd/src/atoms.proto | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto index 90ba7ce0c812b..a0d416523dbf4 100644 --- a/cmds/statsd/src/atoms.proto +++ b/cmds/statsd/src/atoms.proto @@ -3122,6 +3122,8 @@ message BiometricAcquired { optional int32 acquire_info = 6; // Vendor-specific acquire info. Valid only if acquire_info == ACQUIRED_VENDOR. optional int32 acquire_info_vendor = 7; + // Dictates if this message should trigger additional debugging. + optional bool debug = 8; } /** @@ -3158,6 +3160,8 @@ message BiometricAuthenticated { // AUTHENTICATED. for setRequireConfirmation(true), this is from PENDING_CONFIRMATION to // CONFIRMED. optional int64 latency_millis = 7; + // Dictates if this message should trigger additional debugging. + optional bool debug = 8; } /** @@ -3183,6 +3187,8 @@ message BiometricErrorOccurred { // Vendor-specific error info. Valid only if acquire_info == ACQUIRED_VENDOR. These are defined // by the vendor and not specified by the HIDL interface. optional int32 error_info_vendor = 7; + // Dictates if this message should trigger additional debugging. + optional bool debug = 8; } /** @@ -3195,6 +3201,8 @@ message BiometricSystemHealthIssueDetected { optional android.hardware.biometrics.ModalityEnum modality = 1; // Type of issue detected. optional android.hardware.biometrics.IssueEnum issue = 2; + // Dictates if this message should trigger additional debugging. + optional bool debug = 3; } /** From 4858da4aa6339e539bf5a38d5bd3bafcee8f2371 Mon Sep 17 00:00:00 2001 From: Kevin Chyn Date: Thu, 11 Apr 2019 13:02:56 -0700 Subject: [PATCH 2/2] Populate debug value for biometric atoms Fixes: 130363518 Test: Builds Change-Id: I73e8bbb6d9f310ee025bce271bf9470b47626ecc --- core/java/android/provider/Settings.java | 7 ++++ .../android/provider/SettingsBackupTest.java | 3 +- .../biometrics/AuthenticationClient.java | 4 +-- .../server/biometrics/BiometricService.java | 6 ++-- .../server/biometrics/ClientMonitor.java | 4 +-- .../server/biometrics/LoggableMonitor.java | 19 ++++++---- .../com/android/server/biometrics/Utils.java | 36 +++++++++++++++++++ 7 files changed, 65 insertions(+), 14 deletions(-) create mode 100644 services/core/java/com/android/server/biometrics/Utils.java diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index e3b2d898f9b6f..d7bbfe2d017ff 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -8147,6 +8147,13 @@ public final class Settings { private static final Validator FACE_UNLOCK_ALWAYS_REQUIRE_CONFIRMATION_VALIDATOR = BOOLEAN_VALIDATOR; + /** + * Whether or not debugging is enabled. + * @hide + */ + public static final String BIOMETRIC_DEBUG_ENABLED = + "biometric_debug_enabled"; + /** * Whether the assist gesture should be enabled. * diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java index 655070722c9a0..fafd8333f236d 100644 --- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java +++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java @@ -708,7 +708,8 @@ public class SettingsBackupTest { Settings.Secure.FLASHLIGHT_ENABLED, Settings.Secure.CROSS_PROFILE_CALENDAR_ENABLED, Settings.Secure.LOCATION_ACCESS_CHECK_INTERVAL_MILLIS, - Settings.Secure.LOCATION_ACCESS_CHECK_DELAY_MILLIS); + Settings.Secure.LOCATION_ACCESS_CHECK_DELAY_MILLIS, + Settings.Secure.BIOMETRIC_DEBUG_ENABLED); @Test public void systemSettingsBackedUpOrBlacklisted() { diff --git a/services/core/java/com/android/server/biometrics/AuthenticationClient.java b/services/core/java/com/android/server/biometrics/AuthenticationClient.java index f7278d2601c39..b2c5c053528e4 100644 --- a/services/core/java/com/android/server/biometrics/AuthenticationClient.java +++ b/services/core/java/com/android/server/biometrics/AuthenticationClient.java @@ -120,8 +120,8 @@ public abstract class AuthenticationClient extends ClientMonitor { @Override public boolean onAuthenticated(BiometricAuthenticator.Identifier identifier, boolean authenticated, ArrayList token) { - super.logOnAuthenticated(authenticated, mRequireConfirmation, getTargetUserId(), - isBiometricPrompt()); + super.logOnAuthenticated(getContext(), authenticated, mRequireConfirmation, + getTargetUserId(), isBiometricPrompt()); final BiometricServiceBase.ServiceListener listener = getListener(); diff --git a/services/core/java/com/android/server/biometrics/BiometricService.java b/services/core/java/com/android/server/biometrics/BiometricService.java index 153133a6c6691..4c59e608398c2 100644 --- a/services/core/java/com/android/server/biometrics/BiometricService.java +++ b/services/core/java/com/android/server/biometrics/BiometricService.java @@ -1054,7 +1054,8 @@ public class BiometricService extends SystemService { BiometricsProtoEnums.CLIENT_BIOMETRIC_PROMPT, mCurrentAuthSession.mRequireConfirmation, StatsLog.BIOMETRIC_AUTHENTICATED__STATE__CONFIRMED, - latency); + latency, + Utils.isDebugEnabled(getContext(), mCurrentAuthSession.mUserId)); } else { int error = reason == BiometricPrompt.DISMISSED_REASON_NEGATIVE ? BiometricConstants.BIOMETRIC_ERROR_NEGATIVE_BUTTON @@ -1077,7 +1078,8 @@ public class BiometricService extends SystemService { BiometricsProtoEnums.ACTION_AUTHENTICATE, BiometricsProtoEnums.CLIENT_BIOMETRIC_PROMPT, error, - 0 /* vendorCode */); + 0 /* vendorCode */, + Utils.isDebugEnabled(getContext(), mCurrentAuthSession.mUserId)); } } diff --git a/services/core/java/com/android/server/biometrics/ClientMonitor.java b/services/core/java/com/android/server/biometrics/ClientMonitor.java index 87b9eaaa9cbbe..006558080ef00 100644 --- a/services/core/java/com/android/server/biometrics/ClientMonitor.java +++ b/services/core/java/com/android/server/biometrics/ClientMonitor.java @@ -157,7 +157,7 @@ public abstract class ClientMonitor extends LoggableMonitor implements IBinder.D * @return true if client should be removed */ public boolean onAcquired(int acquiredInfo, int vendorCode) { - super.logOnAcquired(acquiredInfo, vendorCode, getTargetUserId()); + super.logOnAcquired(mContext, acquiredInfo, vendorCode, getTargetUserId()); if (DEBUG) Slog.v(getLogTag(), "Acquired: " + acquiredInfo + " " + vendorCode); try { if (mListener != null) { @@ -182,7 +182,7 @@ public abstract class ClientMonitor extends LoggableMonitor implements IBinder.D * @return true if client should be removed */ public boolean onError(long deviceId, int error, int vendorCode) { - super.logOnError(error, vendorCode, getTargetUserId()); + super.logOnError(mContext, error, vendorCode, getTargetUserId()); try { if (mListener != null) { mListener.onError(deviceId, error, vendorCode, getCookie()); diff --git a/services/core/java/com/android/server/biometrics/LoggableMonitor.java b/services/core/java/com/android/server/biometrics/LoggableMonitor.java index b0577cd79ac45..9c040884772c1 100644 --- a/services/core/java/com/android/server/biometrics/LoggableMonitor.java +++ b/services/core/java/com/android/server/biometrics/LoggableMonitor.java @@ -16,6 +16,7 @@ package com.android.server.biometrics; +import android.content.Context; import android.hardware.biometrics.BiometricConstants; import android.hardware.biometrics.BiometricsProtoEnums; import android.hardware.face.FaceManager; @@ -61,7 +62,8 @@ public abstract class LoggableMonitor { return BiometricsProtoEnums.CLIENT_UNKNOWN; } - protected final void logOnAcquired(int acquiredInfo, int vendorCode, int targetUserId) { + protected final void logOnAcquired(Context context, int acquiredInfo, int vendorCode, + int targetUserId) { if (statsModality() == BiometricsProtoEnums.MODALITY_FACE) { if (acquiredInfo == FaceManager.FACE_ACQUIRED_START) { mFirstAcquireTimeMs = System.currentTimeMillis(); @@ -87,10 +89,11 @@ public abstract class LoggableMonitor { statsAction(), statsClient(), acquiredInfo, - 0 /* vendorCode */); // Don't log vendorCode for now + 0 /* vendorCode */, // Don't log vendorCode for now + Utils.isDebugEnabled(context, targetUserId)); } - protected final void logOnError(int error, int vendorCode, int targetUserId) { + protected final void logOnError(Context context, int error, int vendorCode, int targetUserId) { if (DEBUG) { Slog.v(TAG, "Error! Modality: " + statsModality() + ", User: " + targetUserId @@ -107,11 +110,12 @@ public abstract class LoggableMonitor { statsAction(), statsClient(), error, - vendorCode); + vendorCode, + Utils.isDebugEnabled(context, targetUserId)); } - protected final void logOnAuthenticated(boolean authenticated, boolean requireConfirmation, - int targetUserId, boolean isBiometricPrompt) { + protected final void logOnAuthenticated(Context context, boolean authenticated, + boolean requireConfirmation, int targetUserId, boolean isBiometricPrompt) { int authState = StatsLog.BIOMETRIC_AUTHENTICATED__STATE__UNKNOWN; if (!authenticated) { authState = StatsLog.BIOMETRIC_AUTHENTICATED__STATE__REJECTED; @@ -148,7 +152,8 @@ public abstract class LoggableMonitor { statsClient(), requireConfirmation, authState, - latency); + latency, + Utils.isDebugEnabled(context, targetUserId)); } protected final void logOnEnrolled(int targetUserId, long latency, boolean enrollSuccessful) { diff --git a/services/core/java/com/android/server/biometrics/Utils.java b/services/core/java/com/android/server/biometrics/Utils.java new file mode 100644 index 0000000000000..5544bede92f22 --- /dev/null +++ b/services/core/java/com/android/server/biometrics/Utils.java @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.biometrics; + +import android.content.Context; +import android.os.Build; +import android.provider.Settings; + +public class Utils { + public static boolean isDebugEnabled(Context context, int targetUserId) { + if (!(Build.IS_ENG || Build.IS_USERDEBUG)) { + return false; + } + + if (Settings.Secure.getIntForUser(context.getContentResolver(), + Settings.Secure.BIOMETRIC_DEBUG_ENABLED, 0, + targetUserId) == 0) { + return false; + } + return true; + } +}