diff options
| author | 2020-01-17 17:39:18 +0000 | |
|---|---|---|
| committer | 2020-01-17 17:39:18 +0000 | |
| commit | 05ed82b446a4545d942b70c290d46cd2d538839b (patch) | |
| tree | 6ae1543fa37e8e8663180f6db60ad25a3e09e01d | |
| parent | bfcda416136f289842038a96e338dd743e9bf48e (diff) | |
| parent | 6b9798385bbb8e3769750737da79896b72bce369 (diff) | |
Merge "Expose java puller api as @SystemAPI"
| -rwxr-xr-x | api/system-current.txt | 19 | ||||
| -rw-r--r-- | core/java/android/app/StatsManager.java | 77 | ||||
| -rw-r--r-- | services/core/java/com/android/server/stats/pull/StatsPullAtomService.java | 85 |
3 files changed, 109 insertions, 72 deletions
diff --git a/api/system-current.txt b/api/system-current.txt index b8fbc9dfda88..799002c7ffde 100755 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -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 { diff --git a/core/java/android/app/StatsManager.java b/core/java/android/app/StatsManager.java index dde6dda8e448..0beceb0a1f08 100644 --- a/core/java/android/app/StatsManager.java +++ b/core/java/android/app/StatsManager.java @@ -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; @@ -512,6 +512,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 * pulled. @@ -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,21 +588,26 @@ public final class StatsManager { @Override public void onPullAtom(int atomTag, IPullAtomResultReceiver resultReceiver) { - mExecutor.execute(() -> { - List<StatsEvent> data = new ArrayList<>(); - int successInt = mCallback.onPullAtom(atomTag, data); - boolean success = successInt == PULL_SUCCESS; - StatsEventParcel[] parcels = new StatsEventParcel[data.size()]; - for (int i = 0; i < data.size(); i++) { - parcels[i] = new StatsEventParcel(); - parcels[i].buffer = data.get(i).getBytes(); - } - try { - resultReceiver.pullFinished(atomTag, success, parcels); - } catch (RemoteException e) { - Slog.w(TAG, "StatsPullResultReceiver failed for tag " + mAtomId); - } - }); + long token = Binder.clearCallingIdentity(); + try { + mExecutor.execute(() -> { + List<StatsEvent> data = new ArrayList<>(); + int successInt = mCallback.onPullAtom(atomTag, data); + boolean success = successInt == PULL_SUCCESS; + StatsEventParcel[] parcels = new StatsEventParcel[data.size()]; + for (int i = 0; i < data.size(); i++) { + parcels[i] = new StatsEventParcel(); + parcels[i].buffer = data.get(i).getBytes(); + } + try { + resultReceiver.pullFinished(atomTag, success, parcels); + } catch (RemoteException e) { + 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,22 +629,27 @@ 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(); } /** - * Builder for PullAtomMetadata. + * Builder for PullAtomMetadata. */ public static class Builder { private long mCoolDownNs; 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 { diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java index 3bc860adff0c..1e856884eeed 100644 --- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java +++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java @@ -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) ); } |