Merge "Wrap StatsDimensionsValue over structured parcel" into rvc-dev
diff --git a/apex/framework/test/TEST_MAPPING b/apex/TEST_MAPPING
similarity index 60%
rename from apex/framework/test/TEST_MAPPING
rename to apex/TEST_MAPPING
index f387958..93f1087 100644
--- a/apex/framework/test/TEST_MAPPING
+++ b/apex/TEST_MAPPING
@@ -2,6 +2,9 @@
"presubmit" : [
{
"name" : "FrameworkStatsdTest"
+ },
+ {
+ "name" : "LibStatsPullTests"
}
]
}
diff --git a/apex/aidl/android/os/IStatsd.aidl b/apex/aidl/android/os/IStatsd.aidl
index c8aec53..d5b5949 100644
--- a/apex/aidl/android/os/IStatsd.aidl
+++ b/apex/aidl/android/os/IStatsd.aidl
@@ -190,11 +190,13 @@
long timeoutMillis,in int[] additiveFields,
IPullAtomCallback pullerCallback);
- /**
- * Registers a puller callback function that, when invoked, pulls the data
- * for the specified atom tag.
- */
- oneway void registerNativePullAtomCallback(int atomTag, long coolDownNs, long timeoutNs,
+ /**
+ * Registers a puller callback function that, when invoked, pulls the data
+ * for the specified atom tag.
+ *
+ * Enforces the REGISTER_STATS_PULL_ATOM permission.
+ */
+ oneway void registerNativePullAtomCallback(int atomTag, long coolDownMillis, long timeoutMillis,
in int[] additiveFields, IPullAtomCallback pullerCallback);
/**
@@ -203,7 +205,9 @@
oneway void unregisterPullAtomCallback(int uid, int atomTag);
/**
- * Unregisters any pullAtomCallback for the given atom.
+ * Unregisters any pullAtomCallback for the given atom + caller.
+ *
+ * Enforces the REGISTER_STATS_PULL_ATOM permission.
*/
oneway void unregisterNativePullAtomCallback(int atomTag);
diff --git a/apex/framework/api/current.txt b/apex/framework/api/current.txt
new file mode 100644
index 0000000..d802177
--- /dev/null
+++ b/apex/framework/api/current.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/apex/framework/api/module-lib-current.txt b/apex/framework/api/module-lib-current.txt
new file mode 100644
index 0000000..8b6e217
--- /dev/null
+++ b/apex/framework/api/module-lib-current.txt
@@ -0,0 +1,10 @@
+// Signature format: 2.0
+package android.os {
+
+ public class StatsFrameworkInitializer {
+ method public static void registerServiceWrappers();
+ method public static void setStatsServiceManager(@NonNull android.os.StatsServiceManager);
+ }
+
+}
+
diff --git a/apex/framework/api/module-lib-removed.txt b/apex/framework/api/module-lib-removed.txt
new file mode 100644
index 0000000..d802177
--- /dev/null
+++ b/apex/framework/api/module-lib-removed.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/apex/framework/api/removed.txt b/apex/framework/api/removed.txt
new file mode 100644
index 0000000..d802177
--- /dev/null
+++ b/apex/framework/api/removed.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/apex/framework/api/system-current.txt b/apex/framework/api/system-current.txt
new file mode 100644
index 0000000..3ea5724
--- /dev/null
+++ b/apex/framework/api/system-current.txt
@@ -0,0 +1,111 @@
+// Signature format: 2.0
+package android.app {
+
+ public final class StatsManager {
+ method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void addConfig(long, byte[]) throws android.app.StatsManager.StatsUnavailableException;
+ method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public boolean addConfiguration(long, byte[]);
+ method @RequiresPermission(android.Manifest.permission.REGISTER_STATS_PULL_ATOM) public void clearPullAtomCallback(int);
+ method @Deprecated @Nullable @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public byte[] getData(long);
+ method @Deprecated @Nullable @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public byte[] getMetadata();
+ 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 @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;
+ method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void setBroadcastSubscriber(android.app.PendingIntent, long, long) throws android.app.StatsManager.StatsUnavailableException;
+ 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 @RequiresPermission(android.Manifest.permission.REGISTER_STATS_PULL_ATOM) public void setPullAtomCallback(int, @Nullable android.app.StatsManager.PullAtomMetadata, @NonNull java.util.concurrent.Executor, @NonNull android.app.StatsManager.StatsPullAtomCallback);
+ 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";
+ field public static final String EXTRA_STATS_CONFIG_KEY = "android.app.extra.STATS_CONFIG_KEY";
+ field public static final String EXTRA_STATS_CONFIG_UID = "android.app.extra.STATS_CONFIG_UID";
+ 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 {
+ method @Nullable public int[] getAdditiveFields();
+ method public long getCoolDownMillis();
+ method public long getTimeoutMillis();
+ }
+
+ 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 setCoolDownMillis(long);
+ method @NonNull public android.app.StatsManager.PullAtomMetadata.Builder setTimeoutMillis(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 {
+ ctor public StatsManager.StatsUnavailableException(String);
+ ctor public StatsManager.StatsUnavailableException(String, Throwable);
+ }
+
+}
+
+package android.os {
+
+ public final class StatsDimensionsValue implements android.os.Parcelable {
+ method public int describeContents();
+ method public boolean getBooleanValue();
+ method public int getField();
+ method public float getFloatValue();
+ method public int getIntValue();
+ method public long getLongValue();
+ method public String getStringValue();
+ method public java.util.List<android.os.StatsDimensionsValue> getTupleValueList();
+ method public int getValueType();
+ method public boolean isValueType(int);
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final int BOOLEAN_VALUE_TYPE = 5; // 0x5
+ field @NonNull public static final android.os.Parcelable.Creator<android.os.StatsDimensionsValue> CREATOR;
+ field public static final int FLOAT_VALUE_TYPE = 6; // 0x6
+ field public static final int INT_VALUE_TYPE = 3; // 0x3
+ field public static final int LONG_VALUE_TYPE = 4; // 0x4
+ field public static final int STRING_VALUE_TYPE = 2; // 0x2
+ field public static final int TUPLE_VALUE_TYPE = 7; // 0x7
+ }
+
+}
+
+package android.util {
+
+ public final class StatsEvent {
+ method @NonNull public static android.util.StatsEvent.Builder newBuilder();
+ }
+
+ public static final class StatsEvent.Builder {
+ method @NonNull public android.util.StatsEvent.Builder addBooleanAnnotation(byte, boolean);
+ method @NonNull public android.util.StatsEvent.Builder addIntAnnotation(byte, int);
+ method @NonNull public android.util.StatsEvent build();
+ method @NonNull public android.util.StatsEvent.Builder setAtomId(int);
+ method @NonNull public android.util.StatsEvent.Builder usePooledBuffer();
+ method @NonNull public android.util.StatsEvent.Builder writeAttributionChain(@NonNull int[], @NonNull String[]);
+ method @NonNull public android.util.StatsEvent.Builder writeBoolean(boolean);
+ method @NonNull public android.util.StatsEvent.Builder writeByteArray(@NonNull byte[]);
+ method @NonNull public android.util.StatsEvent.Builder writeFloat(float);
+ method @NonNull public android.util.StatsEvent.Builder writeInt(int);
+ method @NonNull public android.util.StatsEvent.Builder writeKeyValuePairs(@Nullable android.util.SparseIntArray, @Nullable android.util.SparseLongArray, @Nullable android.util.SparseArray<java.lang.String>, @Nullable android.util.SparseArray<java.lang.Float>);
+ method @NonNull public android.util.StatsEvent.Builder writeLong(long);
+ method @NonNull public android.util.StatsEvent.Builder writeString(@NonNull String);
+ }
+
+ public final class StatsLog {
+ method public static void write(@NonNull android.util.StatsEvent);
+ method public static void writeRaw(@NonNull byte[], int);
+ }
+
+}
+
diff --git a/apex/framework/api/system-removed.txt b/apex/framework/api/system-removed.txt
new file mode 100644
index 0000000..d802177
--- /dev/null
+++ b/apex/framework/api/system-removed.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/apex/service/Android.bp b/apex/service/Android.bp
index ff56bb5..df0ccfc 100644
--- a/apex/service/Android.bp
+++ b/apex/service/Android.bp
@@ -1,6 +1,16 @@
-// Statsd Service jar, which will eventually be put in the statsd mainline apex.
-// service-statsd needs to be added to PRODUCT_UPDATABLE_SYSTEM_SERVER_JARS.
-// This jar will contain StatsCompanionService
+// Copyright (C) 2020 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
filegroup {
name: "service-statsd-sources",
@@ -11,28 +21,13 @@
java_library {
name: "service-statsd",
- installable: true,
-
- srcs: [
- ":service-statsd-sources",
- ],
-
- // TODO(b/146757305) should be "module_current" since not allowed to use
- // @CorePlatformApi's
- sdk_version: "core_platform",
-
+ srcs: [ ":service-statsd-sources" ],
+ sdk_version: "system_server_current",
libs: [
"framework-annotations-lib",
- "services-stubs",
"framework-statsd",
-
- // TODO(b/146757305): should be unnecessary once
- // sdk_version="module_lib_current" or "module_current"
- "android_module_lib_stubs_current",
],
-
plugins: ["java_api_finder"],
-
apex_available: [
"com.android.os.statsd",
"test_com.android.os.statsd",
diff --git a/apex/service/java/com/android/server/stats/StatsCompanionService.java b/apex/service/java/com/android/server/stats/StatsCompanionService.java
index c84627d..aad5112 100644
--- a/apex/service/java/com/android/server/stats/StatsCompanionService.java
+++ b/apex/service/java/com/android/server/stats/StatsCompanionService.java
@@ -30,6 +30,7 @@
import android.content.pm.ResolveInfo;
import android.os.Binder;
import android.os.Bundle;
+import android.os.FileUtils;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.IBinder;
@@ -37,6 +38,7 @@
import android.os.IStatsd;
import android.os.Looper;
import android.os.ParcelFileDescriptor;
+import android.os.PowerManager;
import android.os.RemoteException;
import android.os.StatsFrameworkInitializer;
import android.os.SystemClock;
@@ -47,8 +49,6 @@
import com.android.internal.annotations.GuardedBy;
-import libcore.io.IoUtils;
-
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileOutputStream;
@@ -100,9 +100,9 @@
private static IStatsd sStatsd;
private static final Object sStatsdLock = new Object();
- private final OnAlarmListener mAnomalyAlarmListener = new AnomalyAlarmListener();
- private final OnAlarmListener mPullingAlarmListener = new PullingAlarmListener();
- private final OnAlarmListener mPeriodicAlarmListener = new PeriodicAlarmListener();
+ private final OnAlarmListener mAnomalyAlarmListener;
+ private final OnAlarmListener mPullingAlarmListener;
+ private final OnAlarmListener mPeriodicAlarmListener;
private StatsManagerService mStatsManagerService;
@@ -121,6 +121,9 @@
handlerThread.start();
mHandler = new CompanionHandler(handlerThread.getLooper());
+ mAnomalyAlarmListener = new AnomalyAlarmListener(context);
+ mPullingAlarmListener = new PullingAlarmListener(context);
+ mPeriodicAlarmListener = new PeriodicAlarmListener(context);
}
private final static int[] toIntArray(List<Integer> list) {
@@ -226,13 +229,38 @@
Log.d(TAG, "Sent data for " + numRecords + " apps");
}
} finally {
- IoUtils.closeQuietly(fout);
+ FileUtils.closeQuietly(fout);
backgroundThread.quit();
backgroundThread.interrupt();
}
});
}
+ private static class WakelockThread extends Thread {
+ private final PowerManager.WakeLock mWl;
+ private final Runnable mRunnable;
+
+ WakelockThread(Context context, String wakelockName, Runnable runnable) {
+ PowerManager powerManager = (PowerManager)
+ context.getSystemService(Context.POWER_SERVICE);
+ mWl = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, wakelockName);
+ mRunnable = runnable;
+ }
+ @Override
+ public void run() {
+ try {
+ mRunnable.run();
+ } finally {
+ mWl.release();
+ }
+ }
+ @Override
+ public void start() {
+ mWl.acquire();
+ super.start();
+ }
+ }
+
private final static class AppUpdateReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
@@ -308,6 +336,12 @@
}
public static final class AnomalyAlarmListener implements OnAlarmListener {
+ private final Context mContext;
+
+ AnomalyAlarmListener(Context context) {
+ mContext = context;
+ }
+
@Override
public void onAlarm() {
if (DEBUG) {
@@ -319,17 +353,30 @@
Log.w(TAG, "Could not access statsd to inform it of anomaly alarm firing");
return;
}
- try {
- // Two-way call to statsd to retain AlarmManager wakelock
- statsd.informAnomalyAlarmFired();
- } catch (RemoteException e) {
- Log.w(TAG, "Failed to inform statsd of anomaly alarm firing", e);
- }
- // AlarmManager releases its own wakelock here.
+
+ // Wakelock needs to be retained while calling statsd.
+ Thread thread = new WakelockThread(mContext,
+ AnomalyAlarmListener.class.getCanonicalName(), new Runnable() {
+ @Override
+ public void run() {
+ try {
+ statsd.informAnomalyAlarmFired();
+ } catch (RemoteException e) {
+ Log.w(TAG, "Failed to inform statsd of anomaly alarm firing", e);
+ }
+ }
+ });
+ thread.start();
}
}
public final static class PullingAlarmListener implements OnAlarmListener {
+ private final Context mContext;
+
+ PullingAlarmListener(Context context) {
+ mContext = context;
+ }
+
@Override
public void onAlarm() {
if (DEBUG) {
@@ -340,16 +387,30 @@
Log.w(TAG, "Could not access statsd to inform it of pulling alarm firing.");
return;
}
- try {
- // Two-way call to statsd to retain AlarmManager wakelock
- statsd.informPollAlarmFired();
- } catch (RemoteException e) {
- Log.w(TAG, "Failed to inform statsd of pulling alarm firing.", e);
- }
+
+ // Wakelock needs to be retained while calling statsd.
+ Thread thread = new WakelockThread(mContext,
+ PullingAlarmListener.class.getCanonicalName(), new Runnable() {
+ @Override
+ public void run() {
+ try {
+ statsd.informPollAlarmFired();
+ } catch (RemoteException e) {
+ Log.w(TAG, "Failed to inform statsd of pulling alarm firing.", e);
+ }
+ }
+ });
+ thread.start();
}
}
public final static class PeriodicAlarmListener implements OnAlarmListener {
+ private final Context mContext;
+
+ PeriodicAlarmListener(Context context) {
+ mContext = context;
+ }
+
@Override
public void onAlarm() {
if (DEBUG) {
@@ -360,13 +421,20 @@
Log.w(TAG, "Could not access statsd to inform it of periodic alarm firing.");
return;
}
- try {
- // Two-way call to statsd to retain AlarmManager wakelock
- statsd.informAlarmForSubscriberTriggeringFired();
- } catch (RemoteException e) {
- Log.w(TAG, "Failed to inform statsd of periodic alarm firing.", e);
- }
- // AlarmManager releases its own wakelock here.
+
+ // Wakelock needs to be retained while calling statsd.
+ Thread thread = new WakelockThread(mContext,
+ PeriodicAlarmListener.class.getCanonicalName(), new Runnable() {
+ @Override
+ public void run() {
+ try {
+ statsd.informAlarmForSubscriberTriggeringFired();
+ } catch (RemoteException e) {
+ Log.w(TAG, "Failed to inform statsd of periodic alarm firing.", e);
+ }
+ }
+ });
+ thread.start();
}
}
diff --git a/apex/tests/libstatspull/AndroidManifest.xml b/apex/tests/libstatspull/AndroidManifest.xml
index bffd400..0c669b0 100644
--- a/apex/tests/libstatspull/AndroidManifest.xml
+++ b/apex/tests/libstatspull/AndroidManifest.xml
@@ -21,6 +21,7 @@
<uses-permission android:name="android.permission.DUMP" />
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" />
+ <uses-permission android:name="android.permission.REGISTER_STATS_PULL_ATOM" />
<instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
android:targetPackage="com.android.internal.os.statsd.libstats"
diff --git a/apex/tests/libstatspull/TEST_MAPPING b/apex/tests/libstatspull/TEST_MAPPING
deleted file mode 100644
index 5e1178c..0000000
--- a/apex/tests/libstatspull/TEST_MAPPING
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "presubmit" : [
- {
- "name" : "LibStatsPullTests"
- }
- ]
-}
\ No newline at end of file
diff --git a/apex/tests/libstatspull/jni/stats_pull_helper.cpp b/apex/tests/libstatspull/jni/stats_pull_helper.cpp
index 9e5aa95..166592d 100644
--- a/apex/tests/libstatspull/jni/stats_pull_helper.cpp
+++ b/apex/tests/libstatspull/jni/stats_pull_helper.cpp
@@ -44,30 +44,27 @@
return sPullReturnVal;
}
-extern "C"
-JNIEXPORT void JNICALL
-Java_com_android_internal_os_statsd_libstats_LibStatsPullTests_registerStatsPuller(
- JNIEnv* /*env*/, jobject /* this */, jint atomTag, jlong timeoutNs, jlong coolDownNs,
- jint pullRetVal, jlong latencyMillis, int atomsPerPull)
-{
+extern "C" JNIEXPORT void JNICALL
+Java_com_android_internal_os_statsd_libstats_LibStatsPullTests_setStatsPuller(
+ JNIEnv* /*env*/, jobject /* this */, jint atomTag, jlong timeoutMillis,
+ jlong coolDownMillis, jint pullRetVal, jlong latencyMillis, int atomsPerPull) {
sAtomTag = atomTag;
sPullReturnVal = pullRetVal;
sLatencyMillis = latencyMillis;
sAtomsPerPull = atomsPerPull;
sNumPulls = 0;
AStatsManager_PullAtomMetadata* metadata = AStatsManager_PullAtomMetadata_obtain();
- AStatsManager_PullAtomMetadata_setCoolDownNs(metadata, coolDownNs);
- AStatsManager_PullAtomMetadata_setTimeoutNs(metadata, timeoutNs);
+ AStatsManager_PullAtomMetadata_setCoolDownMillis(metadata, coolDownMillis);
+ AStatsManager_PullAtomMetadata_setTimeoutMillis(metadata, timeoutMillis);
- AStatsManager_registerPullAtomCallback(sAtomTag, &pullAtomCallback, metadata, nullptr);
+ AStatsManager_setPullAtomCallback(sAtomTag, metadata, &pullAtomCallback, nullptr);
AStatsManager_PullAtomMetadata_release(metadata);
}
-extern "C"
-JNIEXPORT void JNICALL
-Java_com_android_internal_os_statsd_libstats_LibStatsPullTests_unregisterStatsPuller(
- JNIEnv* /*env*/, jobject /* this */, jint /*atomTag*/)
-{
- AStatsManager_unregisterPullAtomCallback(sAtomTag);
+extern "C" JNIEXPORT void JNICALL
+Java_com_android_internal_os_statsd_libstats_LibStatsPullTests_clearStatsPuller(JNIEnv* /*env*/,
+ jobject /* this */,
+ jint /*atomTag*/) {
+ AStatsManager_clearPullAtomCallback(sAtomTag);
}
} // namespace
diff --git a/apex/tests/libstatspull/src/com/android/internal/os/statsd/libstats/LibStatsPullTests.java b/apex/tests/libstatspull/src/com/android/internal/os/statsd/libstats/LibStatsPullTests.java
index d4e51e0..3f199e8 100644
--- a/apex/tests/libstatspull/src/com/android/internal/os/statsd/libstats/LibStatsPullTests.java
+++ b/apex/tests/libstatspull/src/com/android/internal/os/statsd/libstats/LibStatsPullTests.java
@@ -58,8 +58,8 @@
private static int sPullReturnValue;
private static long sConfigId;
private static long sPullLatencyMillis;
- private static long sPullTimeoutNs;
- private static long sCoolDownNs;
+ private static long sPullTimeoutMillis;
+ private static long sCoolDownMillis;
private static int sAtomsPerPull;
static {
@@ -75,8 +75,8 @@
assertThat(InstrumentationRegistry.getInstrumentation()).isNotNull();
sPullReturnValue = StatsManager.PULL_SUCCESS;
sPullLatencyMillis = 0;
- sPullTimeoutNs = 10_000_000_000L;
- sCoolDownNs = 1_000_000_000L;
+ sPullTimeoutMillis = 10_000L;
+ sCoolDownMillis = 1_000L;
sAtomsPerPull = 1;
}
@@ -85,7 +85,7 @@
*/
@After
public void tearDown() throws Exception {
- unregisterStatsPuller(PULL_ATOM_TAG);
+ clearStatsPuller(PULL_ATOM_TAG);
StatsManager statsManager = (StatsManager) mContext.getSystemService(
Context.STATS_MANAGER);
statsManager.removeConfig(sConfigId);
@@ -102,14 +102,14 @@
createAndAddConfigToStatsd(statsManager);
// Add the puller.
- registerStatsPuller(PULL_ATOM_TAG, sPullTimeoutNs, sCoolDownNs, sPullReturnValue,
+ setStatsPuller(PULL_ATOM_TAG, sPullTimeoutMillis, sCoolDownMillis, sPullReturnValue,
sPullLatencyMillis, sAtomsPerPull);
Thread.sleep(SHORT_SLEEP_MILLIS);
StatsLog.logStart(APP_BREADCRUMB_LABEL);
// Let the current bucket finish.
Thread.sleep(LONG_SLEEP_MILLIS);
List<Atom> data = StatsConfigUtils.getGaugeMetricDataList(statsManager, sConfigId);
- unregisterStatsPuller(PULL_ATOM_TAG);
+ clearStatsPuller(PULL_ATOM_TAG);
assertThat(data.size()).isEqualTo(1);
TestAtoms.PullCallbackAtomWrapper atomWrapper = null;
try {
@@ -135,14 +135,14 @@
createAndAddConfigToStatsd(statsManager);
sPullReturnValue = StatsManager.PULL_SKIP;
// Add the puller.
- registerStatsPuller(PULL_ATOM_TAG, sPullTimeoutNs, sCoolDownNs, sPullReturnValue,
+ setStatsPuller(PULL_ATOM_TAG, sPullTimeoutMillis, sCoolDownMillis, sPullReturnValue,
sPullLatencyMillis, sAtomsPerPull);
Thread.sleep(SHORT_SLEEP_MILLIS);
StatsLog.logStart(APP_BREADCRUMB_LABEL);
// Let the current bucket finish.
Thread.sleep(LONG_SLEEP_MILLIS);
List<Atom> data = StatsConfigUtils.getGaugeMetricDataList(statsManager, sConfigId);
- unregisterStatsPuller(PULL_ATOM_TAG);
+ clearStatsPuller(PULL_ATOM_TAG);
assertThat(data.size()).isEqualTo(0);
}
@@ -157,17 +157,17 @@
// The puller will sleep for 1.5 sec.
sPullLatencyMillis = 1_500;
// 1 second timeout
- sPullTimeoutNs = 1_000_000_000;
+ sPullTimeoutMillis = 1_000;
// Add the puller.
- registerStatsPuller(PULL_ATOM_TAG, sPullTimeoutNs, sCoolDownNs, sPullReturnValue,
+ setStatsPuller(PULL_ATOM_TAG, sPullTimeoutMillis, sCoolDownMillis, sPullReturnValue,
sPullLatencyMillis, sAtomsPerPull);
Thread.sleep(SHORT_SLEEP_MILLIS);
StatsLog.logStart(APP_BREADCRUMB_LABEL);
// Let the current bucket finish and the pull timeout.
Thread.sleep(sPullLatencyMillis * 2);
List<Atom> data = StatsConfigUtils.getGaugeMetricDataList(statsManager, sConfigId);
- unregisterStatsPuller(PULL_ATOM_TAG);
+ clearStatsPuller(PULL_ATOM_TAG);
assertThat(data.size()).isEqualTo(0);
}
@@ -181,9 +181,9 @@
createAndAddConfigToStatsd(statsManager);
// Set the cooldown to 10 seconds
- sCoolDownNs = 10_000_000_000L;
+ sCoolDownMillis = 10_000L;
// Add the puller.
- registerStatsPuller(PULL_ATOM_TAG, sPullTimeoutNs, sCoolDownNs, sPullReturnValue,
+ setStatsPuller(PULL_ATOM_TAG, sPullTimeoutMillis, sCoolDownMillis, sPullReturnValue,
sPullLatencyMillis, sAtomsPerPull);
Thread.sleep(SHORT_SLEEP_MILLIS);
@@ -192,7 +192,7 @@
StatsLog.logStart(APP_BREADCRUMB_LABEL);
Thread.sleep(LONG_SLEEP_MILLIS);
List<Atom> data = StatsConfigUtils.getGaugeMetricDataList(statsManager, sConfigId);
- unregisterStatsPuller(PULL_ATOM_TAG);
+ clearStatsPuller(PULL_ATOM_TAG);
assertThat(data.size()).isEqualTo(2);
for (int i = 0; i < data.size(); i++) {
TestAtoms.PullCallbackAtomWrapper atomWrapper = null;
@@ -221,7 +221,7 @@
createAndAddConfigToStatsd(statsManager);
sAtomsPerPull = 1000;
// Add the puller.
- registerStatsPuller(PULL_ATOM_TAG, sPullTimeoutNs, sCoolDownNs, sPullReturnValue,
+ setStatsPuller(PULL_ATOM_TAG, sPullTimeoutMillis, sCoolDownMillis, sPullReturnValue,
sPullLatencyMillis, sAtomsPerPull);
Thread.sleep(SHORT_SLEEP_MILLIS);
@@ -229,7 +229,7 @@
// Let the current bucket finish.
Thread.sleep(LONG_SLEEP_MILLIS);
List<Atom> data = StatsConfigUtils.getGaugeMetricDataList(statsManager, sConfigId);
- unregisterStatsPuller(PULL_ATOM_TAG);
+ clearStatsPuller(PULL_ATOM_TAG);
assertThat(data.size()).isEqualTo(sAtomsPerPull);
for (int i = 0; i < data.size(); i++) {
@@ -276,9 +276,9 @@
assertThat(StatsConfigUtils.verifyValidConfigExists(statsManager, sConfigId)).isTrue();
}
- private native void registerStatsPuller(int atomTag, long timeoutNs, long coolDownNs,
+ private native void setStatsPuller(int atomTag, long timeoutMillis, long coolDownMillis,
int pullReturnVal, long latencyMillis, int atomPerPull);
- private native void unregisterStatsPuller(int atomTag);
+ private native void clearStatsPuller(int atomTag);
}