Update Biometric Atoms

Framework will add logging in the next CL

Bug: 120161047
Bug: 117060268
Bug: 121072756
Bug: 121071984

Test: Builds

Change-Id: I673d8af8be78be11b5eac249c47847ebeca2cd2e
This commit is contained in:
Kevin Chyn
2019-01-17 11:54:40 -08:00
parent 8bcdea7182
commit 1741a07f4e
5 changed files with 136 additions and 73 deletions

View File

@@ -28,6 +28,7 @@ import "frameworks/base/core/proto/android/bluetooth/enums.proto";
import "frameworks/base/core/proto/android/bluetooth/hci/enums.proto";
import "frameworks/base/core/proto/android/bluetooth/hfp/enums.proto";
import "frameworks/base/core/proto/android/debug/enums.proto";
import "frameworks/base/core/proto/android/hardware/biometrics/enums.proto";
import "frameworks/base/core/proto/android/net/networkcapabilities.proto";
import "frameworks/base/core/proto/android/os/enums.proto";
import "frameworks/base/core/proto/android/server/connectivity/data_stall_event.proto";
@@ -146,9 +147,9 @@ message Atom {
VibratorStateChanged vibrator_state_changed = 84;
DeferredJobStatsReported deferred_job_stats_reported = 85;
ThermalThrottlingStateChanged thermal_throttling = 86;
FingerprintAcquired fingerprint_acquired = 87;
FingerprintAuthenticated fingerprint_authenticated = 88;
FingerprintErrorOccurred fingerprint_error_occurred = 89;
BiometricAcquired biometric_acquired = 87;
BiometricAuthenticated biometric_authenticated = 88;
BiometricErrorOccurred biometric_error_occurred = 89;
Notification notification = 90;
BatteryHealthSnapshot battery_health_snapshot = 91;
SlowIo slow_io = 92;
@@ -210,6 +211,7 @@ message Atom {
SpeechDspStatReported speech_dsp_stat_reported = 145;
UsbContaminantReported usb_contaminant_reported = 146;
WatchdogRollbackOccurred watchdog_rollback_occurred = 147;
BiometricHalDeathReported biometric_hal_death_reported = 148;
}
// Pulled events will start at field 10000.
@@ -246,7 +248,7 @@ message Atom {
CategorySize category_size = 10028;
ProcStats proc_stats = 10029;
BatteryVoltage battery_voltage = 10030;
NumFingerprints num_fingerprints = 10031;
NumBiometricsEnrolled num_fingerprints_enrolled = 10031;
DiskIo disk_io = 10032;
PowerProfile power_profile = 10033;
ProcStatsPkgProc proc_stats_pkg_proc = 10034;
@@ -263,6 +265,7 @@ message Atom {
BatteryCycleCount battery_cycle_count = 10045;
DebugElapsedClock debug_elapsed_clock = 10046;
DebugFailingElapsedClock debug_failing_elapsed_clock = 10047;
NumBiometricsEnrolled num_faces_enrolled = 10048;
}
// DO NOT USE field numbers above 100,000 in AOSP.
@@ -2373,58 +2376,95 @@ message GenericAtom {
}
/**
* Logs when a fingerprint acquire event occurs.
* Logs when a biometric acquire event occurs.
*
* Logged from:
* frameworks/base/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java
* frameworks/base/services/core/java/com/android/server/biometrics
*/
message FingerprintAcquired {
// The associated user. Eg: 0 for owners, 10+ for others.
// Defined in android/os/UserHandle.java
optional int32 user = 1;
// If this acquire is for a crypto fingerprint.
// e.g. Secure purchases, unlock password storage.
optional bool is_crypto = 2;
message BiometricAcquired {
// Biometric modality that was acquired.
optional android.hardware.biometrics.ModalityEnum modality = 1;
// The associated user. Eg: 0 for owners, 10+ for others. Defined in android/os/UserHandle.java.
optional int32 user = 2;
// If this acquire is for a crypto operation. e.g. Secure purchases, unlock password storage.
optional bool is_crypto = 3;
// Action that the device is performing. Acquired messages are only expected for enroll and
// authenticate. Other actions may indicate an error.
optional android.hardware.biometrics.ActionEnum action = 4;
// The client that this acquisition was received for.
optional android.hardware.biometrics.ClientEnum client = 5;
// Acquired constants, e.g. ACQUIRED_GOOD. See constants defined by <Biometric>Manager.
optional int32 acquire_info = 6;
// Vendor-specific acquire info. Valid only if acquire_info == ACQUIRED_VENDOR.
optional int32 acquire_info_vendor = 7;
}
/**
* Logs when a fingerprint authentication event occurs.
* Logs when a biometric authentication event occurs.
*
* Logged from:
* frameworks/base/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java
* frameworks/base/services/core/java/com/android/server/biometrics
*/
message FingerprintAuthenticated {
// The associated user. Eg: 0 for owners, 10+ for others.
// Defined in android/os/UserHandle.java
optional int32 user = 1;
// If this authentication is for a crypto fingerprint.
// e.g. Secure purchases, unlock password storage.
optional bool is_crypto = 2;
// Whether or not this authentication was successful.
optional bool is_authenticated = 3;
}
message BiometricAuthenticated {
// Biometric modality that was used.
optional android.hardware.biometrics.ModalityEnum modality = 1;
// The associated user. Eg: 0 for owners, 10+ for others. Defined in android/os/UserHandle.java
optional int32 user = 2;
// If this authentication is for a crypto operation. e.g. Secure purchases, unlock password
// storage.
optional bool is_crypto = 3;
// The client that this acquisition was received for.
optional android.hardware.biometrics.ClientEnum client = 4;
/**
* Logs when a fingerprint error occurs.
*
* Logged from:
* frameworks/base/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java
*/
message FingerprintErrorOccurred {
// The associated user. Eg: 0 for owners, 10+ for others.
// Defined in android/os/UserHandle.java
optional int32 user = 1;
// If this error is for a crypto fingerprint.
// e.g. Secure purchases, unlock password storage.
optional bool is_crypto = 2;
enum Error {
enum State {
UNKNOWN = 0;
LOCKOUT = 1;
PERMANENT_LOCKOUT = 2;
REJECTED = 1;
PENDING_CONFIRMATION = 2;
CONFIRMED = 3;
}
// The type of error.
optional Error error = 3;
// State of the current auth attempt.
optional State state = 5;
// Time it took to authenticate. For BiometricPrompt where setRequireConfirmation(false) is
// specified and supported by the biometric modality, this is from the first ACQUIRED_GOOD to
// AUTHENTICATED. for setRequireConfirmation(true), this is from PENDING_CONFIRMATION to
// CONFIRMED.
optional int32 latency = 6;
}
/**
* Logs when a biometric error occurs.
*
* Logged from:
* frameworks/base/services/core/java/com/android/server/biometrics
*/
message BiometricErrorOccurred {
// Biometric modality that was used.
optional android.hardware.biometrics.ModalityEnum modality = 1;
// The associated user. Eg: 0 for owners, 10+ for others. Defined in android/os/UserHandle.java
optional int32 user = 2;
// If this error is for a crypto operation. e.g. Secure purchases, unlock password storage.
optional bool is_crypto = 3;
// Action that the device is performing.
optional android.hardware.biometrics.ActionEnum action = 4;
// The client that this acquisition was received for.
optional android.hardware.biometrics.ClientEnum client = 5;
// Error constants. See constants defined by <Biometric>Manager. Enums won't work since errors
// are unique to modality.
optional int32 error_info = 6;
// 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;
}
/**
* Logs when a biometric HAL has crashed.
* Logged from:
* frameworks/base/services/core/java/com/android/server/biometrics
*/
message BiometricHalDeathReported {
// Biometric modality.
optional android.hardware.biometrics.ModalityEnum modality = 1;
}
message Notification {
@@ -3367,14 +3407,14 @@ message DiskIo {
/**
* Pulls the number of fingerprints for each user.
*
* Pulled from StatsCompanionService, which queries FingerprintManager.
* Pulled from StatsCompanionService, which queries <Biometric>Manager.
*/
message NumFingerprints {
message NumBiometricsEnrolled {
// The associated user. Eg: 0 for owners, 10+ for others.
// Defined in android/os/UserHandle.java
optional int32 user = 1;
// Number of fingerprints registered to that user.
optional int32 num_fingerprints = 2;
optional int32 num_enrolled = 2;
}
message AggStats {

View File

@@ -175,8 +175,8 @@ const std::map<int, PullAtomInfo> StatsPullerManager::kAllPullAtomInfo = {
{android::util::CATEGORY_SIZE,
{.puller = new StatsCompanionServicePuller(android::util::CATEGORY_SIZE)}},
// Number of fingerprints registered to each user.
{android::util::NUM_FINGERPRINTS,
{.puller = new StatsCompanionServicePuller(android::util::NUM_FINGERPRINTS)}},
{android::util::NUM_FINGERPRINTS_ENROLLED,
{.puller = new StatsCompanionServicePuller(android::util::NUM_FINGERPRINTS_ENROLLED)}},
// ProcStats.
{android::util::PROC_STATS,
{.puller = new StatsCompanionServicePuller(android::util::PROC_STATS)}},

View File

@@ -0,0 +1,46 @@
/*
* 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.
*/
syntax = "proto2";
package android.hardware.biometrics;
option java_outer_classname = "BiometricsProtoEnums";
option java_multiple_files = true;
// Logging constants for <Biometric>Service and BiometricService
enum ModalityEnum {
MODALITY_UNKNOWN = 0;
MODALITY_FINGERPRINT = 1; // 1 << 0
MODALITY_IRIS = 2; // 1 << 1
MODALITY_FACE = 4; // 1 << 2
}
enum ClientEnum {
CLIENT_UNKNOWN = 0;
CLIENT_KEYGUARD = 1;
CLIENT_BIOMETRIC_PROMPT = 2;
CLIENT_FINGERPRINT_MANAGER = 3; // Deprecated API before BiometricPrompt was introduced
}
enum ActionEnum {
ACTION_UNKNOWN = 0;
ACTION_ENROLL = 1;
ACTION_AUTHENTICATE = 2;
ACTION_ENUMERATE = 3;
ACTION_REMOVE = 4;
}

View File

@@ -48,14 +48,12 @@ import android.os.SELinux;
import android.os.UserHandle;
import android.os.UserManager;
import android.util.Slog;
import android.util.StatsLog;
import android.util.proto.ProtoOutputStream;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.util.DumpUtils;
import com.android.server.SystemServerInitThreadPool;
import com.android.server.biometrics.AuthenticationClient;
import com.android.server.biometrics.BiometricServiceBase;
import com.android.server.biometrics.BiometricUtils;
import com.android.server.biometrics.ClientMonitor;
@@ -588,11 +586,6 @@ public class FingerprintService extends BiometricServiceBase {
public void onAcquired(final long deviceId, final int acquiredInfo, final int vendorCode) {
mHandler.post(() -> {
FingerprintService.super.handleAcquired(deviceId, acquiredInfo, vendorCode);
if (getLockoutMode() == AuthenticationClient.LOCKOUT_NONE
&& getCurrentClient() instanceof AuthenticationClient) {
// Ignore enrollment acquisitions or acquisitions when we are locked out.
StatsLog.write(StatsLog.FINGERPRINT_ACQUIRED, mCurrentUserId, mIsCrypto);
}
});
}
@@ -602,22 +595,6 @@ public class FingerprintService extends BiometricServiceBase {
mHandler.post(() -> {
Fingerprint fp = new Fingerprint("", groupId, fingerId, deviceId);
FingerprintService.super.handleAuthenticated(fp, token);
// Send authentication to statsd.
final boolean authenticated = fingerId != 0;
StatsLog.write(StatsLog.FINGERPRINT_AUTHENTICATED, mCurrentUserId, mIsCrypto,
authenticated);
if (!authenticated) {
// If we failed to authenticate because of a lockout, inform statsd.
final int lockoutMode = getLockoutMode();
if (lockoutMode == AuthenticationClient.LOCKOUT_TIMED) {
StatsLog.write(StatsLog.FINGERPRINT_ERROR_OCCURRED, mCurrentUserId,
mIsCrypto, StatsLog.FINGERPRINT_ERROR_OCCURRED__ERROR__LOCKOUT);
} else if (lockoutMode == AuthenticationClient.LOCKOUT_PERMANENT) {
StatsLog.write(StatsLog.FINGERPRINT_ERROR_OCCURRED, mCurrentUserId,
mIsCrypto,
StatsLog.FINGERPRINT_ERROR_OCCURRED__ERROR__PERMANENT_LOCKOUT);
}
}
});
}

View File

@@ -1897,7 +1897,7 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
pullCategorySize(tagId, elapsedNanos, wallClockNanos, ret);
break;
}
case StatsLog.NUM_FINGERPRINTS: {
case StatsLog.NUM_FINGERPRINTS_ENROLLED: {
pullNumFingerprints(tagId, elapsedNanos, wallClockNanos, ret);
break;
}