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
This commit is contained in:
Sudheer Shanka
2023-06-15 07:46:29 +00:00
parent d3283c513f
commit 83f8ab4afe
2 changed files with 40 additions and 13 deletions

View File

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

View File

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