diff options
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); |