Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 975f038f authored by Ajay Gopi's avatar Ajay Gopi
Browse files

Log size of events egressed from trusted hotword detection service.

Test: presubmit
Bug: 291599840
Change-Id: Ib4b64d655a9537c27ecb60ba5dcfbce7724be8b4
parent 3064d280
Loading
Loading
Loading
Loading
+43 −1
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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);
                                            }
@@ -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);
@@ -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
@@ -723,6 +764,7 @@ abstract class DetectorSession {
                    mVoiceInteractionServiceUid);
            throw e;
        }
        logEgressSizeStats(data);
    }

    void initialize(@Nullable PersistableBundle options, @Nullable SharedMemory sharedMemory) {
+2 −0
Original line number Diff line number Diff line
@@ -186,6 +186,7 @@ final class DspTrustedHotwordDetectorSession extends DetectorSession {
                    if (mDebugHotwordLogging) {
                        Slog.i(TAG, "Egressed detected result: " + newResult);
                    }
                    logEgressSizeStats(newResult);
                }
            }

@@ -228,6 +229,7 @@ final class DspTrustedHotwordDetectorSession extends DetectorSession {
                    if (mDebugHotwordLogging && result != null) {
                        Slog.i(TAG, "Egressed rejected result: " + result);
                    }
                    logEgressSizeStats(result);
                }
            }

+24 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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.
@@ -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;
        }
    }
}
+2 −0
Original line number Diff line number Diff line
@@ -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);
                    }
@@ -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.
            }