diff options
| author | 2018-03-25 21:55:50 -0700 | |
|---|---|---|
| committer | 2018-03-25 21:55:50 -0700 | |
| commit | 7f53c7bc975041cb3ba1be7a1e33d305abaf1ddf (patch) | |
| tree | 4d4f2285f0d538135ab36bac454f293941fe2d59 | |
| parent | 6da53af9c55ba2231cd2f47c7dffb150f2c22a89 (diff) | |
Shorter bucket elevation for system_interaction and sync_adapter
Don't keep the app in ACTIVE for too long after an indirect
use of the app. Also don't mark as used, so bucketing algorithm
can override quickly.
Bug: 74340258
Test: atest AppStandbyControllerTests
Change-Id: I3b8014873aaf881de07304b64039da211a63a525
| -rw-r--r-- | services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java | 26 | ||||
| -rw-r--r-- | services/usage/java/com/android/server/usage/AppStandbyController.java | 34 |
2 files changed, 54 insertions, 6 deletions
diff --git a/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java b/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java index 552c915f8480..601999dde84b 100644 --- a/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java +++ b/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java @@ -19,6 +19,7 @@ package com.android.server.usage; import static android.app.usage.UsageEvents.Event.NOTIFICATION_SEEN; import static android.app.usage.UsageEvents.Event.SLICE_PINNED; import static android.app.usage.UsageEvents.Event.SLICE_PINNED_PRIV; +import static android.app.usage.UsageEvents.Event.SYSTEM_INTERACTION; import static android.app.usage.UsageEvents.Event.USER_INTERACTION; import static android.app.usage.UsageStatsManager.REASON_MAIN_DEFAULT; import static android.app.usage.UsageStatsManager.REASON_MAIN_FORCED; @@ -569,6 +570,31 @@ public class AppStandbyControllerTests { } @Test + public void testSystemInteractionTimeout() throws Exception { + setChargingState(mController, false); + + reportEvent(mController, USER_INTERACTION, 0); + // Fast forward to RARE + mInjector.mElapsedRealtime = RARE_THRESHOLD + 100; + mController.checkIdleStates(USER_ID); + assertBucket(STANDBY_BUCKET_RARE); + + // Trigger a SYSTEM_INTERACTION and verify bucket + reportEvent(mController, SYSTEM_INTERACTION, mInjector.mElapsedRealtime); + assertBucket(STANDBY_BUCKET_ACTIVE); + + // Verify it's still in ACTIVE close to end of timeout + mInjector.mElapsedRealtime += mController.mSystemInteractionTimeoutMillis - 100; + mController.checkIdleStates(USER_ID); + assertBucket(STANDBY_BUCKET_ACTIVE); + + // Verify bucket moves to RARE after timeout + mInjector.mElapsedRealtime += 200; + mController.checkIdleStates(USER_ID); + assertBucket(STANDBY_BUCKET_RARE); + } + + @Test public void testPredictionNotOverridden() throws Exception { setChargingState(mController, false); diff --git a/services/usage/java/com/android/server/usage/AppStandbyController.java b/services/usage/java/com/android/server/usage/AppStandbyController.java index 1af5f469c0f0..9139a4cd7c1a 100644 --- a/services/usage/java/com/android/server/usage/AppStandbyController.java +++ b/services/usage/java/com/android/server/usage/AppStandbyController.java @@ -198,6 +198,10 @@ public class AppStandbyController { long mSystemUpdateUsageTimeoutMillis; /** Maximum time to wait for a prediction before using simple timeouts to downgrade buckets. */ long mPredictionTimeoutMillis; + /** Maximum time a sync adapter associated with a CP should keep the buckets elevated. */ + long mSyncAdapterTimeoutMillis; + /** Maximum time a system interaction should keep the buckets elevated. */ + long mSystemInteractionTimeoutMillis; volatile boolean mAppIdleEnabled; boolean mAppIdleTempParoled; @@ -357,8 +361,8 @@ public class AppStandbyController { synchronized (mAppIdleLock) { AppUsageHistory appUsage = mAppIdleHistory.reportUsage(packageName, userId, STANDBY_BUCKET_ACTIVE, REASON_SUB_USAGE_SYNC_ADAPTER, - elapsedRealtime, - elapsedRealtime + mStrongUsageTimeoutMillis); + 0, + elapsedRealtime + mSyncAdapterTimeoutMillis); maybeInformListeners(packageName, userId, elapsedRealtime, appUsage.currentBucket, appUsage.bucketingReason, false); } @@ -708,7 +712,11 @@ public class AppStandbyController { STANDBY_BUCKET_WORKING_SET, subReason, 0, elapsedRealtime + mNotificationSeenTimeoutMillis); nextCheckTime = mNotificationSeenTimeoutMillis; - + } else if (event.mEventType == UsageEvents.Event.SYSTEM_INTERACTION) { + mAppIdleHistory.reportUsage(appHistory, event.mPackage, + STANDBY_BUCKET_ACTIVE, subReason, + 0, elapsedRealtime + mSystemInteractionTimeoutMillis); + nextCheckTime = mSystemInteractionTimeoutMillis; } else { mAppIdleHistory.reportUsage(appHistory, event.mPackage, STANDBY_BUCKET_ACTIVE, subReason, @@ -1523,6 +1531,14 @@ public class AppStandbyController { private static final String KEY_SYSTEM_UPDATE_HOLD_DURATION = "system_update_usage_duration"; private static final String KEY_PREDICTION_TIMEOUT = "prediction_timeout"; + private static final String KEY_SYNC_ADAPTER_HOLD_DURATION = "sync_adapter_duration"; + private static final String KEY_SYSTEM_INTERACTION_HOLD_DURATION = + "system_interaction_duration"; + public static final long DEFAULT_STRONG_USAGE_TIMEOUT = 1 * ONE_HOUR; + public static final long DEFAULT_NOTIFICATION_TIMEOUT = 12 * ONE_HOUR; + public static final long DEFAULT_SYSTEM_UPDATE_TIMEOUT = 2 * ONE_HOUR; + public static final long DEFAULT_SYSTEM_INTERACTION_TIMEOUT = 10 * ONE_MINUTE; + public static final long DEFAULT_SYNC_ADAPTER_TIMEOUT = 10 * ONE_MINUTE; private final KeyValueListParser mParser = new KeyValueListParser(','); @@ -1585,16 +1601,22 @@ public class AppStandbyController { COMPRESS_TIME ? ONE_MINUTE : 4 * 60 * ONE_MINUTE); // 4 hours mStrongUsageTimeoutMillis = mParser.getDurationMillis (KEY_STRONG_USAGE_HOLD_DURATION, - COMPRESS_TIME ? ONE_MINUTE : 1 * ONE_HOUR); + COMPRESS_TIME ? ONE_MINUTE : DEFAULT_STRONG_USAGE_TIMEOUT); mNotificationSeenTimeoutMillis = mParser.getDurationMillis (KEY_NOTIFICATION_SEEN_HOLD_DURATION, - COMPRESS_TIME ? 12 * ONE_MINUTE : 12 * ONE_HOUR); + COMPRESS_TIME ? 12 * ONE_MINUTE : DEFAULT_NOTIFICATION_TIMEOUT); mSystemUpdateUsageTimeoutMillis = mParser.getDurationMillis (KEY_SYSTEM_UPDATE_HOLD_DURATION, - COMPRESS_TIME ? 2 * ONE_MINUTE : 2 * ONE_HOUR); + COMPRESS_TIME ? 2 * ONE_MINUTE : DEFAULT_SYSTEM_UPDATE_TIMEOUT); mPredictionTimeoutMillis = mParser.getDurationMillis (KEY_PREDICTION_TIMEOUT, COMPRESS_TIME ? 10 * ONE_MINUTE : DEFAULT_PREDICTION_TIMEOUT); + mSyncAdapterTimeoutMillis = mParser.getDurationMillis + (KEY_SYNC_ADAPTER_HOLD_DURATION, + COMPRESS_TIME ? ONE_MINUTE : DEFAULT_SYNC_ADAPTER_TIMEOUT); + mSystemInteractionTimeoutMillis = mParser.getDurationMillis + (KEY_SYSTEM_INTERACTION_HOLD_DURATION, + COMPRESS_TIME ? ONE_MINUTE : DEFAULT_SYSTEM_INTERACTION_TIMEOUT); } } |