Merge "Expose java puller api as @SystemAPI"

This commit is contained in:
TreeHugger Robot
2020-01-17 17:39:18 +00:00
committed by Android (Google) Code Review
3 changed files with 109 additions and 72 deletions

View File

@@ -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 {

View File

@@ -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,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 {

View File

@@ -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)
);
}