From 944a261a0fa54d28143d2243a2b6d50e68007e1f Mon Sep 17 00:00:00 2001 From: Kweku Adams Date: Fri, 10 Feb 2023 18:37:18 +0000 Subject: [PATCH] Use updated process capability name. Use PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK instead of PROCESS_CAPABILITY_NETWORK so that we can eventually remove the latter. Also make NetworkPolicyManager the source of truth for what network process capabilities are granted based on the process state. Bug: 135214188 Bug: 261999509 Test: atest CtsAppTestCases:ActivityManagerApi29Test Test: atest CtsAppTestCases:ActivityManagerFgsBgStartTest Test: atest CtsAppTestCases:ActivityManagerProcessStateTest Test: atest CtsAppTestCases:ActivityManagerTest Test: atest FrameworksServicesTests:ActivityManagerServiceTest Test: atest FrameworksServicesTests:UidObserverControllerTests Change-Id: I4bfd55aab200acba9e8911bb9d972cfad1ab7e25 --- core/java/android/app/ActivityManager.java | 8 ++--- core/java/android/content/Context.java | 2 +- .../android/net/NetworkPolicyManager.java | 28 +++++++++++++++-- .../am/ActivityManagerShellCommand.java | 4 +-- .../com/android/server/am/OomAdjuster.java | 30 ++++++++++++------- .../server/am/ActivityManagerServiceTest.java | 2 +- .../server/am/UidObserverControllerTest.java | 6 ++-- 7 files changed, 55 insertions(+), 25 deletions(-) diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index ba36d937edc38..87fe215edd852 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -630,7 +630,7 @@ public class ActivityManager { PROCESS_CAPABILITY_FOREGROUND_LOCATION, PROCESS_CAPABILITY_FOREGROUND_CAMERA, PROCESS_CAPABILITY_FOREGROUND_MICROPHONE, - PROCESS_CAPABILITY_NETWORK, + PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK, PROCESS_CAPABILITY_BFSL, }) @Retention(RetentionPolicy.SOURCE) @@ -791,7 +791,7 @@ public class ActivityManager { public static final int PROCESS_CAPABILITY_ALL = PROCESS_CAPABILITY_FOREGROUND_LOCATION | PROCESS_CAPABILITY_FOREGROUND_CAMERA | PROCESS_CAPABILITY_FOREGROUND_MICROPHONE - | PROCESS_CAPABILITY_NETWORK + | PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK | PROCESS_CAPABILITY_BFSL; /** @@ -810,7 +810,7 @@ public class ActivityManager { pw.print((caps & PROCESS_CAPABILITY_FOREGROUND_LOCATION) != 0 ? 'L' : '-'); pw.print((caps & PROCESS_CAPABILITY_FOREGROUND_CAMERA) != 0 ? 'C' : '-'); pw.print((caps & PROCESS_CAPABILITY_FOREGROUND_MICROPHONE) != 0 ? 'M' : '-'); - pw.print((caps & PROCESS_CAPABILITY_NETWORK) != 0 ? 'N' : '-'); + pw.print((caps & PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK) != 0 ? 'N' : '-'); pw.print((caps & PROCESS_CAPABILITY_BFSL) != 0 ? 'F' : '-'); } @@ -819,7 +819,7 @@ public class ActivityManager { sb.append((caps & PROCESS_CAPABILITY_FOREGROUND_LOCATION) != 0 ? 'L' : '-'); sb.append((caps & PROCESS_CAPABILITY_FOREGROUND_CAMERA) != 0 ? 'C' : '-'); sb.append((caps & PROCESS_CAPABILITY_FOREGROUND_MICROPHONE) != 0 ? 'M' : '-'); - sb.append((caps & PROCESS_CAPABILITY_NETWORK) != 0 ? 'N' : '-'); + sb.append((caps & PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK) != 0 ? 'N' : '-'); sb.append((caps & PROCESS_CAPABILITY_BFSL) != 0 ? 'F' : '-'); } diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index bebb899cc8c9e..a00b35b97197a 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -528,7 +528,7 @@ public abstract class Context { /** * Flag for {@link #bindService}: allow the process hosting the target service to gain - * {@link ActivityManager#PROCESS_CAPABILITY_NETWORK}, which allows it be able + * {@link ActivityManager#PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK}, which allows it be able * to access network regardless of any power saving restrictions. * * @hide diff --git a/core/java/android/net/NetworkPolicyManager.java b/core/java/android/net/NetworkPolicyManager.java index 9341105675a2e..104a8b2095d85 100644 --- a/core/java/android/net/NetworkPolicyManager.java +++ b/core/java/android/net/NetworkPolicyManager.java @@ -475,8 +475,8 @@ public class NetworkPolicyManager { * * @param uid The UID whose status needs to be checked. * @return {@link ConnectivityManager#RESTRICT_BACKGROUND_STATUS_DISABLED}, - * {@link ConnectivityManager##RESTRICT_BACKGROUND_STATUS_ENABLED}, - * or {@link ConnectivityManager##RESTRICT_BACKGROUND_STATUS_WHITELISTED} to denote + * {@link ConnectivityManager#RESTRICT_BACKGROUND_STATUS_ENABLED}, + * or {@link ConnectivityManager#RESTRICT_BACKGROUND_STATUS_WHITELISTED} to denote * the current status of the UID. * @hide */ @@ -768,6 +768,28 @@ public class NetworkPolicyManager { return string.toString(); } + /** + * Returns the default network capabilities + * ({@link ActivityManager#PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK + * ActivityManager.PROCESS_CAPABILITY_*}) of the specified process state. + * This DOES NOT return all default process capabilities for a proc state. + * @hide + */ + public static int getDefaultProcessNetworkCapabilities(int procState) { + switch (procState) { + case ActivityManager.PROCESS_STATE_PERSISTENT: + case ActivityManager.PROCESS_STATE_PERSISTENT_UI: + case ActivityManager.PROCESS_STATE_TOP: + return ActivityManager.PROCESS_CAPABILITY_ALL; + case ActivityManager.PROCESS_STATE_BOUND_TOP: + case ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE: + case ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE: + return ActivityManager.PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK; + default: + return ActivityManager.PROCESS_CAPABILITY_NONE; + } + } + /** * Returns true if {@param procState} is considered foreground and as such will be allowed * to access network when the device is idle or in battery saver mode. Otherwise, false. @@ -784,7 +806,7 @@ public class NetworkPolicyManager { public static boolean isProcStateAllowedWhileIdleOrPowerSaveMode( int procState, @ProcessCapability int capability) { return procState <= FOREGROUND_THRESHOLD_STATE - || (capability & ActivityManager.PROCESS_CAPABILITY_NETWORK) != 0; + || (capability & ActivityManager.PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK) != 0; } /** @hide */ diff --git a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java index 72d6ca9fd7619..25cbb7e1c7c56 100644 --- a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java +++ b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java @@ -19,7 +19,7 @@ package com.android.server.am; import static android.app.ActivityManager.PROCESS_CAPABILITY_FOREGROUND_CAMERA; import static android.app.ActivityManager.PROCESS_CAPABILITY_FOREGROUND_LOCATION; import static android.app.ActivityManager.PROCESS_CAPABILITY_FOREGROUND_MICROPHONE; -import static android.app.ActivityManager.PROCESS_CAPABILITY_NETWORK; +import static android.app.ActivityManager.PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK; import static android.app.ActivityManagerInternal.ALLOW_NON_FULL; import static android.app.ActivityTaskManager.INVALID_TASK_ID; import static android.app.ActivityTaskManager.RESIZE_MODE_SYSTEM; @@ -2009,7 +2009,7 @@ final class ActivityManagerShellCommand extends ShellCommand { int mask = PROCESS_CAPABILITY_FOREGROUND_LOCATION | PROCESS_CAPABILITY_FOREGROUND_CAMERA | PROCESS_CAPABILITY_FOREGROUND_MICROPHONE - | PROCESS_CAPABILITY_NETWORK; + | PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK; while ((opt=getNextOption()) != null) { if (opt.equals("--oom")) { diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java index 0c366268604de..ceedf70680454 100644 --- a/services/core/java/com/android/server/am/OomAdjuster.java +++ b/services/core/java/com/android/server/am/OomAdjuster.java @@ -22,8 +22,8 @@ import static android.app.ActivityManager.PROCESS_CAPABILITY_BFSL; import static android.app.ActivityManager.PROCESS_CAPABILITY_FOREGROUND_CAMERA; import static android.app.ActivityManager.PROCESS_CAPABILITY_FOREGROUND_LOCATION; import static android.app.ActivityManager.PROCESS_CAPABILITY_FOREGROUND_MICROPHONE; -import static android.app.ActivityManager.PROCESS_CAPABILITY_NETWORK; import static android.app.ActivityManager.PROCESS_CAPABILITY_NONE; +import static android.app.ActivityManager.PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK; import static android.app.ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE; import static android.app.ActivityManager.PROCESS_STATE_BOUND_TOP; import static android.app.ActivityManager.PROCESS_STATE_CACHED_ACTIVITY; @@ -117,6 +117,7 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.pm.ApplicationInfo; import android.content.pm.ServiceInfo; +import android.net.NetworkPolicyManager; import android.os.Handler; import android.os.IBinder; import android.os.PowerManagerInternal; @@ -2276,14 +2277,15 @@ public class OomAdjuster { // elevated to a high enough procstate anyway to get network unless they // request otherwise, so don't propagate the network capability by default // in this case unless they explicitly request it. - if ((cstate.getCurCapability() & PROCESS_CAPABILITY_NETWORK) != 0) { + if ((cstate.getCurCapability() + & PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK) != 0) { if (clientProcState <= PROCESS_STATE_BOUND_FOREGROUND_SERVICE) { // This is used to grant network access to Expedited Jobs. if (cr.hasFlag(Context.BIND_BYPASS_POWER_NETWORK_RESTRICTIONS)) { - capability |= PROCESS_CAPABILITY_NETWORK; + capability |= PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK; } } else { - capability |= PROCESS_CAPABILITY_NETWORK; + capability |= PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK; } } @@ -2794,27 +2796,33 @@ public class OomAdjuster { } private int getDefaultCapability(ProcessRecord app, int procState) { + final int networkCapabilities = + NetworkPolicyManager.getDefaultProcessNetworkCapabilities(procState); + final int baseCapabilities; switch (procState) { case PROCESS_STATE_PERSISTENT: case PROCESS_STATE_PERSISTENT_UI: case PROCESS_STATE_TOP: - return PROCESS_CAPABILITY_ALL; // BFSL allowed + baseCapabilities = PROCESS_CAPABILITY_ALL; // BFSL allowed + break; case PROCESS_STATE_BOUND_TOP: - return PROCESS_CAPABILITY_NETWORK | PROCESS_CAPABILITY_BFSL; + baseCapabilities = PROCESS_CAPABILITY_BFSL; + break; case PROCESS_STATE_FOREGROUND_SERVICE: if (app.getActiveInstrumentation() != null) { - return PROCESS_CAPABILITY_ALL_IMPLICIT | PROCESS_CAPABILITY_NETWORK ; + baseCapabilities = PROCESS_CAPABILITY_ALL_IMPLICIT; } else { // Capability from foreground service is conditional depending on // foregroundServiceType in the manifest file and the // mAllowWhileInUsePermissionInFgs flag. - return PROCESS_CAPABILITY_NETWORK; + baseCapabilities = PROCESS_CAPABILITY_NONE; } - case PROCESS_STATE_BOUND_FOREGROUND_SERVICE: - return PROCESS_CAPABILITY_NETWORK; + break; default: - return PROCESS_CAPABILITY_NONE; + baseCapabilities = PROCESS_CAPABILITY_NONE; + break; } + return baseCapabilities | networkCapabilities; } /** diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java index 93dfee6f2da44..8c7b0c5a569a2 100644 --- a/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java @@ -528,7 +528,7 @@ public class ActivityManagerServiceTest { ActivityManager.PROCESS_CAPABILITY_NONE, ActivityManager.PROCESS_CAPABILITY_NONE, ActivityManager.PROCESS_CAPABILITY_NONE, - ActivityManager.PROCESS_CAPABILITY_NETWORK, + ActivityManager.PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK, }; final Map changeItems = new HashMap<>(); for (int i = 0; i < changesForPendingUidRecords.length; ++i) { diff --git a/services/tests/servicestests/src/com/android/server/am/UidObserverControllerTest.java b/services/tests/servicestests/src/com/android/server/am/UidObserverControllerTest.java index 8a3f246fd6567..f788c92b24b2d 100644 --- a/services/tests/servicestests/src/com/android/server/am/UidObserverControllerTest.java +++ b/services/tests/servicestests/src/com/android/server/am/UidObserverControllerTest.java @@ -18,8 +18,8 @@ package com.android.server.am; import static android.app.ActivityManager.PROCESS_CAPABILITY_ALL; import static android.app.ActivityManager.PROCESS_CAPABILITY_FOREGROUND_LOCATION; -import static android.app.ActivityManager.PROCESS_CAPABILITY_NETWORK; import static android.app.ActivityManager.PROCESS_CAPABILITY_NONE; +import static android.app.ActivityManager.PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK; import static android.app.ActivityManager.PROCESS_STATE_CACHED_RECENT; import static android.app.ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE; import static android.app.ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND; @@ -185,10 +185,10 @@ public class UidObserverControllerTest { verifyNoMoreInteractions(observer2); addPendingChange(TEST_UID1, UidRecord.CHANGE_PROCSTATE | UidRecord.CHANGE_CAPABILITY, - PROCESS_STATE_RECEIVER, 111, PROCESS_CAPABILITY_NETWORK, false); + PROCESS_STATE_RECEIVER, 111, PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK, false); mUidObserverController.dispatchUidsChanged(); verify(observer2).onUidStateChanged(TEST_UID1, PROCESS_STATE_RECEIVER, - 111, PROCESS_CAPABILITY_NETWORK); + 111, PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK); verifyNoMoreInteractions(observer1); verifyNoMoreInteractions(observer2);