summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Sudheer Shanka <sudheersai@google.com> 2023-06-15 07:46:29 +0000
committer Sudheer Shanka <sudheersai@google.com> 2023-06-15 07:46:29 +0000
commit83f8ab4afe6b50bd3753087619fb61a6348559b5 (patch)
tree8bda848fa0cd3688455c0984223a9adcf33f2f21
parentd3283c513f4fe69ea5d72ed96efbfacf6e9b137e (diff)
Changed the cached threshold that decides when to defer bcasts.
Currently, we use RECEIVER procstate (indirectly through onUidCachedChanged callback) as threshold for deciding when to defer broadcasts. Change it to LAST_ACTIVITY procstate which is closer to the "freezable" state we would like to use. Bug: 275142200 Test: atest ./services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueModernImplTest.java Test: atest ./services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java Change-Id: I58c5c2cc44e391f64771d2331d7f86b27e6d60f7
-rw-r--r--services/core/java/com/android/server/am/BroadcastQueueModernImpl.java12
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java41
2 files changed, 40 insertions, 13 deletions
diff --git a/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java b/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java
index 93fb91ab8cdd..e47e617db8c4 100644
--- a/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java
+++ b/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java
@@ -1554,11 +1554,15 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
refreshProcessQueuesLocked(uid);
}
}
+ }, ActivityManager.UID_OBSERVER_PROCSTATE,
+ ActivityManager.PROCESS_STATE_TOP, "android");
+ mService.registerUidObserver(new UidObserver() {
@Override
- public void onUidCachedChanged(int uid, boolean cached) {
+ public void onUidStateChanged(int uid, int procState, long procStateSeq,
+ int capability) {
synchronized (mService) {
- if (cached) {
+ if (procState > ActivityManager.PROCESS_STATE_LAST_ACTIVITY) {
mUidCached.put(uid, true);
} else {
mUidCached.delete(uid);
@@ -1566,8 +1570,8 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
refreshProcessQueuesLocked(uid);
}
}
- }, ActivityManager.UID_OBSERVER_PROCSTATE | ActivityManager.UID_OBSERVER_CACHED,
- ActivityManager.PROCESS_STATE_TOP, "android");
+ }, ActivityManager.UID_OBSERVER_PROCSTATE,
+ ActivityManager.PROCESS_STATE_LAST_ACTIVITY, "android");
// Kick off periodic health checks
mLocalHandler.sendEmptyMessage(MSG_CHECK_HEALTH);
diff --git a/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java b/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java
index 03231ecfb723..671af0b564c5 100644
--- a/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java
@@ -171,6 +171,7 @@ public class BroadcastQueueTest {
BroadcastConstants mConstants;
private BroadcastSkipPolicy mSkipPolicy;
private UidObserver mUidObserver;
+ private UidObserver mUidCachedStateObserver;
/**
* Desired behavior of the next
@@ -315,7 +316,13 @@ public class BroadcastQueueTest {
doAnswer((invocation) -> {
mUidObserver = invocation.getArgument(0);
return null;
- }).when(mAms).registerUidObserver(any(), anyInt(), anyInt(), any());
+ }).when(mAms).registerUidObserver(any(), anyInt(),
+ eq(ActivityManager.PROCESS_STATE_TOP), any());
+ doAnswer((invocation) -> {
+ mUidCachedStateObserver = invocation.getArgument(0);
+ return null;
+ }).when(mAms).registerUidObserver(any(), anyInt(),
+ eq(ActivityManager.PROCESS_STATE_LAST_ACTIVITY), any());
mConstants = new BroadcastConstants(Settings.Global.BROADCAST_FG_CONSTANTS);
mConstants.TIMEOUT = 100;
@@ -1713,8 +1720,12 @@ public class BroadcastQueueTest {
final ProcessRecord receiverYellowApp = makeActiveProcessRecord(PACKAGE_YELLOW);
final ProcessRecord receiverOrangeApp = makeActiveProcessRecord(PACKAGE_ORANGE);
- mUidObserver.onUidCachedChanged(getUidForPackage(PACKAGE_GREEN), true);
- mUidObserver.onUidCachedChanged(getUidForPackage(PACKAGE_BLUE), true);
+ mUidCachedStateObserver.onUidStateChanged(getUidForPackage(PACKAGE_GREEN),
+ ActivityManager.PROCESS_STATE_CACHED_ACTIVITY, 0,
+ ActivityManager.PROCESS_CAPABILITY_NONE);
+ mUidCachedStateObserver.onUidStateChanged(getUidForPackage(PACKAGE_BLUE),
+ ActivityManager.PROCESS_STATE_CACHED_EMPTY, 0,
+ ActivityManager.PROCESS_CAPABILITY_NONE);
final Intent timeTick = new Intent(Intent.ACTION_TIME_TICK);
final BroadcastOptions opts = BroadcastOptions.makeBasic()
@@ -1758,12 +1769,16 @@ public class BroadcastQueueTest {
eq(UserHandle.USER_SYSTEM), anyInt(), anyInt(), any());
// Shift blue to be active and confirm that deferred broadcast is delivered
- mUidObserver.onUidCachedChanged(getUidForPackage(PACKAGE_BLUE), false);
+ mUidCachedStateObserver.onUidStateChanged(getUidForPackage(PACKAGE_BLUE),
+ ActivityManager.PROCESS_STATE_TOP, 0,
+ ActivityManager.PROCESS_CAPABILITY_NONE);
waitForIdle();
verifyScheduleRegisteredReceiver(times(1), receiverBlueApp, timeTick);
// Shift green to be active and confirm that deferred broadcast is delivered
- mUidObserver.onUidCachedChanged(getUidForPackage(PACKAGE_GREEN), false);
+ mUidCachedStateObserver.onUidStateChanged(getUidForPackage(PACKAGE_GREEN),
+ ActivityManager.PROCESS_STATE_SERVICE, 0,
+ ActivityManager.PROCESS_CAPABILITY_NONE);
waitForIdle();
verifyScheduleRegisteredReceiver(times(1), receiverGreenApp, timeTick);
}
@@ -2188,9 +2203,15 @@ public class BroadcastQueueTest {
final ProcessRecord receiverBlueApp = makeActiveProcessRecord(PACKAGE_BLUE);
final ProcessRecord receiverYellowApp = makeActiveProcessRecord(PACKAGE_YELLOW);
- mUidObserver.onUidCachedChanged(getUidForPackage(PACKAGE_GREEN), true);
- mUidObserver.onUidCachedChanged(getUidForPackage(PACKAGE_BLUE), true);
- mUidObserver.onUidCachedChanged(getUidForPackage(PACKAGE_YELLOW), false);
+ mUidCachedStateObserver.onUidStateChanged(getUidForPackage(PACKAGE_GREEN),
+ ActivityManager.PROCESS_STATE_CACHED_ACTIVITY, 0,
+ ActivityManager.PROCESS_CAPABILITY_NONE);
+ mUidCachedStateObserver.onUidStateChanged(getUidForPackage(PACKAGE_BLUE),
+ ActivityManager.PROCESS_STATE_CACHED_EMPTY, 0,
+ ActivityManager.PROCESS_CAPABILITY_NONE);
+ mUidCachedStateObserver.onUidStateChanged(getUidForPackage(PACKAGE_YELLOW),
+ ActivityManager.PROCESS_STATE_SERVICE, 0,
+ ActivityManager.PROCESS_CAPABILITY_NONE);
final Intent airplane = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
final BroadcastOptions opts = BroadcastOptions.makeBasic()
@@ -2213,7 +2234,9 @@ public class BroadcastQueueTest {
verifyScheduleRegisteredReceiver(times(1), receiverYellowApp, airplane);
// Shift green to be active and confirm that deferred broadcast is delivered
- mUidObserver.onUidCachedChanged(getUidForPackage(PACKAGE_GREEN), false);
+ mUidCachedStateObserver.onUidStateChanged(getUidForPackage(PACKAGE_GREEN),
+ ActivityManager.PROCESS_STATE_TOP_SLEEPING, 0,
+ ActivityManager.PROCESS_CAPABILITY_NONE);
waitForIdle();
verifyScheduleRegisteredReceiver(times(1), receiverGreenApp, airplane);
}