diff options
| -rw-r--r-- | services/core/java/com/android/server/am/OomAdjuster.java | 40 | ||||
| -rw-r--r-- | services/core/java/com/android/server/appop/AppOpsService.java | 36 |
2 files changed, 48 insertions, 28 deletions
diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java index 423dd528f5c1..e7b467adf487 100644 --- a/services/core/java/com/android/server/am/OomAdjuster.java +++ b/services/core/java/com/android/server/am/OomAdjuster.java @@ -33,6 +33,8 @@ import static android.app.ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND; import static android.app.ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND; import static android.app.ActivityManager.PROCESS_STATE_LAST_ACTIVITY; import static android.app.ActivityManager.PROCESS_STATE_NONEXISTENT; +import static android.app.ActivityManager.PROCESS_STATE_PERSISTENT; +import static android.app.ActivityManager.PROCESS_STATE_PERSISTENT_UI; import static android.app.ActivityManager.PROCESS_STATE_SERVICE; import static android.app.ActivityManager.PROCESS_STATE_TOP; import static android.app.ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND; @@ -1697,13 +1699,13 @@ public final class OomAdjuster { if (enabled) { if (cr.hasFlag(Context.BIND_INCLUDE_CAPABILITIES)) { // TOP process passes all capabilities to the service. - capability = PROCESS_CAPABILITY_ALL; + capability |= PROCESS_CAPABILITY_ALL; } else { // TOP process passes no capability to the service. } } else { // TOP process passes all capabilities to the service. - capability = PROCESS_CAPABILITY_ALL; + capability |= PROCESS_CAPABILITY_ALL; } } else if (clientProcState <= PROCESS_STATE_FOREGROUND_SERVICE) { @@ -2004,17 +2006,9 @@ public final class OomAdjuster { // apply capability from FGS. if (app.hasForegroundServices()) { capability |= capabilityFromFGS; - } else if (!ActivityManager.isProcStateBackground(procState)) { - // procState higher than PROCESS_STATE_BOUND_FOREGROUND_SERVICE implicitly has - // camera/microphone capability - //TODO: remove this line when enforcing the feature. - capability |= PROCESS_CAPABILITY_ALL_IMPLICIT; } - // TOP process has all capabilities. - if (procState <= PROCESS_STATE_TOP) { - capability = PROCESS_CAPABILITY_ALL; - } + capability |= getDefaultCapability(app, procState); // Do final modification to adj. Everything we do between here and applying // the final setAdj must be done in this function, because we will also use @@ -2034,6 +2028,30 @@ public final class OomAdjuster { || app.curCapability != prevCapability ; } + private int getDefaultCapability(ProcessRecord app, int procState) { + switch (procState) { + case PROCESS_STATE_PERSISTENT: + case PROCESS_STATE_PERSISTENT_UI: + case PROCESS_STATE_TOP: + return PROCESS_CAPABILITY_ALL; + case PROCESS_STATE_BOUND_TOP: + return PROCESS_CAPABILITY_ALL_IMPLICIT; + case PROCESS_STATE_FOREGROUND_SERVICE: + if (app.hasForegroundServices()) { + // Capability from FGS are conditional depending on foreground service type in + // manifest file and the mAllowWhileInUsePermissionInFgs flag. + return PROCESS_CAPABILITY_NONE; + } else { + // process has no FGS, the PROCESS_STATE_FOREGROUND_SERVICE is from client. + return PROCESS_CAPABILITY_ALL_IMPLICIT; + } + case PROCESS_STATE_BOUND_FOREGROUND_SERVICE: + return PROCESS_CAPABILITY_ALL_IMPLICIT; + default: + return PROCESS_CAPABILITY_NONE; + } + } + /** * Checks if for the given app and client, there's a cycle that should skip over the client * for now or use partial values to evaluate the effect of the client binding. diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java index f1bc6822aa4d..85f36aab0be7 100644 --- a/services/core/java/com/android/server/appop/AppOpsService.java +++ b/services/core/java/com/android/server/appop/AppOpsService.java @@ -29,6 +29,8 @@ import static android.app.AppOpsManager.KEY_BG_STATE_SETTLE_TIME; import static android.app.AppOpsManager.KEY_FG_SERVICE_STATE_SETTLE_TIME; import static android.app.AppOpsManager.KEY_TOP_STATE_SETTLE_TIME; import static android.app.AppOpsManager.MODE_ALLOWED; +import static android.app.AppOpsManager.MODE_FOREGROUND; +import static android.app.AppOpsManager.MODE_IGNORED; import static android.app.AppOpsManager.NoteOpEvent; import static android.app.AppOpsManager.OP_CAMERA; import static android.app.AppOpsManager.OP_FLAGS_ALL; @@ -515,12 +517,12 @@ public class AppOpsService extends IAppOpsService.Stub { } int evalMode(int op, int mode) { - if (mode == AppOpsManager.MODE_FOREGROUND) { + if (mode == MODE_FOREGROUND) { if (appWidgetVisible) { return MODE_ALLOWED; } else if (state <= UID_STATE_TOP) { - // process is in foreground. - return AppOpsManager.MODE_ALLOWED; + // process is in TOP. + return MODE_ALLOWED; } else if (state <= AppOpsManager.resolveFirstUnrestrictedUidState(op)) { // process is in foreground, check its capability. switch (op) { @@ -529,53 +531,53 @@ public class AppOpsService extends IAppOpsService.Stub { case AppOpsManager.OP_MONITOR_LOCATION: case AppOpsManager.OP_MONITOR_HIGH_POWER_LOCATION: if ((capability & PROCESS_CAPABILITY_FOREGROUND_LOCATION) != 0) { - return AppOpsManager.MODE_ALLOWED; + return MODE_ALLOWED; } else if ((capability & TEMP_PROCESS_CAPABILITY_FOREGROUND_LOCATION) != 0) { // The FGS has the location capability, but due to FGS BG start // restriction it lost the capability, use temp location capability // to mark this case. maybeShowWhileInUseDebugToast(op, mode); - return AppOpsManager.MODE_IGNORED; + return MODE_IGNORED; } else { - return AppOpsManager.MODE_IGNORED; + return MODE_IGNORED; } case OP_CAMERA: if ((capability & PROCESS_CAPABILITY_FOREGROUND_CAMERA) != 0) { - return AppOpsManager.MODE_ALLOWED; + return MODE_ALLOWED; } else { maybeShowWhileInUseDebugToast(op, mode); - return AppOpsManager.MODE_IGNORED; + return MODE_IGNORED; } case OP_RECORD_AUDIO: if ((capability & PROCESS_CAPABILITY_FOREGROUND_MICROPHONE) != 0) { - return AppOpsManager.MODE_ALLOWED; + return MODE_ALLOWED; } else { maybeShowWhileInUseDebugToast(op, mode); - return AppOpsManager.MODE_IGNORED; + return MODE_IGNORED; } default: - return AppOpsManager.MODE_ALLOWED; + return MODE_ALLOWED; } } else { // process is not in foreground. - return AppOpsManager.MODE_IGNORED; + return MODE_IGNORED; } - } else if (mode == AppOpsManager.MODE_ALLOWED) { + } else if (mode == MODE_ALLOWED) { switch (op) { case OP_CAMERA: if ((capability & PROCESS_CAPABILITY_FOREGROUND_CAMERA) != 0) { - return AppOpsManager.MODE_ALLOWED; + return MODE_ALLOWED; } else { maybeShowWhileInUseDebugToast(op, mode); - return AppOpsManager.MODE_IGNORED; + return MODE_IGNORED; } case OP_RECORD_AUDIO: if ((capability & PROCESS_CAPABILITY_FOREGROUND_MICROPHONE) != 0) { - return AppOpsManager.MODE_ALLOWED; + return MODE_ALLOWED; } else { maybeShowWhileInUseDebugToast(op, mode); - return AppOpsManager.MODE_IGNORED; + return MODE_IGNORED; } default: return MODE_ALLOWED; |