summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Sudheer Shanka <sudheersai@google.com> 2022-04-17 21:26:43 +0000
committer Sudheer Shanka <sudheersai@google.com> 2022-04-17 21:26:43 +0000
commitac43093bb0429e91b4290a3bea000ac0b3e7c4ed (patch)
treedb7dcf6bfe54d322cc0f465dbd4bccd04748e095
parent525fad6cb2e0946132ae4ab352284f85f3bf08bd (diff)
Don't hardcode the blocked reasons in AMS.
The blocked reasons that take into procstate of the uid could change and shouldn't be hardcoded in AMS. Bug: 226299593 Test: atest tests/cts/hostside/src/com/android/cts/net/HostsideRestrictBackgroundNetworkTests.java Change-Id: I995f7c6e4391f0aa72f6ea58057cf56ef80be708
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java32
-rw-r--r--services/core/java/com/android/server/net/NetworkPolicyManagerInternal.java10
-rw-r--r--services/core/java/com/android/server/net/NetworkPolicyManagerService.java11
3 files changed, 28 insertions, 25 deletions
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 7cee203d0bf0..9a72de0c62b3 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -49,12 +49,6 @@ 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_METERED_REASON_DATA_SAVER;
-import static android.net.ConnectivityManager.BLOCKED_METERED_REASON_USER_RESTRICTED;
-import static android.net.ConnectivityManager.BLOCKED_REASON_APP_STANDBY;
-import static android.net.ConnectivityManager.BLOCKED_REASON_BATTERY_SAVER;
-import static android.net.ConnectivityManager.BLOCKED_REASON_DOZE;
-import static android.net.ConnectivityManager.BLOCKED_REASON_LOW_POWER_STANDBY;
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;
@@ -136,6 +130,7 @@ import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.am.MemoryStatUtil.hasMemcg;
import static com.android.server.am.ProcessList.ProcStartHandler;
+import static com.android.server.net.NetworkPolicyManagerInternal.updateBlockedReasonsWithProcState;
import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME;
import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_CLEANUP;
import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_SWITCH;
@@ -17296,7 +17291,7 @@ public class ActivityManagerService extends IActivityManager.Stub
final long procStateSeq = mProcessList.getNextProcStateSeq();
mNetworkPolicyUidObserver.onUidStateChanged(uid, PROCESS_STATE_TOP,
procStateSeq, PROCESS_CAPABILITY_ALL);
- if (thread != null && isNetworkingBlockedForUid(uid)) {
+ if (thread != null && shouldWaitForNetworkRulesUpdate(uid)) {
thread.setNetworkBlockSeq(procStateSeq);
}
} catch (RemoteException e) {
@@ -17305,29 +17300,18 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
- private boolean isNetworkingBlockedForUid(int uid) {
+ private boolean shouldWaitForNetworkRulesUpdate(int uid) {
synchronized (mUidNetworkBlockedReasons) {
- // TODO: We can consider only those blocked reasons that will be overridden
- // by the TOP state. For other ones, there is no point in waiting.
// TODO: We can reuse this data in
// ProcessList#incrementProcStateSeqAndNotifyAppsLOSP instead of calling into
// NetworkManagementService.
final int uidBlockedReasons = mUidNetworkBlockedReasons.get(
uid, BLOCKED_REASON_NONE);
- if (uidBlockedReasons == BLOCKED_REASON_NONE) {
- return false;
- }
- final int topExemptedBlockedReasons = BLOCKED_REASON_BATTERY_SAVER
- | BLOCKED_REASON_DOZE
- | BLOCKED_REASON_APP_STANDBY
- | BLOCKED_REASON_LOW_POWER_STANDBY
- | BLOCKED_METERED_REASON_DATA_SAVER
- | BLOCKED_METERED_REASON_USER_RESTRICTED;
- final int effectiveBlockedReasons =
- uidBlockedReasons & ~topExemptedBlockedReasons;
- // Only consider it as blocked if it is not blocked by a reason
- // that is not exempted by app being in the top state.
- return effectiveBlockedReasons == BLOCKED_REASON_NONE;
+ // We should only inform the uid to block if it is currently blocked but will be
+ // unblocked once it comes to the TOP state.
+ return uidBlockedReasons != BLOCKED_REASON_NONE
+ && updateBlockedReasonsWithProcState(uidBlockedReasons, PROCESS_STATE_TOP)
+ == BLOCKED_REASON_NONE;
}
}
diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerInternal.java b/services/core/java/com/android/server/net/NetworkPolicyManagerInternal.java
index 3cb587812c2a..9a62060e544a 100644
--- a/services/core/java/com/android/server/net/NetworkPolicyManagerInternal.java
+++ b/services/core/java/com/android/server/net/NetworkPolicyManagerInternal.java
@@ -16,6 +16,9 @@
package com.android.server.net;
+import static com.android.server.net.NetworkPolicyManagerService.UidBlockedState.getAllowedReasonsForProcState;
+import static com.android.server.net.NetworkPolicyManagerService.UidBlockedState.getEffectiveBlockedReasons;
+
import android.annotation.Nullable;
import android.net.Network;
import android.os.PowerExemptionManager.ReasonCode;
@@ -84,7 +87,6 @@ public abstract class NetworkPolicyManagerInternal {
public abstract void setMeteredRestrictedPackages(
Set<String> packageNames, int userId);
-
/**
* Similar to {@link #setMeteredRestrictedPackages(Set, int)} but updates the restricted
* packages list asynchronously.
@@ -97,4 +99,10 @@ public abstract class NetworkPolicyManagerInternal {
/** Informs that the Low Power Standby allowlist has changed */
public abstract void setLowPowerStandbyAllowlist(int[] uids);
+
+ /** Update the {@code blockedReasons} taking into account the {@code procState} of the uid */
+ public static int updateBlockedReasonsWithProcState(int blockedReasons, int procState) {
+ final int allowedReasons = getAllowedReasonsForProcState(procState);
+ return getEffectiveBlockedReasons(blockedReasons, allowedReasons);
+ }
}
diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
index 001f9563ddc5..549b566eeac2 100644
--- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
+++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
@@ -6315,6 +6315,17 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
return effectiveBlockedReasons;
}
+ static int getAllowedReasonsForProcState(int procState) {
+ if (procState > NetworkPolicyManager.FOREGROUND_THRESHOLD_STATE) {
+ return ALLOWED_REASON_NONE;
+ } else if (procState <= NetworkPolicyManager.TOP_THRESHOLD_STATE) {
+ return ALLOWED_REASON_TOP | ALLOWED_REASON_FOREGROUND
+ | ALLOWED_METERED_REASON_FOREGROUND;
+ } else {
+ return ALLOWED_REASON_FOREGROUND | ALLOWED_METERED_REASON_FOREGROUND;
+ }
+ }
+
@Override
public String toString() {
return toString(blockedReasons, allowedReasons, effectiveBlockedReasons);