From 7af6359bbec0802945eec59face7e975f57beb2b Mon Sep 17 00:00:00 2001 From: Stanislav Zholnin Date: Wed, 3 Jun 2020 15:27:35 +0100 Subject: Inroduce UNIFORM_OPS sampling. Introduce strategy which uniformly samples OPs, without biasing in favour of specific ops. Use this strategy half of the time. Test: atest RuntimeMessageCollectionTest && statsd_testdrive 10069 Bug: 143519689 Change-Id: I481d3a9ef9c66f04577b57432cecdf2c02055e58 --- core/java/android/app/AppOpsManager.java | 9 ++++++-- .../com/android/server/appop/AppOpsService.java | 27 ++++++++++++++-------- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index c498e926ba47..93b27e62167a 100644 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -732,6 +732,10 @@ public class AppOpsManager { public static final int SAMPLING_STRATEGY_BOOT_TIME_SAMPLING = FrameworkStatsLog.RUNTIME_APP_OP_ACCESS__SAMPLING_STRATEGY__BOOT_TIME_SAMPLING; + /** @hide */ + public static final int SAMPLING_STRATEGY_UNIFORM_OPS = + FrameworkStatsLog.RUNTIME_APP_OP_ACCESS__SAMPLING_STRATEGY__UNIFORM_OPS; + /** * Strategies used for message sampling * @hide @@ -741,7 +745,8 @@ public class AppOpsManager { SAMPLING_STRATEGY_DEFAULT, SAMPLING_STRATEGY_UNIFORM, SAMPLING_STRATEGY_RARELY_USED, - SAMPLING_STRATEGY_BOOT_TIME_SAMPLING + SAMPLING_STRATEGY_BOOT_TIME_SAMPLING, + SAMPLING_STRATEGY_UNIFORM_OPS }) public @interface SamplingStrategy {} @@ -8349,7 +8354,7 @@ public class AppOpsManager { * @hide */ private static boolean isCollectingStackTraces() { - if (sConfig.getSampledOpCode() == OP_NONE && + if (sConfig.getSampledOpCode() == OP_NONE && sConfig.getAcceptableLeftDistance() == 0 && sConfig.getExpirationTimeSinceBootMillis() >= SystemClock.elapsedRealtime()) { return false; } diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java index 2eca00e27ddf..b3231909e4b7 100644 --- a/services/core/java/com/android/server/appop/AppOpsService.java +++ b/services/core/java/com/android/server/appop/AppOpsService.java @@ -44,6 +44,7 @@ import static android.app.AppOpsManager.RestrictionBypass; import static android.app.AppOpsManager.SAMPLING_STRATEGY_BOOT_TIME_SAMPLING; import static android.app.AppOpsManager.SAMPLING_STRATEGY_RARELY_USED; import static android.app.AppOpsManager.SAMPLING_STRATEGY_UNIFORM; +import static android.app.AppOpsManager.SAMPLING_STRATEGY_UNIFORM_OPS; import static android.app.AppOpsManager.SECURITY_EXCEPTION_ON_INVALID_ATTRIBUTION_TAG_CHANGE; import static android.app.AppOpsManager.UID_STATE_BACKGROUND; import static android.app.AppOpsManager.UID_STATE_CACHED; @@ -5936,11 +5937,13 @@ public class AppOpsService extends IAppOpsService.Stub { int newLeftDistance = AppOpsManager.leftCircularDistance(opCode, mSampledAppOpCode, _NUM_OP); - if (mAcceptableLeftDistance < newLeftDistance) { + if (mAcceptableLeftDistance < newLeftDistance + && mSamplingStrategy != SAMPLING_STRATEGY_UNIFORM_OPS) { return; } - if (mAcceptableLeftDistance > newLeftDistance) { + if (mAcceptableLeftDistance > newLeftDistance + && mSamplingStrategy != SAMPLING_STRATEGY_UNIFORM_OPS) { mAcceptableLeftDistance = newLeftDistance; mMessagesCollectedCount = 0.0f; } @@ -5978,13 +5981,13 @@ public class AppOpsService extends IAppOpsService.Stub { if (mSampledPackage == null) { if (ThreadLocalRandom.current().nextFloat() < 0.5f) { mSamplingStrategy = SAMPLING_STRATEGY_BOOT_TIME_SAMPLING; - resampleAppOpForPackageLocked(packageName); + resampleAppOpForPackageLocked(packageName, true); } } else if (mRarelyUsedPackages.contains(packageName)) { mRarelyUsedPackages.remove(packageName); if (ThreadLocalRandom.current().nextFloat() < 0.5f) { mSamplingStrategy = SAMPLING_STRATEGY_RARELY_USED; - resampleAppOpForPackageLocked(packageName); + resampleAppOpForPackageLocked(packageName, true); } } } @@ -6001,16 +6004,22 @@ public class AppOpsService extends IAppOpsService.Stub { /** Resamples package and appop to watch from the list provided. */ private void resamplePackageAndAppOpLocked(@NonNull List packageNames) { if (!packageNames.isEmpty()) { - mSamplingStrategy = SAMPLING_STRATEGY_UNIFORM; - resampleAppOpForPackageLocked(packageNames.get( - ThreadLocalRandom.current().nextInt(packageNames.size()))); + if (ThreadLocalRandom.current().nextFloat() < 0.5f) { + mSamplingStrategy = SAMPLING_STRATEGY_UNIFORM; + resampleAppOpForPackageLocked(packageNames.get( + ThreadLocalRandom.current().nextInt(packageNames.size())), true); + } else { + mSamplingStrategy = SAMPLING_STRATEGY_UNIFORM_OPS; + resampleAppOpForPackageLocked(packageNames.get( + ThreadLocalRandom.current().nextInt(packageNames.size())), false); + } } } /** Resamples appop for the chosen package and initializes sampling state */ - private void resampleAppOpForPackageLocked(@NonNull String packageName) { + private void resampleAppOpForPackageLocked(@NonNull String packageName, boolean pickOp) { mMessagesCollectedCount = 0.0f; - mSampledAppOpCode = ThreadLocalRandom.current().nextInt(_NUM_OP); + mSampledAppOpCode = pickOp ? ThreadLocalRandom.current().nextInt(_NUM_OP) : OP_NONE; mAcceptableLeftDistance = _NUM_OP; mSampledPackage = packageName; } -- cgit v1.2.3-59-g8ed1b