diff options
| author | 2022-03-30 12:28:28 -0700 | |
|---|---|---|
| committer | 2022-04-15 09:39:39 +0000 | |
| commit | 3d9f5e63c1d2fec02cabe7aa27ad0dd2c0747637 (patch) | |
| tree | 82c2bf74e6a97b51a649720509ebdd269e863911 | |
| parent | 28d4a8f2aff809d910ece4aaccbe80bacf08dd52 (diff) | |
Inform NPMS about the app coming to the TOP state early.
It's possible for an app to come to the TOP state before
the oomAdj computation is done and we cannot wait for
oomAdj computation to complete and then inform NPMS about
the state change. So, inform NPMS early about the state
change when we know the app is going to the TOP state.
Bug: 226299593
Test: atest tests/cts/hostside/src/com/android/cts/net/HostsideRestrictBackgroundNetworkTests.java
Change-Id: I5d582618652cead179c419f7fe084283dd89d514
Merged-In: I5d582618652cead179c419f7fe084283dd89d514
5 files changed, 42 insertions, 5 deletions
diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java index 4c30f56e40d6..ca7e704f1c1e 100644 --- a/core/java/android/app/ActivityManagerInternal.java +++ b/core/java/android/app/ActivityManagerInternal.java @@ -680,4 +680,15 @@ public abstract class ActivityManagerInternal { */ void notifyActivityEventChanged(); } + + /** + * Register the UidObserver for NetworkPolicyManager service. + * + * This is equivalent to calling + * {@link IActivityManager#registerUidObserver(IUidObserver, int, int, String)} but having a + * separate method for NetworkPolicyManager service so that it's UidObserver can be called + * separately outside the usual UidObserver flow. + */ + public abstract void registerNetworkPolicyUidObserver(@NonNull IUidObserver observer, + int which, int cutpoint, @NonNull String callingPackage); } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 0f450e16be2d..3cbe4e3e9f68 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -28,6 +28,7 @@ import static android.app.ActivityManager.INSTR_FLAG_DISABLE_ISOLATED_STORAGE; import static android.app.ActivityManager.INSTR_FLAG_DISABLE_TEST_API_CHECKS; import static android.app.ActivityManager.INSTR_FLAG_NO_RESTART; import static android.app.ActivityManager.INTENT_SENDER_ACTIVITY; +import static android.app.ActivityManager.PROCESS_CAPABILITY_ALL; import static android.app.ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND; import static android.app.ActivityManager.PROCESS_STATE_NONEXISTENT; import static android.app.ActivityManager.PROCESS_STATE_TOP; @@ -1415,6 +1416,7 @@ public class ActivityManagerService extends IActivityManager.Stub final ActivityThread mSystemThread; final UidObserverController mUidObserverController; + private volatile IUidObserver mNetworkPolicyUidObserver; private final class AppDeathRecipient implements IBinder.DeathRecipient { final ProcessRecord mApp; @@ -16303,6 +16305,19 @@ public class ActivityManagerService extends IActivityManager.Stub @Override public void addPendingTopUid(int uid, int pid) { mPendingStartActivityUids.add(uid, pid); + // We need to update the network rules for the app coming to the top state so that + // it can access network when the device or the app is in a restricted state + // (e.g. battery/data saver) but since waiting for updateOomAdj to complete and then + // informing NetworkPolicyManager might get delayed, informing the state change as soon + // as we know app is going to come to the top state. + if (mNetworkPolicyUidObserver != null) { + try { + mNetworkPolicyUidObserver.onUidStateChanged(uid, PROCESS_STATE_TOP, + mProcessList.getProcStateSeqCounter(), PROCESS_CAPABILITY_ALL); + } catch (RemoteException e) { + // Should not happen; call is within the same process + } + } } @Override @@ -16449,6 +16464,14 @@ public class ActivityManagerService extends IActivityManager.Stub public void setStopUserOnSwitch(int value) { ActivityManagerService.this.setStopUserOnSwitch(value); } + + @Override + public void registerNetworkPolicyUidObserver(@NonNull IUidObserver observer, + int which, int cutpoint, @NonNull String callingPackage) { + mNetworkPolicyUidObserver = observer; + mUidObserverController.register(observer, which, cutpoint, callingPackage, + Binder.getCallingUid()); + } } long inputDispatchingTimedOut(int pid, final boolean aboveSystem, String reason) { diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java index 1e66ed42ff96..0f645ebc689b 100644 --- a/services/core/java/com/android/server/am/ProcessList.java +++ b/services/core/java/com/android/server/am/ProcessList.java @@ -482,9 +482,8 @@ public final class ProcessList { * Having a global counter ensures that seq numbers are monotonically increasing for a * particular uid even when the uidRecord is re-created. */ - @GuardedBy("mService") @VisibleForTesting - long mProcStateSeqCounter = 0; + volatile long mProcStateSeqCounter = 0; /** * A global counter for generating sequence numbers to uniquely identify pending process starts. @@ -4956,6 +4955,10 @@ public final class ProcessList { } } + long getProcStateSeqCounter() { + return mProcStateSeqCounter; + } + /** * Create a server socket in system_server, zygote will connect to it * in order to send unsolicited messages to system_server. diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java index 29fd186c7cb8..c804c9b234e3 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java @@ -1007,7 +1007,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { final int changes = ActivityManager.UID_OBSERVER_PROCSTATE | ActivityManager.UID_OBSERVER_GONE | ActivityManager.UID_OBSERVER_CAPABILITY; - mActivityManager.registerUidObserver(mUidObserver, changes, + mActivityManagerInternal.registerNetworkPolicyUidObserver(mUidObserver, changes, NetworkPolicyManager.FOREGROUND_THRESHOLD_STATE, "android"); mNetworkManager.registerObserver(mAlertObserver); } catch (RemoteException e) { diff --git a/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java index 7634b09b4dc6..6c7f87244cfe 100644 --- a/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java @@ -441,14 +441,14 @@ public class NetworkPolicyManagerServiceTest { setNetpolicyXml(context); doAnswer(new Answer<Void>() { - @Override public Void answer(InvocationOnMock invocation) throws Throwable { mUidObserver = (IUidObserver) invocation.getArguments()[0]; Log.d(TAG, "set mUidObserver to " + mUidObserver); return null; } - }).when(mActivityManager).registerUidObserver(any(), anyInt(), anyInt(), any(String.class)); + }).when(mActivityManagerInternal).registerNetworkPolicyUidObserver(any(), + anyInt(), anyInt(), any(String.class)); mFutureIntent = newRestrictBackgroundChangedFuture(); mDeps = new TestDependencies(mServiceContext); |