Merge "Allow EJs to obtain new network capability." into sc-dev am: 8632838c50
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/13526199 MUST ONLY BE SUBMITTED BY AUTOMERGER Change-Id: I49e2e51958d6e8dfe75d9c0dca66a7dc362b16ac
This commit is contained in:
@@ -271,7 +271,9 @@ public final class JobServiceContext implements ServiceConnection {
|
|||||||
if (job.shouldTreatAsExpeditedJob()) {
|
if (job.shouldTreatAsExpeditedJob()) {
|
||||||
// TODO(171305774): The job should run on the little cores. We'll probably need
|
// TODO(171305774): The job should run on the little cores. We'll probably need
|
||||||
// another binding flag for that.
|
// another binding flag for that.
|
||||||
bindFlags = Context.BIND_AUTO_CREATE;
|
bindFlags = Context.BIND_AUTO_CREATE | Context.BIND_NOT_FOREGROUND
|
||||||
|
| Context.BIND_ALMOST_PERCEPTIBLE
|
||||||
|
| Context.BIND_ALLOW_NETWORK_ACCESS;
|
||||||
} else {
|
} else {
|
||||||
bindFlags = Context.BIND_AUTO_CREATE | Context.BIND_NOT_FOREGROUND
|
bindFlags = Context.BIND_AUTO_CREATE | Context.BIND_NOT_FOREGROUND
|
||||||
| Context.BIND_NOT_PERCEPTIBLE;
|
| Context.BIND_NOT_PERCEPTIBLE;
|
||||||
|
|||||||
@@ -91,6 +91,8 @@ package android.app {
|
|||||||
method @RequiresPermission(android.Manifest.permission.SET_ACTIVITY_WATCHER) public void addHomeVisibilityListener(@NonNull java.util.concurrent.Executor, @NonNull android.app.HomeVisibilityListener);
|
method @RequiresPermission(android.Manifest.permission.SET_ACTIVITY_WATCHER) public void addHomeVisibilityListener(@NonNull java.util.concurrent.Executor, @NonNull android.app.HomeVisibilityListener);
|
||||||
method public void alwaysShowUnsupportedCompileSdkWarning(android.content.ComponentName);
|
method public void alwaysShowUnsupportedCompileSdkWarning(android.content.ComponentName);
|
||||||
method public long getTotalRam();
|
method public long getTotalRam();
|
||||||
|
method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public int getUidProcessCapabilities(int);
|
||||||
|
method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public int getUidProcessState(int);
|
||||||
method public void holdLock(android.os.IBinder, int);
|
method public void holdLock(android.os.IBinder, int);
|
||||||
method public static boolean isHighEndGfx();
|
method public static boolean isHighEndGfx();
|
||||||
method @RequiresPermission(android.Manifest.permission.SET_ACTIVITY_WATCHER) public void removeHomeVisibilityListener(@NonNull android.app.HomeVisibilityListener);
|
method @RequiresPermission(android.Manifest.permission.SET_ACTIVITY_WATCHER) public void removeHomeVisibilityListener(@NonNull android.app.HomeVisibilityListener);
|
||||||
@@ -106,7 +108,10 @@ package android.app {
|
|||||||
field public static final int PROCESS_CAPABILITY_FOREGROUND_CAMERA = 2; // 0x2
|
field public static final int PROCESS_CAPABILITY_FOREGROUND_CAMERA = 2; // 0x2
|
||||||
field public static final int PROCESS_CAPABILITY_FOREGROUND_LOCATION = 1; // 0x1
|
field public static final int PROCESS_CAPABILITY_FOREGROUND_LOCATION = 1; // 0x1
|
||||||
field public static final int PROCESS_CAPABILITY_FOREGROUND_MICROPHONE = 4; // 0x4
|
field public static final int PROCESS_CAPABILITY_FOREGROUND_MICROPHONE = 4; // 0x4
|
||||||
|
field public static final int PROCESS_CAPABILITY_NETWORK = 8; // 0x8
|
||||||
field public static final int PROCESS_CAPABILITY_NONE = 0; // 0x0
|
field public static final int PROCESS_CAPABILITY_NONE = 0; // 0x0
|
||||||
|
field public static final int PROCESS_STATE_FOREGROUND_SERVICE = 4; // 0x4
|
||||||
|
field public static final int PROCESS_STATE_TOP = 2; // 0x2
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class ActivityManager.RunningAppProcessInfo implements android.os.Parcelable {
|
public static class ActivityManager.RunningAppProcessInfo implements android.os.Parcelable {
|
||||||
|
|||||||
@@ -511,6 +511,7 @@ public class ActivityManager {
|
|||||||
/** @hide Process is hosting the current top activities. Note that this covers
|
/** @hide Process is hosting the current top activities. Note that this covers
|
||||||
* all activities that are visible to the user. */
|
* all activities that are visible to the user. */
|
||||||
@UnsupportedAppUsage
|
@UnsupportedAppUsage
|
||||||
|
@TestApi
|
||||||
public static final int PROCESS_STATE_TOP = ProcessStateEnum.TOP;
|
public static final int PROCESS_STATE_TOP = ProcessStateEnum.TOP;
|
||||||
|
|
||||||
/** @hide Process is bound to a TOP app. */
|
/** @hide Process is bound to a TOP app. */
|
||||||
@@ -518,6 +519,7 @@ public class ActivityManager {
|
|||||||
|
|
||||||
/** @hide Process is hosting a foreground service. */
|
/** @hide Process is hosting a foreground service. */
|
||||||
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
|
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
|
||||||
|
@TestApi
|
||||||
public static final int PROCESS_STATE_FOREGROUND_SERVICE = ProcessStateEnum.FOREGROUND_SERVICE;
|
public static final int PROCESS_STATE_FOREGROUND_SERVICE = ProcessStateEnum.FOREGROUND_SERVICE;
|
||||||
|
|
||||||
/** @hide Process is hosting a foreground service due to a system binding. */
|
/** @hide Process is hosting a foreground service due to a system binding. */
|
||||||
@@ -617,6 +619,7 @@ public class ActivityManager {
|
|||||||
public static final int PROCESS_CAPABILITY_FOREGROUND_MICROPHONE = 1 << 2;
|
public static final int PROCESS_CAPABILITY_FOREGROUND_MICROPHONE = 1 << 2;
|
||||||
|
|
||||||
/** @hide Process can access network despite any power saving resrictions */
|
/** @hide Process can access network despite any power saving resrictions */
|
||||||
|
@TestApi
|
||||||
public static final int PROCESS_CAPABILITY_NETWORK = 1 << 3;
|
public static final int PROCESS_CAPABILITY_NETWORK = 1 << 3;
|
||||||
|
|
||||||
/** @hide all capabilities, the ORing of all flags in {@link ProcessCapability}*/
|
/** @hide all capabilities, the ORing of all flags in {@link ProcessCapability}*/
|
||||||
@@ -3431,6 +3434,36 @@ public class ActivityManager {
|
|||||||
return SystemProperties.getBoolean("persist.sys.lmk.reportkills", false);
|
return SystemProperties.getBoolean("persist.sys.lmk.reportkills", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the process state of this uid.
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
@TestApi
|
||||||
|
@RequiresPermission(Manifest.permission.PACKAGE_USAGE_STATS)
|
||||||
|
public int getUidProcessState(int uid) {
|
||||||
|
try {
|
||||||
|
return getService().getUidProcessState(uid, mContext.getOpPackageName());
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
throw e.rethrowFromSystemServer();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the process capability of this uid.
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
@TestApi
|
||||||
|
@RequiresPermission(Manifest.permission.PACKAGE_USAGE_STATS)
|
||||||
|
public @ProcessCapability int getUidProcessCapabilities(int uid) {
|
||||||
|
try {
|
||||||
|
return getService().getUidProcessCapabilities(uid, mContext.getOpPackageName());
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
throw e.rethrowFromSystemServer();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the importance of a given package name, based on the processes that are
|
* Return the importance of a given package name, based on the processes that are
|
||||||
* currently running. The return value is one of the importance constants defined
|
* currently running. The return value is one of the importance constants defined
|
||||||
|
|||||||
@@ -707,4 +707,6 @@ interface IActivityManager {
|
|||||||
|
|
||||||
/** Called by PendingIntent.queryIntentComponents() */
|
/** Called by PendingIntent.queryIntentComponents() */
|
||||||
List<ResolveInfo> queryIntentComponentsForIntentSender(in IIntentSender sender, int matchFlags);
|
List<ResolveInfo> queryIntentComponentsForIntentSender(in IIntentSender sender, int matchFlags);
|
||||||
|
|
||||||
|
int getUidProcessCapabilities(int uid, in String callingPackage);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -369,6 +369,25 @@ public abstract class Context {
|
|||||||
/*********** Public flags above this line ***********/
|
/*********** Public flags above this line ***********/
|
||||||
/*********** Hidden flags below this line ***********/
|
/*********** Hidden flags below this line ***********/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flag for {@link #bindService}: allow the process hosting the target service to be treated
|
||||||
|
* as if it's as important as a perceptible app to the user and avoid the oom killer killing
|
||||||
|
* this process in low memory situations until there aren't any other processes left but the
|
||||||
|
* ones which are user-perceptible.
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public static final int BIND_ALMOST_PERCEPTIBLE = 0x000010000;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flag for {@link #bindService}: allow the process hosting the target service to gain
|
||||||
|
* {@link ActivityManager#PROCESS_CAPABILITY_NETWORK}, which allows it be able
|
||||||
|
* to access network regardless of any power saving restrictions.
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public static final int BIND_ALLOW_NETWORK_ACCESS = 0x00020000;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Flag for {@link #bindService}: allow background foreground service starts from the bound
|
* Flag for {@link #bindService}: allow background foreground service starts from the bound
|
||||||
* service's process.
|
* service's process.
|
||||||
|
|||||||
@@ -143,6 +143,7 @@ import android.app.Activity;
|
|||||||
import android.app.ActivityClient;
|
import android.app.ActivityClient;
|
||||||
import android.app.ActivityManager;
|
import android.app.ActivityManager;
|
||||||
import android.app.ActivityManager.PendingIntentInfo;
|
import android.app.ActivityManager.PendingIntentInfo;
|
||||||
|
import android.app.ActivityManager.ProcessCapability;
|
||||||
import android.app.ActivityManager.RunningTaskInfo;
|
import android.app.ActivityManager.RunningTaskInfo;
|
||||||
import android.app.ActivityManagerInternal;
|
import android.app.ActivityManagerInternal;
|
||||||
import android.app.ActivityTaskManager.RootTaskInfo;
|
import android.app.ActivityTaskManager.RootTaskInfo;
|
||||||
@@ -6585,6 +6586,18 @@ public class ActivityManagerService extends IActivityManager.Stub
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @ProcessCapability int getUidProcessCapabilities(int uid, String callingPackage) {
|
||||||
|
if (!hasUsageStatsPermission(callingPackage)) {
|
||||||
|
enforceCallingPermission(android.Manifest.permission.PACKAGE_USAGE_STATS,
|
||||||
|
"getUidProcessState");
|
||||||
|
}
|
||||||
|
|
||||||
|
synchronized (mProcLock) {
|
||||||
|
return mProcessList.getUidProcessCapabilityLOSP(uid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void registerUidObserver(IUidObserver observer, int which, int cutpoint,
|
public void registerUidObserver(IUidObserver observer, int which, int cutpoint,
|
||||||
String callingPackage) {
|
String callingPackage) {
|
||||||
@@ -10031,6 +10044,7 @@ public class ActivityManagerService extends IActivityManager.Stub
|
|||||||
ProcessList.PERSISTENT_SERVICE_ADJ, ProcessList.FOREGROUND_APP_ADJ,
|
ProcessList.PERSISTENT_SERVICE_ADJ, ProcessList.FOREGROUND_APP_ADJ,
|
||||||
ProcessList.VISIBLE_APP_ADJ,
|
ProcessList.VISIBLE_APP_ADJ,
|
||||||
ProcessList.PERCEPTIBLE_APP_ADJ, ProcessList.PERCEPTIBLE_LOW_APP_ADJ,
|
ProcessList.PERCEPTIBLE_APP_ADJ, ProcessList.PERCEPTIBLE_LOW_APP_ADJ,
|
||||||
|
ProcessList.PERCEPTIBLE_MEDIUM_APP_ADJ,
|
||||||
ProcessList.BACKUP_APP_ADJ, ProcessList.HEAVY_WEIGHT_APP_ADJ,
|
ProcessList.BACKUP_APP_ADJ, ProcessList.HEAVY_WEIGHT_APP_ADJ,
|
||||||
ProcessList.SERVICE_ADJ, ProcessList.HOME_APP_ADJ,
|
ProcessList.SERVICE_ADJ, ProcessList.HOME_APP_ADJ,
|
||||||
ProcessList.PREVIOUS_APP_ADJ, ProcessList.SERVICE_B_ADJ, ProcessList.CACHED_APP_MIN_ADJ
|
ProcessList.PREVIOUS_APP_ADJ, ProcessList.SERVICE_B_ADJ, ProcessList.CACHED_APP_MIN_ADJ
|
||||||
@@ -10038,7 +10052,7 @@ public class ActivityManagerService extends IActivityManager.Stub
|
|||||||
static final String[] DUMP_MEM_OOM_LABEL = new String[] {
|
static final String[] DUMP_MEM_OOM_LABEL = new String[] {
|
||||||
"Native",
|
"Native",
|
||||||
"System", "Persistent", "Persistent Service", "Foreground",
|
"System", "Persistent", "Persistent Service", "Foreground",
|
||||||
"Visible", "Perceptible", "Perceptible Low",
|
"Visible", "Perceptible", "Perceptible Low", "Perceptible Medium",
|
||||||
"Heavy Weight", "Backup",
|
"Heavy Weight", "Backup",
|
||||||
"A Services", "Home",
|
"A Services", "Home",
|
||||||
"Previous", "B Services", "Cached"
|
"Previous", "B Services", "Cached"
|
||||||
@@ -10046,7 +10060,7 @@ public class ActivityManagerService extends IActivityManager.Stub
|
|||||||
static final String[] DUMP_MEM_OOM_COMPACT_LABEL = new String[] {
|
static final String[] DUMP_MEM_OOM_COMPACT_LABEL = new String[] {
|
||||||
"native",
|
"native",
|
||||||
"sys", "pers", "persvc", "fore",
|
"sys", "pers", "persvc", "fore",
|
||||||
"vis", "percept", "perceptl",
|
"vis", "percept", "perceptl", "perceptm",
|
||||||
"heavy", "backup",
|
"heavy", "backup",
|
||||||
"servicea", "home",
|
"servicea", "home",
|
||||||
"prev", "serviceb", "cached"
|
"prev", "serviceb", "cached"
|
||||||
@@ -13904,7 +13918,7 @@ public class ActivityManagerService extends IActivityManager.Stub
|
|||||||
}
|
}
|
||||||
|
|
||||||
void noteUidProcessState(final int uid, final int state,
|
void noteUidProcessState(final int uid, final int state,
|
||||||
final @ActivityManager.ProcessCapability int capability) {
|
final @ProcessCapability int capability) {
|
||||||
mBatteryStatsService.noteUidProcessState(uid, state);
|
mBatteryStatsService.noteUidProcessState(uid, state);
|
||||||
mAppOpsService.updateUidProcState(uid, state, capability);
|
mAppOpsService.updateUidProcState(uid, state, capability);
|
||||||
if (mTrackingAssociations) {
|
if (mTrackingAssociations) {
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import static android.app.ActivityManager.PROCESS_CAPABILITY_ALL_IMPLICIT;
|
|||||||
import static android.app.ActivityManager.PROCESS_CAPABILITY_FOREGROUND_CAMERA;
|
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_LOCATION;
|
||||||
import static android.app.ActivityManager.PROCESS_CAPABILITY_FOREGROUND_MICROPHONE;
|
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_NONE;
|
||||||
import static android.app.ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE;
|
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_BOUND_TOP;
|
||||||
@@ -1981,6 +1982,21 @@ public final class OomAdjuster {
|
|||||||
capability |= cstate.getCurCapability();
|
capability |= cstate.getCurCapability();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If an app has network capability by default
|
||||||
|
// (by having procstate <= BFGS), then the apps it binds to will get
|
||||||
|
// 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 (clientProcState <= PROCESS_STATE_BOUND_FOREGROUND_SERVICE) {
|
||||||
|
if ((cr.flags & Context.BIND_ALLOW_NETWORK_ACCESS) != 0) {
|
||||||
|
capability |= PROCESS_CAPABILITY_NETWORK;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
capability |= PROCESS_CAPABILITY_NETWORK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (clientProcState >= PROCESS_STATE_CACHED_ACTIVITY) {
|
if (clientProcState >= PROCESS_STATE_CACHED_ACTIVITY) {
|
||||||
// If the other app is cached for any reason, for purposes here
|
// If the other app is cached for any reason, for purposes here
|
||||||
// we are going to consider it empty. The specific cached state
|
// we are going to consider it empty. The specific cached state
|
||||||
@@ -2048,6 +2064,10 @@ public final class OomAdjuster {
|
|||||||
&& clientAdj <= ProcessList.PERCEPTIBLE_APP_ADJ
|
&& clientAdj <= ProcessList.PERCEPTIBLE_APP_ADJ
|
||||||
&& adj >= ProcessList.PERCEPTIBLE_LOW_APP_ADJ) {
|
&& adj >= ProcessList.PERCEPTIBLE_LOW_APP_ADJ) {
|
||||||
newAdj = ProcessList.PERCEPTIBLE_LOW_APP_ADJ;
|
newAdj = ProcessList.PERCEPTIBLE_LOW_APP_ADJ;
|
||||||
|
} else if ((cr.flags & Context.BIND_ALMOST_PERCEPTIBLE) != 0
|
||||||
|
&& clientAdj < ProcessList.PERCEPTIBLE_APP_ADJ
|
||||||
|
&& adj >= ProcessList.PERCEPTIBLE_MEDIUM_APP_ADJ) {
|
||||||
|
newAdj = ProcessList.PERCEPTIBLE_MEDIUM_APP_ADJ;
|
||||||
} else if ((cr.flags&Context.BIND_NOT_VISIBLE) != 0
|
} else if ((cr.flags&Context.BIND_NOT_VISIBLE) != 0
|
||||||
&& clientAdj < ProcessList.PERCEPTIBLE_APP_ADJ
|
&& clientAdj < ProcessList.PERCEPTIBLE_APP_ADJ
|
||||||
&& adj >= ProcessList.PERCEPTIBLE_APP_ADJ) {
|
&& adj >= ProcessList.PERCEPTIBLE_APP_ADJ) {
|
||||||
@@ -2117,13 +2137,13 @@ public final class OomAdjuster {
|
|||||||
if (enabled) {
|
if (enabled) {
|
||||||
if (cr.hasFlag(Context.BIND_INCLUDE_CAPABILITIES)) {
|
if (cr.hasFlag(Context.BIND_INCLUDE_CAPABILITIES)) {
|
||||||
// TOP process passes all capabilities to the service.
|
// TOP process passes all capabilities to the service.
|
||||||
capability |= PROCESS_CAPABILITY_ALL;
|
capability |= cstate.getCurCapability();
|
||||||
} else {
|
} else {
|
||||||
// TOP process passes no capability to the service.
|
// TOP process passes no capability to the service.
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// TOP process passes all capabilities to the service.
|
// TOP process passes all capabilities to the service.
|
||||||
capability |= PROCESS_CAPABILITY_ALL;
|
capability |= cstate.getCurCapability();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if ((cr.flags & Context.BIND_IMPORTANT_BACKGROUND) == 0) {
|
} else if ((cr.flags & Context.BIND_IMPORTANT_BACKGROUND) == 0) {
|
||||||
@@ -2448,20 +2468,20 @@ public final class OomAdjuster {
|
|||||||
case PROCESS_STATE_TOP:
|
case PROCESS_STATE_TOP:
|
||||||
return PROCESS_CAPABILITY_ALL;
|
return PROCESS_CAPABILITY_ALL;
|
||||||
case PROCESS_STATE_BOUND_TOP:
|
case PROCESS_STATE_BOUND_TOP:
|
||||||
return PROCESS_CAPABILITY_NONE;
|
return PROCESS_CAPABILITY_NETWORK;
|
||||||
case PROCESS_STATE_FOREGROUND_SERVICE:
|
case PROCESS_STATE_FOREGROUND_SERVICE:
|
||||||
if (psr.hasForegroundServices()) {
|
if (psr.hasForegroundServices()) {
|
||||||
// Capability from FGS are conditional depending on foreground service type in
|
// Capability from FGS are conditional depending on foreground service type in
|
||||||
// manifest file and the mAllowWhileInUsePermissionInFgs flag.
|
// manifest file and the mAllowWhileInUsePermissionInFgs flag.
|
||||||
return PROCESS_CAPABILITY_NONE;
|
return PROCESS_CAPABILITY_NETWORK;
|
||||||
} else {
|
} else {
|
||||||
// process has no FGS, the PROCESS_STATE_FOREGROUND_SERVICE is from client.
|
// process has no FGS, the PROCESS_STATE_FOREGROUND_SERVICE is from client.
|
||||||
// the implicit capability could be removed in the future, client should use
|
// the implicit capability could be removed in the future, client should use
|
||||||
// BIND_INCLUDE_CAPABILITY flag.
|
// BIND_INCLUDE_CAPABILITY flag.
|
||||||
return PROCESS_CAPABILITY_ALL_IMPLICIT;
|
return PROCESS_CAPABILITY_ALL_IMPLICIT | PROCESS_CAPABILITY_NETWORK;
|
||||||
}
|
}
|
||||||
case PROCESS_STATE_BOUND_FOREGROUND_SERVICE:
|
case PROCESS_STATE_BOUND_FOREGROUND_SERVICE:
|
||||||
return PROCESS_CAPABILITY_NONE;
|
return PROCESS_CAPABILITY_NETWORK;
|
||||||
default:
|
default:
|
||||||
return PROCESS_CAPABILITY_NONE;
|
return PROCESS_CAPABILITY_NONE;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package com.android.server.am;
|
package com.android.server.am;
|
||||||
|
|
||||||
|
import static android.app.ActivityManager.PROCESS_CAPABILITY_NONE;
|
||||||
import static android.app.ActivityManager.PROCESS_STATE_CACHED_ACTIVITY;
|
import static android.app.ActivityManager.PROCESS_STATE_CACHED_ACTIVITY;
|
||||||
import static android.app.ActivityManager.PROCESS_STATE_NONEXISTENT;
|
import static android.app.ActivityManager.PROCESS_STATE_NONEXISTENT;
|
||||||
import static android.app.ActivityThread.PROC_START_SEQ_IDENT;
|
import static android.app.ActivityThread.PROC_START_SEQ_IDENT;
|
||||||
@@ -57,6 +58,7 @@ import static com.android.server.am.AppProfiler.TAG_PSS;
|
|||||||
|
|
||||||
import android.annotation.NonNull;
|
import android.annotation.NonNull;
|
||||||
import android.app.ActivityManager;
|
import android.app.ActivityManager;
|
||||||
|
import android.app.ActivityManager.ProcessCapability;
|
||||||
import android.app.ActivityThread;
|
import android.app.ActivityThread;
|
||||||
import android.app.AppGlobals;
|
import android.app.AppGlobals;
|
||||||
import android.app.AppProtoEnums;
|
import android.app.AppProtoEnums;
|
||||||
@@ -228,6 +230,11 @@ public final class ProcessList {
|
|||||||
// not so perceptible that it affects the user immediately if killed.
|
// not so perceptible that it affects the user immediately if killed.
|
||||||
static final int PERCEPTIBLE_LOW_APP_ADJ = 250;
|
static final int PERCEPTIBLE_LOW_APP_ADJ = 250;
|
||||||
|
|
||||||
|
// This is a process hosting services that are not perceptible to the user but the
|
||||||
|
// client (system) binding to it requested to treat it as if it is perceptible and avoid killing
|
||||||
|
// it if possible.
|
||||||
|
static final int PERCEPTIBLE_MEDIUM_APP_ADJ = 225;
|
||||||
|
|
||||||
// This is a process only hosting components that are perceptible to the
|
// This is a process only hosting components that are perceptible to the
|
||||||
// user, and we really want to avoid killing them, but they are not
|
// user, and we really want to avoid killing them, but they are not
|
||||||
// immediately visible. An example is background music playback.
|
// immediately visible. An example is background music playback.
|
||||||
@@ -1027,6 +1034,9 @@ public final class ProcessList {
|
|||||||
} else if (setAdj >= ProcessList.PERCEPTIBLE_LOW_APP_ADJ) {
|
} else if (setAdj >= ProcessList.PERCEPTIBLE_LOW_APP_ADJ) {
|
||||||
return buildOomTag("prcl ", "prcl", null, setAdj,
|
return buildOomTag("prcl ", "prcl", null, setAdj,
|
||||||
ProcessList.PERCEPTIBLE_LOW_APP_ADJ, compact);
|
ProcessList.PERCEPTIBLE_LOW_APP_ADJ, compact);
|
||||||
|
} else if (setAdj >= ProcessList.PERCEPTIBLE_MEDIUM_APP_ADJ) {
|
||||||
|
return buildOomTag("prcm ", "prcm", null, setAdj,
|
||||||
|
ProcessList.PERCEPTIBLE_MEDIUM_APP_ADJ, compact);
|
||||||
} else if (setAdj >= ProcessList.PERCEPTIBLE_APP_ADJ) {
|
} else if (setAdj >= ProcessList.PERCEPTIBLE_APP_ADJ) {
|
||||||
return buildOomTag("prcp ", "prcp", null, setAdj,
|
return buildOomTag("prcp ", "prcp", null, setAdj,
|
||||||
ProcessList.PERCEPTIBLE_APP_ADJ, compact);
|
ProcessList.PERCEPTIBLE_APP_ADJ, compact);
|
||||||
@@ -4395,6 +4405,7 @@ public final class ProcessList {
|
|||||||
printOomLevel(pw, "FOREGROUND_APP_ADJ", FOREGROUND_APP_ADJ);
|
printOomLevel(pw, "FOREGROUND_APP_ADJ", FOREGROUND_APP_ADJ);
|
||||||
printOomLevel(pw, "VISIBLE_APP_ADJ", VISIBLE_APP_ADJ);
|
printOomLevel(pw, "VISIBLE_APP_ADJ", VISIBLE_APP_ADJ);
|
||||||
printOomLevel(pw, "PERCEPTIBLE_APP_ADJ", PERCEPTIBLE_APP_ADJ);
|
printOomLevel(pw, "PERCEPTIBLE_APP_ADJ", PERCEPTIBLE_APP_ADJ);
|
||||||
|
printOomLevel(pw, "PERCEPTIBLE_MEDIUM_APP_ADJ", PERCEPTIBLE_MEDIUM_APP_ADJ);
|
||||||
printOomLevel(pw, "PERCEPTIBLE_LOW_APP_ADJ", PERCEPTIBLE_LOW_APP_ADJ);
|
printOomLevel(pw, "PERCEPTIBLE_LOW_APP_ADJ", PERCEPTIBLE_LOW_APP_ADJ);
|
||||||
printOomLevel(pw, "BACKUP_APP_ADJ", BACKUP_APP_ADJ);
|
printOomLevel(pw, "BACKUP_APP_ADJ", BACKUP_APP_ADJ);
|
||||||
printOomLevel(pw, "HEAVY_WEIGHT_APP_ADJ", HEAVY_WEIGHT_APP_ADJ);
|
printOomLevel(pw, "HEAVY_WEIGHT_APP_ADJ", HEAVY_WEIGHT_APP_ADJ);
|
||||||
@@ -4658,13 +4669,26 @@ public final class ProcessList {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Returns the uid's process state or PROCESS_STATE_NONEXISTENT if not running */
|
/**
|
||||||
|
* Returns the uid's process state or {@link ActivityManager#PROCESS_STATE_NONEXISTENT}
|
||||||
|
* if not running
|
||||||
|
*/
|
||||||
@GuardedBy(anyOf = {"mService", "mProcLock"})
|
@GuardedBy(anyOf = {"mService", "mProcLock"})
|
||||||
int getUidProcStateLOSP(int uid) {
|
int getUidProcStateLOSP(int uid) {
|
||||||
UidRecord uidRec = mActiveUids.get(uid);
|
UidRecord uidRec = mActiveUids.get(uid);
|
||||||
return uidRec == null ? PROCESS_STATE_NONEXISTENT : uidRec.getCurProcState();
|
return uidRec == null ? PROCESS_STATE_NONEXISTENT : uidRec.getCurProcState();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the uid's process capability or {@link ActivityManager#PROCESS_CAPABILITY_NONE}
|
||||||
|
* if not running
|
||||||
|
*/
|
||||||
|
@GuardedBy(anyOf = {"mService", "mProcLock"})
|
||||||
|
@ProcessCapability int getUidProcessCapabilityLOSP(int uid) {
|
||||||
|
UidRecord uidRec = mActiveUids.get(uid);
|
||||||
|
return uidRec == null ? PROCESS_CAPABILITY_NONE : uidRec.getCurCapability();
|
||||||
|
}
|
||||||
|
|
||||||
/** Returns the UidRecord for the given uid, if it exists. */
|
/** Returns the UidRecord for the given uid, if it exists. */
|
||||||
@GuardedBy(anyOf = {"mService", "mProcLock"})
|
@GuardedBy(anyOf = {"mService", "mProcLock"})
|
||||||
UidRecord getUidRecordLOSP(int uid) {
|
UidRecord getUidRecordLOSP(int uid) {
|
||||||
@@ -4749,8 +4773,9 @@ public final class ProcessList {
|
|||||||
if (!UserHandle.isApp(uidRec.getUid()) || !uidRec.hasInternetPermission) {
|
if (!UserHandle.isApp(uidRec.getUid()) || !uidRec.hasInternetPermission) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// If process state is not changed, then there's nothing to do.
|
// If process state and capabilities are not changed, then there's nothing to do.
|
||||||
if (uidRec.getSetProcState() == uidRec.getCurProcState()) {
|
if (uidRec.getSetProcState() == uidRec.getCurProcState()
|
||||||
|
&& uidRec.getSetCapability() == uidRec.getCurCapability()) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
final int blockState = getBlockStateForUid(uidRec);
|
final int blockState = getBlockStateForUid(uidRec);
|
||||||
|
|||||||
@@ -882,9 +882,10 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
|
|||||||
|
|
||||||
mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class);
|
mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class);
|
||||||
try {
|
try {
|
||||||
|
// TODO: There shouldn't be a need to receive callback for all changes.
|
||||||
mActivityManager.registerUidObserver(mUidObserver,
|
mActivityManager.registerUidObserver(mUidObserver,
|
||||||
ActivityManager.UID_OBSERVER_PROCSTATE|ActivityManager.UID_OBSERVER_GONE,
|
ActivityManager.UID_OBSERVER_PROCSTATE|ActivityManager.UID_OBSERVER_GONE,
|
||||||
NetworkPolicyManager.FOREGROUND_THRESHOLD_STATE, "android");
|
ActivityManager.PROCESS_STATE_UNKNOWN, "android");
|
||||||
mNetworkManager.registerObserver(mAlertObserver);
|
mNetworkManager.registerObserver(mAlertObserver);
|
||||||
} catch (RemoteException e) {
|
} catch (RemoteException e) {
|
||||||
// ignored; both services live in system_server
|
// ignored; both services live in system_server
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ import static com.android.server.am.ProcessList.HEAVY_WEIGHT_APP_ADJ;
|
|||||||
import static com.android.server.am.ProcessList.HOME_APP_ADJ;
|
import static com.android.server.am.ProcessList.HOME_APP_ADJ;
|
||||||
import static com.android.server.am.ProcessList.PERCEPTIBLE_APP_ADJ;
|
import static com.android.server.am.ProcessList.PERCEPTIBLE_APP_ADJ;
|
||||||
import static com.android.server.am.ProcessList.PERCEPTIBLE_LOW_APP_ADJ;
|
import static com.android.server.am.ProcessList.PERCEPTIBLE_LOW_APP_ADJ;
|
||||||
|
import static com.android.server.am.ProcessList.PERCEPTIBLE_MEDIUM_APP_ADJ;
|
||||||
import static com.android.server.am.ProcessList.PERCEPTIBLE_RECENT_FOREGROUND_APP_ADJ;
|
import static com.android.server.am.ProcessList.PERCEPTIBLE_RECENT_FOREGROUND_APP_ADJ;
|
||||||
import static com.android.server.am.ProcessList.PERSISTENT_PROC_ADJ;
|
import static com.android.server.am.ProcessList.PERSISTENT_PROC_ADJ;
|
||||||
import static com.android.server.am.ProcessList.PERSISTENT_SERVICE_ADJ;
|
import static com.android.server.am.ProcessList.PERSISTENT_SERVICE_ADJ;
|
||||||
@@ -875,6 +876,39 @@ public class MockingOomAdjusterTests {
|
|||||||
assertEquals(PERCEPTIBLE_APP_ADJ, app.mState.getSetAdj());
|
assertEquals(PERCEPTIBLE_APP_ADJ, app.mState.getSetAdj());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("GuardedBy")
|
||||||
|
@Test
|
||||||
|
public void testUpdateOomAdj_DoOne_Service_MediumPerceptible() {
|
||||||
|
{
|
||||||
|
ProcessRecord app = spy(makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID,
|
||||||
|
MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, false));
|
||||||
|
ProcessRecord client = spy(makeDefaultProcessRecord(MOCKAPP2_PID, MOCKAPP2_UID,
|
||||||
|
MOCKAPP2_PROCESSNAME, MOCKAPP2_PACKAGENAME, false));
|
||||||
|
bindService(app, client, null, Context.BIND_ALMOST_PERCEPTIBLE, mock(IBinder.class));
|
||||||
|
client.mState.setMaxAdj(PERSISTENT_PROC_ADJ);
|
||||||
|
sService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
|
||||||
|
sService.mOomAdjuster.updateOomAdjLocked(app, false, OomAdjuster.OOM_ADJ_REASON_NONE);
|
||||||
|
|
||||||
|
assertEquals(PERCEPTIBLE_MEDIUM_APP_ADJ, app.mState.getSetAdj());
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
ProcessRecord app = spy(makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID,
|
||||||
|
MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, false));
|
||||||
|
ProcessRecord client = spy(makeDefaultProcessRecord(MOCKAPP2_PID, MOCKAPP2_UID,
|
||||||
|
MOCKAPP2_PROCESSNAME, MOCKAPP2_PACKAGENAME, false));
|
||||||
|
WindowProcessController wpc = client.getWindowProcessController();
|
||||||
|
doReturn(true).when(wpc).isHeavyWeightProcess();
|
||||||
|
bindService(app, client, null, Context.BIND_ALMOST_PERCEPTIBLE, mock(IBinder.class));
|
||||||
|
client.mState.setMaxAdj(PERSISTENT_PROC_ADJ);
|
||||||
|
sService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
|
||||||
|
sService.mOomAdjuster.updateOomAdjLocked(app, false, OomAdjuster.OOM_ADJ_REASON_NONE);
|
||||||
|
doReturn(false).when(wpc).isHeavyWeightProcess();
|
||||||
|
|
||||||
|
assertEquals(PERCEPTIBLE_MEDIUM_APP_ADJ, app.mState.getSetAdj());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@SuppressWarnings("GuardedBy")
|
@SuppressWarnings("GuardedBy")
|
||||||
@Test
|
@Test
|
||||||
public void testUpdateOomAdj_DoOne_Service_Other() {
|
public void testUpdateOomAdj_DoOne_Service_Other() {
|
||||||
|
|||||||
@@ -115,7 +115,6 @@ import android.net.LinkProperties;
|
|||||||
import android.net.Network;
|
import android.net.Network;
|
||||||
import android.net.NetworkCapabilities;
|
import android.net.NetworkCapabilities;
|
||||||
import android.net.NetworkPolicy;
|
import android.net.NetworkPolicy;
|
||||||
import android.net.NetworkPolicyManager;
|
|
||||||
import android.net.NetworkState;
|
import android.net.NetworkState;
|
||||||
import android.net.NetworkStats;
|
import android.net.NetworkStats;
|
||||||
import android.net.NetworkStatsHistory;
|
import android.net.NetworkStatsHistory;
|
||||||
@@ -386,8 +385,7 @@ public class NetworkPolicyManagerServiceTest {
|
|||||||
Log.d(TAG, "set mUidObserver to " + mUidObserver);
|
Log.d(TAG, "set mUidObserver to " + mUidObserver);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}).when(mActivityManager).registerUidObserver(any(), anyInt(),
|
}).when(mActivityManager).registerUidObserver(any(), anyInt(), anyInt(), any(String.class));
|
||||||
eq(NetworkPolicyManager.FOREGROUND_THRESHOLD_STATE), any(String.class));
|
|
||||||
|
|
||||||
mFutureIntent = newRestrictBackgroundChangedFuture();
|
mFutureIntent = newRestrictBackgroundChangedFuture();
|
||||||
mService = new NetworkPolicyManagerService(mServiceContext, mActivityManager,
|
mService = new NetworkPolicyManagerService(mServiceContext, mActivityManager,
|
||||||
|
|||||||
Reference in New Issue
Block a user