From eb5e04aeca105072a3ffb3ff876e3ef57c979066 Mon Sep 17 00:00:00 2001 From: Sudheer Shanka Date: Tue, 5 Apr 2022 07:59:11 +0000 Subject: [PATCH] Inform AMS about the uid blocked reasons. This will be used to let the application thread know whether or not to block for network rules to be updated when coming to the foreground. Bug: 226299593 Test: atest tests/cts/hostside/src/com/android/cts/net/HostsideRestrictBackgroundNetworkTests.java Change-Id: I9bff481a0026fb57af8dbee580e617c8410f9ebe Merged-In: I9bff481a0026fb57af8dbee580e617c8410f9ebe --- .../android/app/ActivityManagerInternal.java | 6 ++++++ .../server/am/ActivityManagerService.java | 15 +++++++++++++++ .../net/NetworkPolicyManagerService.java | 18 ++++++++++++++---- 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java index ca7e704f1c1e4..45ed6f2730681 100644 --- a/core/java/android/app/ActivityManagerInternal.java +++ b/core/java/android/app/ActivityManagerInternal.java @@ -208,6 +208,12 @@ public abstract class ActivityManagerInternal { */ public abstract void notifyNetworkPolicyRulesUpdated(int uid, long procStateSeq); + /** + * Inform ActivityManagerService about the latest {@code blockedReasons} for an uid, which + * can be used to understand whether the {@code uid} is allowed to access network or not. + */ + public abstract void onUidBlockedReasonsChanged(int uid, int blockedReasons); + /** * @return true if runtime was restarted, false if it's normal boot */ diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index cafda0e2599ed..59dbe6c27bdbf 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -46,6 +46,7 @@ import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_UNAWARE; import static android.content.pm.PackageManager.MATCH_SYSTEM_ONLY; import static android.content.pm.PackageManager.MATCH_UNINSTALLED_PACKAGES; import static android.content.pm.PackageManager.PERMISSION_GRANTED; +import static android.net.ConnectivityManager.BLOCKED_REASON_NONE; import static android.os.FactoryTest.FACTORY_TEST_OFF; import static android.os.IServiceManager.DUMP_FLAG_PRIORITY_CRITICAL; import static android.os.IServiceManager.DUMP_FLAG_PRIORITY_HIGH; @@ -1418,6 +1419,9 @@ public class ActivityManagerService extends IActivityManager.Stub final UidObserverController mUidObserverController; private volatile IUidObserver mNetworkPolicyUidObserver; + @GuardedBy("mUidNetworkBlockedReasons") + private final SparseIntArray mUidNetworkBlockedReasons = new SparseIntArray(); + private final class AppDeathRecipient implements IBinder.DeathRecipient { final ProcessRecord mApp; final int mPid; @@ -15599,6 +15603,17 @@ public class ActivityManagerService extends IActivityManager.Stub } } + @Override + public void onUidBlockedReasonsChanged(int uid, int blockedReasons) { + synchronized (mUidNetworkBlockedReasons) { + if (blockedReasons == BLOCKED_REASON_NONE) { + mUidNetworkBlockedReasons.delete(uid); + } else { + mUidNetworkBlockedReasons.put(uid, blockedReasons); + } + } + } + @Override public boolean isRuntimeRestarted() { return mSystemServiceManager.isRuntimeRestarted(); diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java index 66db72117585b..0c47efe57563f 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java @@ -926,6 +926,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { mUsageStats = LocalServices.getService(UsageStatsManagerInternal.class); mAppStandby = LocalServices.getService(AppStandbyInternal.class); + mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class); synchronized (mUidRulesFirstLock) { synchronized (mNetworkPoliciesSecondLock) { @@ -1003,7 +1004,6 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } } - mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class); try { final int changes = ActivityManager.UID_OBSERVER_PROCSTATE | ActivityManager.UID_OBSERVER_GONE @@ -4239,7 +4239,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { : uidBlockedState.deriveUidRules(); } if (oldEffectiveBlockedReasons != newEffectiveBlockedReasons) { - postBlockedReasonsChangedMsg(uid, + handleBlockedReasonsChanged(uid, newEffectiveBlockedReasons, oldEffectiveBlockedReasons); postUidRulesChangedMsg(uid, uidRules); @@ -4601,6 +4601,9 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { someArgs.argi2 = uidBlockedState.effectiveBlockedReasons; someArgs.argi3 = uidBlockedState.deriveUidRules(); uidStateUpdates.append(uid, someArgs); + // TODO: Update the state for all changed uids together. + mActivityManagerInternal.onUidBlockedReasonsChanged(uid, + uidBlockedState.effectiveBlockedReasons); } } } @@ -4824,6 +4827,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { mUidBlockedState.delete(uid); } mUidState.delete(uid); + mActivityManagerInternal.onUidBlockedReasonsChanged(uid, BLOCKED_REASON_NONE); mUidPolicy.delete(uid); mUidFirewallStandbyRules.delete(uid); mUidFirewallDozableRules.delete(uid); @@ -4986,7 +4990,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } } if (oldEffectiveBlockedReasons != newEffectiveBlockedReasons) { - postBlockedReasonsChangedMsg(uid, + handleBlockedReasonsChanged(uid, newEffectiveBlockedReasons, oldEffectiveBlockedReasons); postUidRulesChangedMsg(uid, uidRules); @@ -5129,7 +5133,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { : uidBlockedState.deriveUidRules(); } if (oldEffectiveBlockedReasons != newEffectiveBlockedReasons) { - postBlockedReasonsChangedMsg(uid, + handleBlockedReasonsChanged(uid, newEffectiveBlockedReasons, oldEffectiveBlockedReasons); @@ -5162,6 +5166,12 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } } + private void handleBlockedReasonsChanged(int uid, int newEffectiveBlockedReasons, + int oldEffectiveBlockedReasons) { + mActivityManagerInternal.onUidBlockedReasonsChanged(uid, newEffectiveBlockedReasons); + postBlockedReasonsChangedMsg(uid, newEffectiveBlockedReasons, oldEffectiveBlockedReasons); + } + private void postBlockedReasonsChangedMsg(int uid, int newEffectiveBlockedReasons, int oldEffectiveBlockedReasons) { mHandler.obtainMessage(MSG_UID_BLOCKED_REASON_CHANGED, uid,