summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author TreeHugger Robot <treehugger-gerrit@google.com> 2020-01-17 17:39:18 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2020-01-17 17:39:18 +0000
commit05ed82b446a4545d942b70c290d46cd2d538839b (patch)
tree6ae1543fa37e8e8663180f6db60ad25a3e09e01d
parentbfcda416136f289842038a96e338dd743e9bf48e (diff)
parent6b9798385bbb8e3769750737da79896b72bce369 (diff)
Merge "Expose java puller api as @SystemAPI"
-rwxr-xr-xapi/system-current.txt19
-rw-r--r--core/java/android/app/StatsManager.java77
-rw-r--r--services/core/java/com/android/server/stats/pull/StatsPullAtomService.java85
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)
);
}