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

Commit 6b979838 authored by Tej Singh's avatar Tej Singh
Browse files

Expose java puller api as @SystemAPI

Also clear calling identity before invoking the pull.

Test: make
Test: atest GtsStatsdHostTestCases
Bug: 146383532
Change-Id: I9a17d88944da0074dbbaffb0c1b99a9ce7743991
parent 8468378f
Loading
Loading
Loading
Loading
+19 −0
Original line number Diff line number Diff line
@@ -661,6 +661,7 @@ package android.app {
    method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public long[] getRegisteredExperimentIds() throws android.app.StatsManager.StatsUnavailableException;
    method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public byte[] getReports(long) throws android.app.StatsManager.StatsUnavailableException;
    method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public byte[] getStatsMetadata() throws android.app.StatsManager.StatsUnavailableException;
    method public void registerPullAtomCallback(int, @Nullable android.app.StatsManager.PullAtomMetadata, @NonNull java.util.concurrent.Executor, @NonNull android.app.StatsManager.StatsPullAtomCallback);
    method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void removeConfig(long) throws android.app.StatsManager.StatsUnavailableException;
    method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public boolean removeConfiguration(long);
    method @NonNull @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public long[] setActiveConfigsChangedOperation(@Nullable android.app.PendingIntent) throws android.app.StatsManager.StatsUnavailableException;
@@ -668,6 +669,7 @@ package android.app {
    method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public boolean setBroadcastSubscriber(long, long, android.app.PendingIntent);
    method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public boolean setDataFetchOperation(long, android.app.PendingIntent);
    method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void setFetchReportsOperation(android.app.PendingIntent, long) throws android.app.StatsManager.StatsUnavailableException;
    method public void unregisterPullAtomCallback(int);
    field public static final String ACTION_STATSD_STARTED = "android.app.action.STATSD_STARTED";
    field public static final String EXTRA_STATS_ACTIVE_CONFIG_KEYS = "android.app.extra.STATS_ACTIVE_CONFIG_KEYS";
    field public static final String EXTRA_STATS_BROADCAST_SUBSCRIBER_COOKIES = "android.app.extra.STATS_BROADCAST_SUBSCRIBER_COOKIES";
@@ -676,6 +678,23 @@ package android.app {
    field public static final String EXTRA_STATS_DIMENSIONS_VALUE = "android.app.extra.STATS_DIMENSIONS_VALUE";
    field public static final String EXTRA_STATS_SUBSCRIPTION_ID = "android.app.extra.STATS_SUBSCRIPTION_ID";
    field public static final String EXTRA_STATS_SUBSCRIPTION_RULE_ID = "android.app.extra.STATS_SUBSCRIPTION_RULE_ID";
    field public static final int PULL_SKIP = 1; // 0x1
    field public static final int PULL_SUCCESS = 0; // 0x0
  }
  public static class StatsManager.PullAtomMetadata {
  }
  public static class StatsManager.PullAtomMetadata.Builder {
    ctor public StatsManager.PullAtomMetadata.Builder();
    method @NonNull public android.app.StatsManager.PullAtomMetadata build();
    method @NonNull public android.app.StatsManager.PullAtomMetadata.Builder setAdditiveFields(@NonNull int[]);
    method @NonNull public android.app.StatsManager.PullAtomMetadata.Builder setCoolDownNs(long);
    method @NonNull public android.app.StatsManager.PullAtomMetadata.Builder setTimeoutNs(long);
  }
  public static interface StatsManager.StatsPullAtomCallback {
    method public int onPullAtom(int, @NonNull java.util.List<android.util.StatsEvent>);
  }
  public static class StatsManager.StatsUnavailableException extends android.util.AndroidException {
+48 −29
Original line number Diff line number Diff line
@@ -18,11 +18,13 @@ package android.app;
import static android.Manifest.permission.DUMP;
import static android.Manifest.permission.PACKAGE_USAGE_STATS;

import android.annotation.CallbackExecutor;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
import android.content.Context;
import android.os.Binder;
import android.os.IBinder;
import android.os.IPullAtomCallback;
import android.os.IPullAtomResultReceiver;
@@ -108,13 +110,11 @@ public final class StatsManager {
    /**
     * Value indicating that this pull was successful and that the result should be used.
     *
     * @hide
     **/
    public static final int PULL_SUCCESS = 0;

    /**
     * Value indicating that this pull was unsuccessful and that the result should not be used.
     * @hide
     **/
    public static final int PULL_SKIP = 1;

@@ -511,6 +511,17 @@ public final class StatsManager {
    }


    /**
     * Temp registration for while the migration is in progress.
     *
     * @hide
     */
    public void registerPullAtomCallback(int atomTag, @Nullable PullAtomMetadata metadata,
            @NonNull StatsPullAtomCallback callback,
            @NonNull @CallbackExecutor Executor executor) {
        registerPullAtomCallback(atomTag, metadata, executor, callback);
    }

    /**
     * Registers a callback for an atom when that atom is to be pulled. The stats service will
     * invoke pullData in the callback when the stats service determines that this atom needs to be
@@ -520,18 +531,19 @@ public final class StatsManager {
     * @param metadata          Optional metadata specifying the timeout, cool down time, and
     *                          additive fields for mapping isolated to host uids.
     * @param callback          The callback to be invoked when the stats service pulls the atom.
     * @param executor          The executor in which to run the callback
     * @param executor          The executor in which to run the callback.
     *
     * @hide
     */
    public void registerPullAtomCallback(int atomTag, @Nullable PullAtomMetadata metadata,
            @NonNull StatsPullAtomCallback callback, @NonNull Executor executor) {
            @NonNull @CallbackExecutor Executor executor,
            @NonNull StatsPullAtomCallback callback) {
        long coolDownNs = metadata == null ? DEFAULT_COOL_DOWN_NS : metadata.mCoolDownNs;
        long timeoutNs = metadata == null ? DEFAULT_TIMEOUT_NS : metadata.mTimeoutNs;
        int[] additiveFields = metadata == null ? new int[0] : metadata.mAdditiveFields;
        if (additiveFields == null) {
            additiveFields = new int[0];
        }

        synchronized (sLock) {
            try {
                IStatsManagerService service = getIStatsManagerServiceLocked();
@@ -551,7 +563,6 @@ public final class StatsManager {
     *
     * @param atomTag           The tag of the atom of which to unregister
     *
     * @hide
     */
    public void unregisterPullAtomCallback(int atomTag) {
        synchronized (sLock) {
@@ -577,6 +588,8 @@ public final class StatsManager {

        @Override
        public void onPullAtom(int atomTag, IPullAtomResultReceiver resultReceiver) {
            long token = Binder.clearCallingIdentity();
            try {
                mExecutor.execute(() -> {
                    List<StatsEvent> data = new ArrayList<>();
                    int successInt = mCallback.onPullAtom(atomTag, data);
@@ -592,6 +605,9 @@ public final class StatsManager {
                        Slog.w(TAG, "StatsPullResultReceiver failed for tag " + mAtomId);
                    }
                });
            } finally {
                Binder.restoreCallingIdentity(token);
            }
        }
    }

@@ -599,7 +615,6 @@ public final class StatsManager {
     * Metadata required for registering a StatsPullAtomCallback.
     * All fields are optional, and defaults will be used for fields that are unspecified.
     *
     * @hide
     */
    public static class PullAtomMetadata {
        private final long mCoolDownNs;
@@ -614,8 +629,9 @@ public final class StatsManager {
        }

        /**
         * Returns a new PullAtomMetadata.Builder object for constructing PullAtomMetadata for
         * StatsManager#registerPullAtomCallback
         * Temp for while migrations are in progress.
         *
         * @hide
         */
        public static PullAtomMetadata.Builder newBuilder() {
            return new PullAtomMetadata.Builder();
@@ -629,7 +645,11 @@ public final class StatsManager {
            private long mTimeoutNs;
            private int[] mAdditiveFields;

            private Builder() {
            /**
             * Returns a new PullAtomMetadata.Builder object for constructing PullAtomMetadata for
             * StatsManager#registerPullAtomCallback
             */
            public Builder() {
                mCoolDownNs = DEFAULT_COOL_DOWN_NS;
                mTimeoutNs = DEFAULT_TIMEOUT_NS;
                mAdditiveFields = null;
@@ -662,7 +682,7 @@ public final class StatsManager {
             * will be combined when the non-additive fields are the same.
             */
            @NonNull
            public Builder setAdditiveFields(int[] additiveFields) {
            public Builder setAdditiveFields(@NonNull int[] additiveFields) {
                mAdditiveFields = additiveFields;
                return this;
            }
@@ -705,14 +725,13 @@ public final class StatsManager {
    /**
     * Callback interface for pulling atoms requested by the stats service.
     *
     * @hide
     */
    public interface StatsPullAtomCallback {
        /**
         * Pull data for the specified atom tag, filling in the provided list of StatsEvent data.
         * @return {@link #PULL_SUCCESS} if the pull was successful, or {@link #PULL_SKIP} if not.
         */
        int onPullAtom(int atomTag, List<StatsEvent> data);
        int onPullAtom(int atomTag, @NonNull List<StatsEvent> data);
    }

    private class StatsdDeathRecipient implements IBinder.DeathRecipient {
+42 −43
Original line number Diff line number Diff line
@@ -173,7 +173,6 @@ import java.util.Set;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
@@ -349,14 +348,14 @@ public class StatsPullAtomService extends SystemService {
    }
    private void registerWifiBytesTransfer() {
        int tagId = StatsLog.WIFI_BYTES_TRANSFER;
        PullAtomMetadata metadata = PullAtomMetadata.newBuilder()
        PullAtomMetadata metadata = new PullAtomMetadata.Builder()
                .setAdditiveFields(new int[] {2, 3, 4, 5})
                .build();
        mStatsManager.registerPullAtomCallback(
                tagId,
                metadata,
                (atomTag, data) -> pullWifiBytesTransfer(atomTag, data),
                Executors.newSingleThreadExecutor()
                BackgroundThread.getExecutor(),
                (atomTag, data) -> pullWifiBytesTransfer(atomTag, data)
        );
    }

@@ -441,14 +440,14 @@ public class StatsPullAtomService extends SystemService {

    private void registerWifiBytesTransferBackground() {
        int tagId = StatsLog.WIFI_BYTES_TRANSFER_BY_FG_BG;
        PullAtomMetadata metadata = PullAtomMetadata.newBuilder()
        PullAtomMetadata metadata = new PullAtomMetadata.Builder()
                .setAdditiveFields(new int[] {3, 4, 5, 6})
                .build();
        mStatsManager.registerPullAtomCallback(
                tagId,
                metadata,
                (atomTag, data) -> pullWifiBytesTransferBackground(atomTag, data),
                Executors.newSingleThreadExecutor()
                BackgroundThread.getExecutor(),
                (atomTag, data) -> pullWifiBytesTransferBackground(atomTag, data)
        );
    }

@@ -479,14 +478,14 @@ public class StatsPullAtomService extends SystemService {

    private void registerMobileBytesTransfer() {
        int tagId = StatsLog.MOBILE_BYTES_TRANSFER;
        PullAtomMetadata metadata = PullAtomMetadata.newBuilder()
        PullAtomMetadata metadata = new PullAtomMetadata.Builder()
                .setAdditiveFields(new int[] {2, 3, 4, 5})
                .build();
        mStatsManager.registerPullAtomCallback(
                tagId,
                metadata,
                (atomTag, data) -> pullMobileBytesTransfer(atomTag, data),
                Executors.newSingleThreadExecutor()
                BackgroundThread.getExecutor(),
                (atomTag, data) -> pullMobileBytesTransfer(atomTag, data)
        );
    }

@@ -517,14 +516,14 @@ public class StatsPullAtomService extends SystemService {

    private void registerMobileBytesTransferBackground() {
        int tagId = StatsLog.MOBILE_BYTES_TRANSFER_BY_FG_BG;
        PullAtomMetadata metadata = PullAtomMetadata.newBuilder()
        PullAtomMetadata metadata = new PullAtomMetadata.Builder()
                .setAdditiveFields(new int[] {3, 4, 5, 6})
                .build();
        mStatsManager.registerPullAtomCallback(
                tagId,
                metadata,
                (atomTag, data) -> pullMobileBytesTransferBackground(atomTag, data),
                Executors.newSingleThreadExecutor()
                BackgroundThread.getExecutor(),
                (atomTag, data) -> pullMobileBytesTransferBackground(atomTag, data)
        );
    }

@@ -555,14 +554,14 @@ public class StatsPullAtomService extends SystemService {

    private void registerBluetoothBytesTransfer() {
        int tagId = StatsLog.BLUETOOTH_BYTES_TRANSFER;
        PullAtomMetadata metadata = PullAtomMetadata.newBuilder()
        PullAtomMetadata metadata = new PullAtomMetadata.Builder()
                .setAdditiveFields(new int[] {2, 3})
                .build();
        mStatsManager.registerPullAtomCallback(
                tagId,
                metadata,
                (atomTag, data) -> pullBluetoothBytesTransfer(atomTag, data),
                Executors.newSingleThreadExecutor()
                BackgroundThread.getExecutor(),
                (atomTag, data) -> pullBluetoothBytesTransfer(atomTag, data)
        );
    }

@@ -634,8 +633,8 @@ public class StatsPullAtomService extends SystemService {
        mStatsManager.registerPullAtomCallback(
                tagId,
                /* PullAtomMetadata */ null,
                (atomTag, data) -> pullKernelWakelock(atomTag, data),
                Executors.newSingleThreadExecutor()
                BackgroundThread.getExecutor(),
                (atomTag, data) -> pullKernelWakelock(atomTag, data)
        );
    }

@@ -670,14 +669,14 @@ public class StatsPullAtomService extends SystemService {

    private void registerCpuTimePerFreq() {
        int tagId = StatsLog.CPU_TIME_PER_FREQ;
        PullAtomMetadata metadata = PullAtomMetadata.newBuilder()
        PullAtomMetadata metadata = new PullAtomMetadata.Builder()
                .setAdditiveFields(new int[] {3})
                .build();
        mStatsManager.registerPullAtomCallback(
                tagId,
                metadata,
                (atomTag, data) -> pullCpuTimePerFreq(atomTag, data),
                Executors.newSingleThreadExecutor()
                BackgroundThread.getExecutor(),
                (atomTag, data) -> pullCpuTimePerFreq(atomTag, data)
        );
    }

@@ -701,14 +700,14 @@ public class StatsPullAtomService extends SystemService {

    private void registerCpuTimePerUid() {
        int tagId = StatsLog.CPU_TIME_PER_UID;
        PullAtomMetadata metadata = PullAtomMetadata.newBuilder()
        PullAtomMetadata metadata = new PullAtomMetadata.Builder()
                .setAdditiveFields(new int[] {2, 3})
                .build();
        mStatsManager.registerPullAtomCallback(
                tagId,
                metadata,
                (atomTag, data) -> pullCpuTimePerUid(atomTag, data),
                Executors.newSingleThreadExecutor()
                BackgroundThread.getExecutor(),
                (atomTag, data) -> pullCpuTimePerUid(atomTag, data)
        );
    }

@@ -730,14 +729,14 @@ public class StatsPullAtomService extends SystemService {
        // the throttling is 3sec, handled in
        // frameworks/base/core/java/com/android/internal/os/KernelCpuProcReader
        int tagId = StatsLog.CPU_TIME_PER_UID_FREQ;
        PullAtomMetadata metadata = PullAtomMetadata.newBuilder()
        PullAtomMetadata metadata = new PullAtomMetadata.Builder()
                .setAdditiveFields(new int[] {4})
                .build();
        mStatsManager.registerPullAtomCallback(
                tagId,
                metadata,
                (atomTag, data) -> pullCpuTimeperUidFreq(atomTag, data),
                Executors.newSingleThreadExecutor()
                BackgroundThread.getExecutor(),
                (atomTag, data) -> pullCpuTimeperUidFreq(atomTag, data)
        );
    }

@@ -762,14 +761,14 @@ public class StatsPullAtomService extends SystemService {
        // the throttling is 3sec, handled in
        // frameworks/base/core/java/com/android/internal/os/KernelCpuProcReader
        int tagId = StatsLog.CPU_ACTIVE_TIME;
        PullAtomMetadata metadata = PullAtomMetadata.newBuilder()
        PullAtomMetadata metadata = new PullAtomMetadata.Builder()
                .setAdditiveFields(new int[] {2})
                .build();
        mStatsManager.registerPullAtomCallback(
                tagId,
                metadata,
                (atomTag, data) -> pullCpuActiveTime(atomTag, data),
                Executors.newSingleThreadExecutor()
                BackgroundThread.getExecutor(),
                (atomTag, data) -> pullCpuActiveTime(atomTag, data)
        );
    }

@@ -789,14 +788,14 @@ public class StatsPullAtomService extends SystemService {
        // the throttling is 3sec, handled in
        // frameworks/base/core/java/com/android/internal/os/KernelCpuProcReader
        int tagId = StatsLog.CPU_CLUSTER_TIME;
        PullAtomMetadata metadata = PullAtomMetadata.newBuilder()
        PullAtomMetadata metadata = new PullAtomMetadata.Builder()
                .setAdditiveFields(new int[] {3})
                .build();
        mStatsManager.registerPullAtomCallback(
                tagId,
                metadata,
                (atomTag, data) -> pullCpuClusterTime(atomTag, data),
                Executors.newSingleThreadExecutor()
                BackgroundThread.getExecutor(),
                (atomTag, data) -> pullCpuClusterTime(atomTag, data)
        );
    }

@@ -913,8 +912,8 @@ public class StatsPullAtomService extends SystemService {
        mStatsManager.registerPullAtomCallback(
                tagId,
                /* metadata */ null,
                (atomTag, data) -> pullBluetoothActivityInfo(atomTag, data),
                Executors.newSingleThreadExecutor()
                BackgroundThread.getExecutor(),
                (atomTag, data) -> pullBluetoothActivityInfo(atomTag, data)
        );
    }

@@ -949,8 +948,8 @@ public class StatsPullAtomService extends SystemService {
        mStatsManager.registerPullAtomCallback(
                tagId,
                null, // use default PullAtomMetadata values
                (atomTag, data) -> pullSystemUptime(atomTag, data),
                Executors.newSingleThreadExecutor()
                BackgroundThread.getExecutor(),
                (atomTag, data) -> pullSystemUptime(atomTag, data)
        );
    }

@@ -1232,8 +1231,8 @@ public class StatsPullAtomService extends SystemService {
        mStatsManager.registerPullAtomCallback(
                tagId,
                /* PullAtomMetadata */ null,
                (atomTag, data) -> pullIonHeapSize(atomTag, data),
                Executors.newSingleThreadExecutor()
                BackgroundThread.getExecutor(),
                (atomTag, data) -> pullIonHeapSize(atomTag, data)
        );
    }

@@ -1511,8 +1510,8 @@ public class StatsPullAtomService extends SystemService {
        mStatsManager.registerPullAtomCallback(
                tagId,
                /* PullAtomMetadata */ null,
                (atomTag, data) -> pullPowerProfile(atomTag, data),
                Executors.newSingleThreadExecutor()
                BackgroundThread.getExecutor(),
                (atomTag, data) -> pullPowerProfile(atomTag, data)
        );
    }

@@ -1681,8 +1680,8 @@ public class StatsPullAtomService extends SystemService {
        mStatsManager.registerPullAtomCallback(
                tagId,
                null, // use default PullAtomMetadata values
                (atomTag, data) -> pullBuildInformation(atomTag, data),
                BackgroundThread.getExecutor()
                BackgroundThread.getExecutor(),
                (atomTag, data) -> pullBuildInformation(atomTag, data)
        );
    }