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

Commit fe9cb8ee authored by Ajay Gopi's avatar Ajay Gopi Committed by Android (Google) Code Review
Browse files

Merge "Log size of events egressed from trusted hotword detection service." into main

parents 0b1a5ee3 975f038f
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.
            }