Loading services/voiceinteraction/java/com/android/server/voiceinteraction/DetectorSession.java +43 −1 Original line number Diff line number Diff line Loading @@ -52,9 +52,12 @@ import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTOR_KEYPH import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED__RESULT__DETECT_UNEXPECTED_CALLBACK; import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED__RESULT__REJECT_UNEXPECTED_CALLBACK; import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED__RESULT__TRAINING_DATA; import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED__RESULT__TRAINING_DATA_SECURITY_EXCEPTION; import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED__RESULT__TRAINING_DATA_EGRESS_LIMIT_REACHED; import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED__RESULT__TRAINING_DATA_REMOTE_EXCEPTION; import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED__RESULT__TRAINING_DATA_SECURITY_EXCEPTION; import static com.android.internal.util.FrameworkStatsLog.HOTWORD_EVENT_EGRESS_SIZE__EVENT_TYPE__HOTWORD_DETECTION; import static com.android.internal.util.FrameworkStatsLog.HOTWORD_EVENT_EGRESS_SIZE__EVENT_TYPE__HOTWORD_REJECTION; import static com.android.internal.util.FrameworkStatsLog.HOTWORD_EVENT_EGRESS_SIZE__EVENT_TYPE__HOTWORD_TRAINING_DATA; import static com.android.server.voiceinteraction.HotwordDetectionConnection.ENFORCE_HOTWORD_PHRASE_ID; import android.annotation.NonNull; Loading @@ -73,7 +76,9 @@ import android.os.Binder; import android.os.Bundle; import android.os.IBinder; import android.os.IRemoteCallback; import android.os.Parcel; import android.os.ParcelFileDescriptor; import android.os.Parcelable; import android.os.PersistableBundle; import android.os.RemoteException; import android.os.SharedMemory; Loading @@ -94,6 +99,7 @@ import android.util.Slog; import com.android.internal.annotations.GuardedBy; import com.android.internal.app.IHotwordRecognitionStatusCallback; import com.android.internal.infra.AndroidFuture; import com.android.internal.os.BackgroundThread; import com.android.server.LocalServices; import com.android.server.policy.AppOpsPolicy; import com.android.server.voiceinteraction.VoiceInteractionManagerServiceImpl.DetectorRemoteExceptionListener; Loading Loading @@ -180,6 +186,13 @@ abstract class DetectorSession { private static final int METRICS_CALLBACK_ON_STATUS_REPORTED_EXCEPTION = HOTWORD_DETECTOR_EVENTS__EVENT__CALLBACK_ON_STATUS_REPORTED_EXCEPTION; private static final int HOTWORD_EVENT_TYPE_DETECTION = HOTWORD_EVENT_EGRESS_SIZE__EVENT_TYPE__HOTWORD_DETECTION; private static final int HOTWORD_EVENT_TYPE_REJECTION = HOTWORD_EVENT_EGRESS_SIZE__EVENT_TYPE__HOTWORD_REJECTION; private static final int HOTWORD_EVENT_TYPE_TRAINING_DATA = HOTWORD_EVENT_EGRESS_SIZE__EVENT_TYPE__HOTWORD_TRAINING_DATA; private final Executor mAudioCopyExecutor = Executors.newCachedThreadPool(); // TODO: This may need to be a Handler(looper) final ScheduledExecutorService mScheduledExecutorService; Loading Loading @@ -516,6 +529,7 @@ abstract class DetectorSession { if (result != null) { Slog.i(TAG, "Egressed 'hotword rejected result' " + "from hotword trusted process"); logEgressSizeStats(result); if (mDebugHotwordLogging) { Slog.i(TAG, "Egressed detected result: " + result); } Loading Loading @@ -608,6 +622,7 @@ abstract class DetectorSession { Slog.i(TAG, "Egressed " + HotwordDetectedResult.getUsageSize(newResult) + " bits from hotword trusted process"); logEgressSizeStats(newResult); if (mDebugHotwordLogging) { Slog.i(TAG, "Egressed detected result: " + newResult); Loading @@ -624,6 +639,32 @@ abstract class DetectorSession { mVoiceInteractionServiceUid); } void logEgressSizeStats(HotwordTrainingData data) { logEgressSizeStats(data, HOTWORD_EVENT_TYPE_TRAINING_DATA); } void logEgressSizeStats(HotwordDetectedResult data) { logEgressSizeStats(data, HOTWORD_EVENT_TYPE_DETECTION); } void logEgressSizeStats(HotwordRejectedResult data) { logEgressSizeStats(data, HOTWORD_EVENT_TYPE_REJECTION); } /** Logs event size stats for events egressed from trusted hotword detection service. */ private void logEgressSizeStats(Parcelable data, int eventType) { BackgroundThread.getExecutor().execute(() -> { Parcel parcel = Parcel.obtain(); parcel.writeValue(data); int dataSizeBytes = parcel.dataSize(); parcel.recycle(); HotwordMetricsLogger.writeHotwordDataEgressSize(eventType, dataSizeBytes, getDetectorType(), mVoiceInteractionServiceUid); }); } /** Used to send training data. * * @hide Loading Loading @@ -723,6 +764,7 @@ abstract class DetectorSession { mVoiceInteractionServiceUid); throw e; } logEgressSizeStats(data); } void initialize(@Nullable PersistableBundle options, @Nullable SharedMemory sharedMemory) { Loading services/voiceinteraction/java/com/android/server/voiceinteraction/DspTrustedHotwordDetectorSession.java +2 −0 Original line number Diff line number Diff line Loading @@ -186,6 +186,7 @@ final class DspTrustedHotwordDetectorSession extends DetectorSession { if (mDebugHotwordLogging) { Slog.i(TAG, "Egressed detected result: " + newResult); } logEgressSizeStats(newResult); } } Loading Loading @@ -228,6 +229,7 @@ final class DspTrustedHotwordDetectorSession extends DetectorSession { if (mDebugHotwordLogging && result != null) { Slog.i(TAG, "Egressed rejected result: " + result); } logEgressSizeStats(result); } } Loading services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordMetricsLogger.java +24 −0 Original line number Diff line number Diff line Loading @@ -34,6 +34,9 @@ import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTOR_EVENT import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED__DETECTOR_TYPE__NORMAL_DETECTOR; import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED__DETECTOR_TYPE__TRUSTED_DETECTOR_DSP; import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED__DETECTOR_TYPE__TRUSTED_DETECTOR_SOFTWARE; import static com.android.internal.util.FrameworkStatsLog.HOTWORD_EVENT_EGRESS_SIZE__DETECTOR_TYPE__NORMAL_DETECTOR; import static com.android.internal.util.FrameworkStatsLog.HOTWORD_EVENT_EGRESS_SIZE__DETECTOR_TYPE__TRUSTED_DETECTOR_DSP; import static com.android.internal.util.FrameworkStatsLog.HOTWORD_EVENT_EGRESS_SIZE__DETECTOR_TYPE__TRUSTED_DETECTOR_SOFTWARE; import static com.android.internal.util.LatencyTracker.ACTION_SHOW_VOICE_INTERACTION; import android.content.Context; Loading Loading @@ -119,6 +122,16 @@ public final class HotwordMetricsLogger { metricsDetectorType, event, uid, streamSizeBytes, bundleSizeBytes, streamCount); } /** * Logs hotword event egress size metrics. */ public static void writeHotwordDataEgressSize(int eventType, long eventSize, int detectorType, int uid) { int metricsDetectorType = getHotwordEventEgressSizeDetectorType(detectorType); FrameworkStatsLog.write(FrameworkStatsLog.HOTWORD_EGRESS_SIZE_ATOM_REPORTED, eventType, eventSize, metricsDetectorType, uid); } /** * Starts a {@link LatencyTracker} log for the time it takes to show the * {@link android.service.voice.VoiceInteractionSession} system UI after a voice trigger. Loading Loading @@ -224,4 +237,15 @@ public final class HotwordMetricsLogger { return AUDIO_EGRESS_NORMAL_DETECTOR; } } private static int getHotwordEventEgressSizeDetectorType(int detectorType) { switch (detectorType) { case HotwordDetector.DETECTOR_TYPE_TRUSTED_HOTWORD_SOFTWARE: return HOTWORD_EVENT_EGRESS_SIZE__DETECTOR_TYPE__TRUSTED_DETECTOR_SOFTWARE; case HotwordDetector.DETECTOR_TYPE_TRUSTED_HOTWORD_DSP: return HOTWORD_EVENT_EGRESS_SIZE__DETECTOR_TYPE__TRUSTED_DETECTOR_DSP; default: return HOTWORD_EVENT_EGRESS_SIZE__DETECTOR_TYPE__NORMAL_DETECTOR; } } } services/voiceinteraction/java/com/android/server/voiceinteraction/SoftwareTrustedHotwordDetectorSession.java +2 −0 Original line number Diff line number Diff line Loading @@ -179,6 +179,7 @@ final class SoftwareTrustedHotwordDetectorSession extends DetectorSession { } Slog.i(TAG, "Egressed " + HotwordDetectedResult.getUsageSize(newResult) + " bits from hotword trusted process"); logEgressSizeStats(newResult); if (mDebugHotwordLogging) { Slog.i(TAG, "Egressed detected result: " + newResult); } Loading @@ -194,6 +195,7 @@ final class SoftwareTrustedHotwordDetectorSession extends DetectorSession { HotwordDetector.DETECTOR_TYPE_TRUSTED_HOTWORD_SOFTWARE, HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED__RESULT__REJECTED, mVoiceInteractionServiceUid); logEgressSizeStats(result); // onRejected isn't allowed here, and we are not expecting it. } Loading Loading
services/voiceinteraction/java/com/android/server/voiceinteraction/DetectorSession.java +43 −1 Original line number Diff line number Diff line Loading @@ -52,9 +52,12 @@ import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTOR_KEYPH import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED__RESULT__DETECT_UNEXPECTED_CALLBACK; import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED__RESULT__REJECT_UNEXPECTED_CALLBACK; import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED__RESULT__TRAINING_DATA; import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED__RESULT__TRAINING_DATA_SECURITY_EXCEPTION; import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED__RESULT__TRAINING_DATA_EGRESS_LIMIT_REACHED; import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED__RESULT__TRAINING_DATA_REMOTE_EXCEPTION; import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED__RESULT__TRAINING_DATA_SECURITY_EXCEPTION; import static com.android.internal.util.FrameworkStatsLog.HOTWORD_EVENT_EGRESS_SIZE__EVENT_TYPE__HOTWORD_DETECTION; import static com.android.internal.util.FrameworkStatsLog.HOTWORD_EVENT_EGRESS_SIZE__EVENT_TYPE__HOTWORD_REJECTION; import static com.android.internal.util.FrameworkStatsLog.HOTWORD_EVENT_EGRESS_SIZE__EVENT_TYPE__HOTWORD_TRAINING_DATA; import static com.android.server.voiceinteraction.HotwordDetectionConnection.ENFORCE_HOTWORD_PHRASE_ID; import android.annotation.NonNull; Loading @@ -73,7 +76,9 @@ import android.os.Binder; import android.os.Bundle; import android.os.IBinder; import android.os.IRemoteCallback; import android.os.Parcel; import android.os.ParcelFileDescriptor; import android.os.Parcelable; import android.os.PersistableBundle; import android.os.RemoteException; import android.os.SharedMemory; Loading @@ -94,6 +99,7 @@ import android.util.Slog; import com.android.internal.annotations.GuardedBy; import com.android.internal.app.IHotwordRecognitionStatusCallback; import com.android.internal.infra.AndroidFuture; import com.android.internal.os.BackgroundThread; import com.android.server.LocalServices; import com.android.server.policy.AppOpsPolicy; import com.android.server.voiceinteraction.VoiceInteractionManagerServiceImpl.DetectorRemoteExceptionListener; Loading Loading @@ -180,6 +186,13 @@ abstract class DetectorSession { private static final int METRICS_CALLBACK_ON_STATUS_REPORTED_EXCEPTION = HOTWORD_DETECTOR_EVENTS__EVENT__CALLBACK_ON_STATUS_REPORTED_EXCEPTION; private static final int HOTWORD_EVENT_TYPE_DETECTION = HOTWORD_EVENT_EGRESS_SIZE__EVENT_TYPE__HOTWORD_DETECTION; private static final int HOTWORD_EVENT_TYPE_REJECTION = HOTWORD_EVENT_EGRESS_SIZE__EVENT_TYPE__HOTWORD_REJECTION; private static final int HOTWORD_EVENT_TYPE_TRAINING_DATA = HOTWORD_EVENT_EGRESS_SIZE__EVENT_TYPE__HOTWORD_TRAINING_DATA; private final Executor mAudioCopyExecutor = Executors.newCachedThreadPool(); // TODO: This may need to be a Handler(looper) final ScheduledExecutorService mScheduledExecutorService; Loading Loading @@ -516,6 +529,7 @@ abstract class DetectorSession { if (result != null) { Slog.i(TAG, "Egressed 'hotword rejected result' " + "from hotword trusted process"); logEgressSizeStats(result); if (mDebugHotwordLogging) { Slog.i(TAG, "Egressed detected result: " + result); } Loading Loading @@ -608,6 +622,7 @@ abstract class DetectorSession { Slog.i(TAG, "Egressed " + HotwordDetectedResult.getUsageSize(newResult) + " bits from hotword trusted process"); logEgressSizeStats(newResult); if (mDebugHotwordLogging) { Slog.i(TAG, "Egressed detected result: " + newResult); Loading @@ -624,6 +639,32 @@ abstract class DetectorSession { mVoiceInteractionServiceUid); } void logEgressSizeStats(HotwordTrainingData data) { logEgressSizeStats(data, HOTWORD_EVENT_TYPE_TRAINING_DATA); } void logEgressSizeStats(HotwordDetectedResult data) { logEgressSizeStats(data, HOTWORD_EVENT_TYPE_DETECTION); } void logEgressSizeStats(HotwordRejectedResult data) { logEgressSizeStats(data, HOTWORD_EVENT_TYPE_REJECTION); } /** Logs event size stats for events egressed from trusted hotword detection service. */ private void logEgressSizeStats(Parcelable data, int eventType) { BackgroundThread.getExecutor().execute(() -> { Parcel parcel = Parcel.obtain(); parcel.writeValue(data); int dataSizeBytes = parcel.dataSize(); parcel.recycle(); HotwordMetricsLogger.writeHotwordDataEgressSize(eventType, dataSizeBytes, getDetectorType(), mVoiceInteractionServiceUid); }); } /** Used to send training data. * * @hide Loading Loading @@ -723,6 +764,7 @@ abstract class DetectorSession { mVoiceInteractionServiceUid); throw e; } logEgressSizeStats(data); } void initialize(@Nullable PersistableBundle options, @Nullable SharedMemory sharedMemory) { Loading
services/voiceinteraction/java/com/android/server/voiceinteraction/DspTrustedHotwordDetectorSession.java +2 −0 Original line number Diff line number Diff line Loading @@ -186,6 +186,7 @@ final class DspTrustedHotwordDetectorSession extends DetectorSession { if (mDebugHotwordLogging) { Slog.i(TAG, "Egressed detected result: " + newResult); } logEgressSizeStats(newResult); } } Loading Loading @@ -228,6 +229,7 @@ final class DspTrustedHotwordDetectorSession extends DetectorSession { if (mDebugHotwordLogging && result != null) { Slog.i(TAG, "Egressed rejected result: " + result); } logEgressSizeStats(result); } } Loading
services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordMetricsLogger.java +24 −0 Original line number Diff line number Diff line Loading @@ -34,6 +34,9 @@ import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTOR_EVENT import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED__DETECTOR_TYPE__NORMAL_DETECTOR; import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED__DETECTOR_TYPE__TRUSTED_DETECTOR_DSP; import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED__DETECTOR_TYPE__TRUSTED_DETECTOR_SOFTWARE; import static com.android.internal.util.FrameworkStatsLog.HOTWORD_EVENT_EGRESS_SIZE__DETECTOR_TYPE__NORMAL_DETECTOR; import static com.android.internal.util.FrameworkStatsLog.HOTWORD_EVENT_EGRESS_SIZE__DETECTOR_TYPE__TRUSTED_DETECTOR_DSP; import static com.android.internal.util.FrameworkStatsLog.HOTWORD_EVENT_EGRESS_SIZE__DETECTOR_TYPE__TRUSTED_DETECTOR_SOFTWARE; import static com.android.internal.util.LatencyTracker.ACTION_SHOW_VOICE_INTERACTION; import android.content.Context; Loading Loading @@ -119,6 +122,16 @@ public final class HotwordMetricsLogger { metricsDetectorType, event, uid, streamSizeBytes, bundleSizeBytes, streamCount); } /** * Logs hotword event egress size metrics. */ public static void writeHotwordDataEgressSize(int eventType, long eventSize, int detectorType, int uid) { int metricsDetectorType = getHotwordEventEgressSizeDetectorType(detectorType); FrameworkStatsLog.write(FrameworkStatsLog.HOTWORD_EGRESS_SIZE_ATOM_REPORTED, eventType, eventSize, metricsDetectorType, uid); } /** * Starts a {@link LatencyTracker} log for the time it takes to show the * {@link android.service.voice.VoiceInteractionSession} system UI after a voice trigger. Loading Loading @@ -224,4 +237,15 @@ public final class HotwordMetricsLogger { return AUDIO_EGRESS_NORMAL_DETECTOR; } } private static int getHotwordEventEgressSizeDetectorType(int detectorType) { switch (detectorType) { case HotwordDetector.DETECTOR_TYPE_TRUSTED_HOTWORD_SOFTWARE: return HOTWORD_EVENT_EGRESS_SIZE__DETECTOR_TYPE__TRUSTED_DETECTOR_SOFTWARE; case HotwordDetector.DETECTOR_TYPE_TRUSTED_HOTWORD_DSP: return HOTWORD_EVENT_EGRESS_SIZE__DETECTOR_TYPE__TRUSTED_DETECTOR_DSP; default: return HOTWORD_EVENT_EGRESS_SIZE__DETECTOR_TYPE__NORMAL_DETECTOR; } } }
services/voiceinteraction/java/com/android/server/voiceinteraction/SoftwareTrustedHotwordDetectorSession.java +2 −0 Original line number Diff line number Diff line Loading @@ -179,6 +179,7 @@ final class SoftwareTrustedHotwordDetectorSession extends DetectorSession { } Slog.i(TAG, "Egressed " + HotwordDetectedResult.getUsageSize(newResult) + " bits from hotword trusted process"); logEgressSizeStats(newResult); if (mDebugHotwordLogging) { Slog.i(TAG, "Egressed detected result: " + newResult); } Loading @@ -194,6 +195,7 @@ final class SoftwareTrustedHotwordDetectorSession extends DetectorSession { HotwordDetector.DETECTOR_TYPE_TRUSTED_HOTWORD_SOFTWARE, HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED__RESULT__REJECTED, mVoiceInteractionServiceUid); logEgressSizeStats(result); // onRejected isn't allowed here, and we are not expecting it. } Loading