Loading services/core/java/com/android/server/am/ActivityManagerService.java +1 −1 Original line number Diff line number Diff line Loading @@ -19647,7 +19647,7 @@ public class ActivityManagerService extends IActivityManager.Stub record.procStateSeqWaitingForNetwork = 0; final long totalTime = SystemClock.uptimeMillis() - startTime; if (totalTime >= mConstants.mNetworkAccessTimeoutMs || DEBUG_NETWORK) { Slog.w(TAG_NETWORK, "Total time waited for network rules to get updated: " Slog.wtf(TAG_NETWORK, "Total time waited for network rules to get updated: " + totalTime + ". Uid: " + callingUid + " procStateSeq: " + procStateSeq + " UidRec: " + record + " validateUidRec: " services/core/java/com/android/server/net/NetworkPolicyManagerService.java +13 −9 Original line number Diff line number Diff line Loading @@ -1214,16 +1214,14 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { return false; } final int previousProcState = previousInfo.procState; if (mBackgroundNetworkRestricted && (previousProcState >= BACKGROUND_THRESHOLD_STATE) != (newProcState >= BACKGROUND_THRESHOLD_STATE)) { // Proc-state change crossed BACKGROUND_THRESHOLD_STATE: Network rules for the // BACKGROUND chain may change. return true; } if ((previousProcState <= TOP_THRESHOLD_STATE) != (newProcState <= TOP_THRESHOLD_STATE)) { // Proc-state change crossed TOP_THRESHOLD_STATE: Network rules for the // LOW_POWER_STANDBY chain may change. || (newProcState <= TOP_THRESHOLD_STATE)) { // If the proc-state change crossed TOP_THRESHOLD_STATE, network rules for the // LOW_POWER_STANDBY chain may change, so we need to evaluate the transition. // In addition, we always process changes when the new process state is // TOP_THRESHOLD_STATE or below, to avoid situations where the TOP app ends up // waiting for NPMS to finish processing newProcStateSeq, even when it was // redundant (b/327303931). return true; } if ((previousProcState <= FOREGROUND_THRESHOLD_STATE) Loading @@ -1232,6 +1230,12 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { // different chains may change. return true; } if (mBackgroundNetworkRestricted && (previousProcState >= BACKGROUND_THRESHOLD_STATE) != (newProcState >= BACKGROUND_THRESHOLD_STATE)) { // Proc-state change crossed BACKGROUND_THRESHOLD_STATE: Network rules for the // BACKGROUND chain may change. return true; } final int networkCapabilities = PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK | PROCESS_CAPABILITY_USER_RESTRICTED_NETWORK; if ((previousInfo.capability & networkCapabilities) Loading services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java +17 −6 Original line number Diff line number Diff line Loading @@ -2315,10 +2315,11 @@ public class NetworkPolicyManagerServiceTest { } waitForUidEventHandlerIdle(); try (SyncBarrier b = new SyncBarrier(mService.mUidEventHandler)) { // Doesn't cross any other threshold. // Doesn't cross any threshold, but changes below TOP_THRESHOLD_STATE should always // be processed callOnUidStatechanged(UID_A, TOP_THRESHOLD_STATE - 1, testProcStateSeq++, PROCESS_CAPABILITY_NONE); assertFalse(mService.mUidEventHandler.hasMessages(UID_MSG_STATE_CHANGED)); assertTrue(mService.mUidEventHandler.hasMessages(UID_MSG_STATE_CHANGED)); } waitForUidEventHandlerIdle(); } Loading Loading @@ -2349,21 +2350,21 @@ public class NetworkPolicyManagerServiceTest { int testProcStateSeq = 0; try (SyncBarrier b = new SyncBarrier(mService.mUidEventHandler)) { // First callback for uid. callOnUidStatechanged(UID_A, TOP_THRESHOLD_STATE, testProcStateSeq++, callOnUidStatechanged(UID_A, FOREGROUND_THRESHOLD_STATE, testProcStateSeq++, PROCESS_CAPABILITY_NONE); assertTrue(mService.mUidEventHandler.hasMessages(UID_MSG_STATE_CHANGED)); } waitForUidEventHandlerIdle(); try (SyncBarrier b = new SyncBarrier(mService.mUidEventHandler)) { // The same process-state with one network capability added. callOnUidStatechanged(UID_A, TOP_THRESHOLD_STATE, testProcStateSeq++, callOnUidStatechanged(UID_A, FOREGROUND_THRESHOLD_STATE, testProcStateSeq++, PROCESS_CAPABILITY_USER_RESTRICTED_NETWORK); assertTrue(mService.mUidEventHandler.hasMessages(UID_MSG_STATE_CHANGED)); } waitForUidEventHandlerIdle(); try (SyncBarrier b = new SyncBarrier(mService.mUidEventHandler)) { // The same process-state with another network capability added. callOnUidStatechanged(UID_A, TOP_THRESHOLD_STATE, testProcStateSeq++, callOnUidStatechanged(UID_A, FOREGROUND_THRESHOLD_STATE, testProcStateSeq++, PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK | PROCESS_CAPABILITY_USER_RESTRICTED_NETWORK); assertTrue(mService.mUidEventHandler.hasMessages(UID_MSG_STATE_CHANGED)); Loading @@ -2371,11 +2372,21 @@ public class NetworkPolicyManagerServiceTest { waitForUidEventHandlerIdle(); try (SyncBarrier b = new SyncBarrier(mService.mUidEventHandler)) { // The same process-state with all capabilities, but no change in network capabilities. callOnUidStatechanged(UID_A, TOP_THRESHOLD_STATE, testProcStateSeq++, callOnUidStatechanged(UID_A, FOREGROUND_THRESHOLD_STATE, testProcStateSeq++, PROCESS_CAPABILITY_ALL); assertFalse(mService.mUidEventHandler.hasMessages(UID_MSG_STATE_CHANGED)); } waitForUidEventHandlerIdle(); callAndWaitOnUidStateChanged(UID_A, TOP_THRESHOLD_STATE, testProcStateSeq++, PROCESS_CAPABILITY_ALL); try (SyncBarrier b = new SyncBarrier(mService.mUidEventHandler)) { // No change in capabilities, but TOP_THRESHOLD_STATE change should always be processed. callOnUidStatechanged(UID_A, TOP_THRESHOLD_STATE, testProcStateSeq++, PROCESS_CAPABILITY_ALL); assertTrue(mService.mUidEventHandler.hasMessages(UID_MSG_STATE_CHANGED)); } waitForUidEventHandlerIdle(); } @Test Loading Loading
services/core/java/com/android/server/am/ActivityManagerService.java +1 −1 Original line number Diff line number Diff line Loading @@ -19647,7 +19647,7 @@ public class ActivityManagerService extends IActivityManager.Stub record.procStateSeqWaitingForNetwork = 0; final long totalTime = SystemClock.uptimeMillis() - startTime; if (totalTime >= mConstants.mNetworkAccessTimeoutMs || DEBUG_NETWORK) { Slog.w(TAG_NETWORK, "Total time waited for network rules to get updated: " Slog.wtf(TAG_NETWORK, "Total time waited for network rules to get updated: " + totalTime + ". Uid: " + callingUid + " procStateSeq: " + procStateSeq + " UidRec: " + record + " validateUidRec: "
services/core/java/com/android/server/net/NetworkPolicyManagerService.java +13 −9 Original line number Diff line number Diff line Loading @@ -1214,16 +1214,14 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { return false; } final int previousProcState = previousInfo.procState; if (mBackgroundNetworkRestricted && (previousProcState >= BACKGROUND_THRESHOLD_STATE) != (newProcState >= BACKGROUND_THRESHOLD_STATE)) { // Proc-state change crossed BACKGROUND_THRESHOLD_STATE: Network rules for the // BACKGROUND chain may change. return true; } if ((previousProcState <= TOP_THRESHOLD_STATE) != (newProcState <= TOP_THRESHOLD_STATE)) { // Proc-state change crossed TOP_THRESHOLD_STATE: Network rules for the // LOW_POWER_STANDBY chain may change. || (newProcState <= TOP_THRESHOLD_STATE)) { // If the proc-state change crossed TOP_THRESHOLD_STATE, network rules for the // LOW_POWER_STANDBY chain may change, so we need to evaluate the transition. // In addition, we always process changes when the new process state is // TOP_THRESHOLD_STATE or below, to avoid situations where the TOP app ends up // waiting for NPMS to finish processing newProcStateSeq, even when it was // redundant (b/327303931). return true; } if ((previousProcState <= FOREGROUND_THRESHOLD_STATE) Loading @@ -1232,6 +1230,12 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { // different chains may change. return true; } if (mBackgroundNetworkRestricted && (previousProcState >= BACKGROUND_THRESHOLD_STATE) != (newProcState >= BACKGROUND_THRESHOLD_STATE)) { // Proc-state change crossed BACKGROUND_THRESHOLD_STATE: Network rules for the // BACKGROUND chain may change. return true; } final int networkCapabilities = PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK | PROCESS_CAPABILITY_USER_RESTRICTED_NETWORK; if ((previousInfo.capability & networkCapabilities) Loading
services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java +17 −6 Original line number Diff line number Diff line Loading @@ -2315,10 +2315,11 @@ public class NetworkPolicyManagerServiceTest { } waitForUidEventHandlerIdle(); try (SyncBarrier b = new SyncBarrier(mService.mUidEventHandler)) { // Doesn't cross any other threshold. // Doesn't cross any threshold, but changes below TOP_THRESHOLD_STATE should always // be processed callOnUidStatechanged(UID_A, TOP_THRESHOLD_STATE - 1, testProcStateSeq++, PROCESS_CAPABILITY_NONE); assertFalse(mService.mUidEventHandler.hasMessages(UID_MSG_STATE_CHANGED)); assertTrue(mService.mUidEventHandler.hasMessages(UID_MSG_STATE_CHANGED)); } waitForUidEventHandlerIdle(); } Loading Loading @@ -2349,21 +2350,21 @@ public class NetworkPolicyManagerServiceTest { int testProcStateSeq = 0; try (SyncBarrier b = new SyncBarrier(mService.mUidEventHandler)) { // First callback for uid. callOnUidStatechanged(UID_A, TOP_THRESHOLD_STATE, testProcStateSeq++, callOnUidStatechanged(UID_A, FOREGROUND_THRESHOLD_STATE, testProcStateSeq++, PROCESS_CAPABILITY_NONE); assertTrue(mService.mUidEventHandler.hasMessages(UID_MSG_STATE_CHANGED)); } waitForUidEventHandlerIdle(); try (SyncBarrier b = new SyncBarrier(mService.mUidEventHandler)) { // The same process-state with one network capability added. callOnUidStatechanged(UID_A, TOP_THRESHOLD_STATE, testProcStateSeq++, callOnUidStatechanged(UID_A, FOREGROUND_THRESHOLD_STATE, testProcStateSeq++, PROCESS_CAPABILITY_USER_RESTRICTED_NETWORK); assertTrue(mService.mUidEventHandler.hasMessages(UID_MSG_STATE_CHANGED)); } waitForUidEventHandlerIdle(); try (SyncBarrier b = new SyncBarrier(mService.mUidEventHandler)) { // The same process-state with another network capability added. callOnUidStatechanged(UID_A, TOP_THRESHOLD_STATE, testProcStateSeq++, callOnUidStatechanged(UID_A, FOREGROUND_THRESHOLD_STATE, testProcStateSeq++, PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK | PROCESS_CAPABILITY_USER_RESTRICTED_NETWORK); assertTrue(mService.mUidEventHandler.hasMessages(UID_MSG_STATE_CHANGED)); Loading @@ -2371,11 +2372,21 @@ public class NetworkPolicyManagerServiceTest { waitForUidEventHandlerIdle(); try (SyncBarrier b = new SyncBarrier(mService.mUidEventHandler)) { // The same process-state with all capabilities, but no change in network capabilities. callOnUidStatechanged(UID_A, TOP_THRESHOLD_STATE, testProcStateSeq++, callOnUidStatechanged(UID_A, FOREGROUND_THRESHOLD_STATE, testProcStateSeq++, PROCESS_CAPABILITY_ALL); assertFalse(mService.mUidEventHandler.hasMessages(UID_MSG_STATE_CHANGED)); } waitForUidEventHandlerIdle(); callAndWaitOnUidStateChanged(UID_A, TOP_THRESHOLD_STATE, testProcStateSeq++, PROCESS_CAPABILITY_ALL); try (SyncBarrier b = new SyncBarrier(mService.mUidEventHandler)) { // No change in capabilities, but TOP_THRESHOLD_STATE change should always be processed. callOnUidStatechanged(UID_A, TOP_THRESHOLD_STATE, testProcStateSeq++, PROCESS_CAPABILITY_ALL); assertTrue(mService.mUidEventHandler.hasMessages(UID_MSG_STATE_CHANGED)); } waitForUidEventHandlerIdle(); } @Test Loading