Update IUidObserver.onUidStateChanged to include procStateSeq.
This procStateSeq is associated with the process state change of
an uid and will help in identifying if network policy rules have been
updated for a process state change.
Bug: 27803922
Test: runtest -c com.android.server.am.ActivityManagerServiceTest
frameworks-services
Change-Id: Iaab8d004f476b96f28d08c886c7b0a6b585b9fef
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index cae37c6..ba39eb1 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -144,7 +144,7 @@
}
@Override
- public void onUidStateChanged(int uid, int procState) {
+ public void onUidStateChanged(int uid, int procState, long procStateSeq) {
mListener.onUidImportance(uid, RunningAppProcessInfo.procStateToImportance(procState));
}
diff --git a/core/java/android/app/IUidObserver.aidl b/core/java/android/app/IUidObserver.aidl
index 64cb9b1..ae64875 100644
--- a/core/java/android/app/IUidObserver.aidl
+++ b/core/java/android/app/IUidObserver.aidl
@@ -20,8 +20,13 @@
oneway interface IUidObserver {
/**
* General report of a state change of an uid.
+ *
+ * @param uid The uid for which the state change is being reported.
+ * @param procState The updated process state for the uid.
+ * @param procStateSeq The sequence no. associated with process state change of the uid,
+ * see UidRecord.procStateSeq for details.
*/
- void onUidStateChanged(int uid, int procState);
+ void onUidStateChanged(int uid, int procState, long procStateSeq);
/**
* Report that there are no longer any processes running for a uid.
diff --git a/services/core/java/com/android/server/AlarmManagerService.java b/services/core/java/com/android/server/AlarmManagerService.java
index 0d438cb..179b3d0 100644
--- a/services/core/java/com/android/server/AlarmManagerService.java
+++ b/services/core/java/com/android/server/AlarmManagerService.java
@@ -2839,7 +2839,8 @@
}
final class UidObserver extends IUidObserver.Stub {
- @Override public void onUidStateChanged(int uid, int procState) throws RemoteException {
+ @Override public void onUidStateChanged(int uid, int procState,
+ long procStateSeq) throws RemoteException {
}
@Override public void onUidGone(int uid, boolean disabled) throws RemoteException {
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 95ca7ba..44674f2 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -4368,7 +4368,8 @@
if (reg.lastProcStates != null) {
reg.lastProcStates.put(item.uid, item.processState);
}
- observer.onUidStateChanged(item.uid, item.processState);
+ observer.onUidStateChanged(item.uid, item.processState,
+ item.procStateSeq);
}
}
}
@@ -21480,6 +21481,7 @@
pendingChange.processState = uidRec != null
? uidRec.setProcState : ActivityManager.PROCESS_STATE_NONEXISTENT;
pendingChange.ephemeral = uidRec.ephemeral;
+ pendingChange.procStateSeq = uidRec != null ? uidRec.curProcStateSeq : 0;
// Directly update the power manager, since we sit on top of it and it is critical
// it be kept in sync (so wake locks will be held as soon as appropriate).
diff --git a/services/core/java/com/android/server/am/UidRecord.java b/services/core/java/com/android/server/am/UidRecord.java
index f15543a..cf6c1e1 100644
--- a/services/core/java/com/android/server/am/UidRecord.java
+++ b/services/core/java/com/android/server/am/UidRecord.java
@@ -53,6 +53,7 @@
int change;
int processState;
boolean ephemeral;
+ long procStateSeq;
}
ChangeItem pendingChange;
diff --git a/services/core/java/com/android/server/job/JobSchedulerService.java b/services/core/java/com/android/server/job/JobSchedulerService.java
index c973911..b316a3b 100644
--- a/services/core/java/com/android/server/job/JobSchedulerService.java
+++ b/services/core/java/com/android/server/job/JobSchedulerService.java
@@ -518,7 +518,8 @@
}
final private IUidObserver mUidObserver = new IUidObserver.Stub() {
- @Override public void onUidStateChanged(int uid, int procState) throws RemoteException {
+ @Override public void onUidStateChanged(int uid, int procState,
+ long procStateSeq) throws RemoteException {
updateUidState(uid, procState);
}
diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
index 5078998..00f4118 100644
--- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
+++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
@@ -709,7 +709,8 @@
}
final private IUidObserver mUidObserver = new IUidObserver.Stub() {
- @Override public void onUidStateChanged(int uid, int procState) throws RemoteException {
+ @Override public void onUidStateChanged(int uid, int procState,
+ long procStateSeq) throws RemoteException {
Trace.traceBegin(Trace.TRACE_TAG_NETWORK, "onUidStateChanged");
try {
synchronized (mUidRulesFirstLock) {
diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java
index 1aaec1a..8998212 100644
--- a/services/core/java/com/android/server/pm/ShortcutService.java
+++ b/services/core/java/com/android/server/pm/ShortcutService.java
@@ -476,7 +476,8 @@
final private IUidObserver mUidObserver = new IUidObserver.Stub() {
@Override
- public void onUidStateChanged(int uid, int procState) throws RemoteException {
+ public void onUidStateChanged(int uid, int procState, long procStateSeq)
+ throws RemoteException {
handleOnUidStateChanged(uid, procState);
}
diff --git a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java
index 3f34d4f..a9b2ae5 100644
--- a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java
@@ -594,19 +594,19 @@
@Test
public void testUidForeground() throws Exception {
// push all uids into background
- mUidObserver.onUidStateChanged(UID_A, ActivityManager.PROCESS_STATE_SERVICE);
- mUidObserver.onUidStateChanged(UID_B, ActivityManager.PROCESS_STATE_SERVICE);
+ mUidObserver.onUidStateChanged(UID_A, ActivityManager.PROCESS_STATE_SERVICE, 0);
+ mUidObserver.onUidStateChanged(UID_B, ActivityManager.PROCESS_STATE_SERVICE, 0);
assertFalse(mService.isUidForeground(UID_A));
assertFalse(mService.isUidForeground(UID_B));
// push one of the uids into foreground
- mUidObserver.onUidStateChanged(UID_A, ActivityManager.PROCESS_STATE_TOP);
+ mUidObserver.onUidStateChanged(UID_A, ActivityManager.PROCESS_STATE_TOP, 0);
assertTrue(mService.isUidForeground(UID_A));
assertFalse(mService.isUidForeground(UID_B));
// and swap another uid into foreground
- mUidObserver.onUidStateChanged(UID_A, ActivityManager.PROCESS_STATE_SERVICE);
- mUidObserver.onUidStateChanged(UID_B, ActivityManager.PROCESS_STATE_TOP);
+ mUidObserver.onUidStateChanged(UID_A, ActivityManager.PROCESS_STATE_SERVICE, 0);
+ mUidObserver.onUidStateChanged(UID_B, ActivityManager.PROCESS_STATE_TOP, 0);
assertFalse(mService.isUidForeground(UID_A));
assertTrue(mService.isUidForeground(UID_B));
}
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java
index 7c84c8e..556b218 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java
@@ -226,6 +226,7 @@
pendingChange.change = changesForPendingUidRecords[i];
pendingChange.uid = i;
pendingChange.processState = procStatesForPendingUidRecords[i];
+ pendingChange.procStateSeq = i;
changeItems.put(changesForPendingUidRecords[i], pendingChange);
ams.mPendingUidChanges.add(pendingChange);
}
@@ -281,8 +282,8 @@
};
verifyObserverReceivedChanges(observerToTest, changesToVerify, changeItems,
(observer, changeItem) -> {
- verify(observer).onUidStateChanged(
- changeItem.uid, changeItem.processState);
+ verify(observer).onUidStateChanged(changeItem.uid,
+ changeItem.processState, changeItem.procStateSeq);
});
}
// Verify there are no other callbacks for this observer.
@@ -325,12 +326,13 @@
changeItem.uid = TEST_UID;
changeItem.change = UidRecord.CHANGE_PROCSTATE;
changeItem.processState = ActivityManager.PROCESS_STATE_LAST_ACTIVITY;
+ changeItem.procStateSeq = 111;
ams.mPendingUidChanges.add(changeItem);
ams.dispatchUidsChanged();
// First process state message is always delivered regardless of whether the process state
// change is above or below the cutpoint (PROCESS_STATE_SERVICE).
verify(observer).onUidStateChanged(TEST_UID,
- ActivityManager.PROCESS_STATE_LAST_ACTIVITY);
+ changeItem.processState, changeItem.procStateSeq);
verifyNoMoreInteractions(observer);
changeItem.processState = ActivityManager.PROCESS_STATE_RECEIVER;
@@ -347,7 +349,7 @@
// the current process state change is above cutpoint, so callback will be invoked with the
// current process state change.
verify(observer).onUidStateChanged(TEST_UID,
- ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE);
+ changeItem.processState, changeItem.procStateSeq);
verifyNoMoreInteractions(observer);
changeItem.processState = ActivityManager.PROCESS_STATE_TOP;
@@ -363,7 +365,8 @@
// Previous process state change is above cutpoint (PROCESS_STATE_SERVICE) and
// the current process state change is below cutpoint, so callback will be invoked with the
// current process state change.
- verify(observer).onUidStateChanged(TEST_UID, ActivityManager.PROCESS_STATE_CACHED_EMPTY);
+ verify(observer).onUidStateChanged(TEST_UID,
+ changeItem.processState, changeItem.procStateSeq);
verifyNoMoreInteractions(observer);
}
diff --git a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
index 1b59d72..b410400 100644
--- a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
@@ -2119,7 +2119,7 @@
protected void makeCallerForeground() {
try {
mService.mUidObserver.onUidStateChanged(
- mInjectedCallingUid, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE);
+ mInjectedCallingUid, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE, 0);
} catch (RemoteException e) {
e.rethrowAsRuntimeException();
}
@@ -2128,7 +2128,7 @@
protected void makeCallerBackground() {
try {
mService.mUidObserver.onUidStateChanged(
- mInjectedCallingUid, ActivityManager.PROCESS_STATE_TOP_SLEEPING);
+ mInjectedCallingUid, ActivityManager.PROCESS_STATE_TOP_SLEEPING, 0);
} catch (RemoteException e) {
e.rethrowAsRuntimeException();
}
diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java
index 900da09..7c5eb07 100644
--- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java
+++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java
@@ -1640,7 +1640,7 @@
// State changed, but not foreground, so no resetting.
mService.mUidObserver.onUidStateChanged(
- CALLING_UID_1, ActivityManager.PROCESS_STATE_TOP_SLEEPING);
+ CALLING_UID_1, ActivityManager.PROCESS_STATE_TOP_SLEEPING, 0);
runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
});
@@ -1664,7 +1664,7 @@
// State changed, package1 foreground, reset.
mService.mUidObserver.onUidStateChanged(
- CALLING_UID_1, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE);
+ CALLING_UID_1, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE, 0);
runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
assertEquals(3, mManager.getRemainingCallCount());
});
@@ -1684,16 +1684,16 @@
MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
});
mService.mUidObserver.onUidStateChanged(
- CALLING_UID_1, ActivityManager.PROCESS_STATE_TOP_SLEEPING);
+ CALLING_UID_1, ActivityManager.PROCESS_STATE_TOP_SLEEPING, 0);
mInjectedCurrentTimeMillis++;
// Different app comes to foreground briefly, and goes back to background.
// Now, make sure package 2's counter is reset, even in this case.
mService.mUidObserver.onUidStateChanged(
- CALLING_UID_2, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE);
+ CALLING_UID_2, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE, 0);
mService.mUidObserver.onUidStateChanged(
- CALLING_UID_2, ActivityManager.PROCESS_STATE_TOP_SLEEPING);
+ CALLING_UID_2, ActivityManager.PROCESS_STATE_TOP_SLEEPING, 0);
runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
assertEquals(3, mManager.getRemainingCallCount());
@@ -1724,9 +1724,9 @@
});
mService.mUidObserver.onUidStateChanged(
- CALLING_UID_2, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE);
+ CALLING_UID_2, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE, 0);
mService.mUidObserver.onUidStateChanged(
- CALLING_UID_2, ActivityManager.PROCESS_STATE_TOP_SLEEPING);
+ CALLING_UID_2, ActivityManager.PROCESS_STATE_TOP_SLEEPING, 0);
runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
assertEquals(3, mManager.getRemainingCallCount());
@@ -1753,7 +1753,7 @@
// Now, also try calling some APIs and make sure foreground apps don't get throttled.
mService.mUidObserver.onUidStateChanged(
UserHandle.getUid(USER_10, CALLING_UID_1),
- ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE);
+ ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE, 0);
runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
assertEquals(3, mManager.getRemainingCallCount());
assertFalse(mManager.isRateLimitingActive());
diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java
index 3c7ee43..7be2b0f 100644
--- a/services/usage/java/com/android/server/usage/UsageStatsService.java
+++ b/services/usage/java/com/android/server/usage/UsageStatsService.java
@@ -342,7 +342,7 @@
private final IUidObserver mUidObserver = new IUidObserver.Stub() {
@Override
- public void onUidStateChanged(int uid, int procState) {
+ public void onUidStateChanged(int uid, int procState, long procStateSeq) {
final int newCounter = (procState <= ActivityManager.PROCESS_STATE_TOP) ? 0 : 1;
synchronized (mUidToKernelCounter) {
final int oldCounter = mUidToKernelCounter.get(uid, 0);
@@ -364,7 +364,7 @@
@Override
public void onUidGone(int uid, boolean disabled) throws RemoteException {
- onUidStateChanged(uid, ActivityManager.PROCESS_STATE_NONEXISTENT);
+ onUidStateChanged(uid, ActivityManager.PROCESS_STATE_NONEXISTENT, 0);
}
@Override