Merge "Check process state when killing background processes for density" into nyc-dev
am: 57ef138cb7
* commit '57ef138cb7bfc24460369dc5aed70be8a8c49027':
Check process state when killing background processes for density
This commit is contained in:
@@ -5359,17 +5359,6 @@ public final class ActivityManagerService extends ActivityManagerNative
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void killAllBackgroundProcesses() {
|
public void killAllBackgroundProcesses() {
|
||||||
killAllBackgroundProcesses(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Kills all background processes with targetSdkVersion below the specified
|
|
||||||
* target SDK version.
|
|
||||||
*
|
|
||||||
* @param targetSdkVersion the target SDK version below which to kill
|
|
||||||
* processes, or {@code -1} to kill all processes
|
|
||||||
*/
|
|
||||||
private void killAllBackgroundProcesses(int targetSdkVersion) {
|
|
||||||
if (checkCallingPermission(android.Manifest.permission.KILL_BACKGROUND_PROCESSES)
|
if (checkCallingPermission(android.Manifest.permission.KILL_BACKGROUND_PROCESSES)
|
||||||
!= PackageManager.PERMISSION_GRANTED) {
|
!= PackageManager.PERMISSION_GRANTED) {
|
||||||
final String msg = "Permission Denial: killAllBackgroundProcesses() from pid="
|
final String msg = "Permission Denial: killAllBackgroundProcesses() from pid="
|
||||||
@@ -5393,10 +5382,6 @@ public final class ActivityManagerService extends ActivityManagerNative
|
|||||||
// We don't kill persistent processes.
|
// We don't kill persistent processes.
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (targetSdkVersion > 0
|
|
||||||
&& app.info.targetSdkVersion >= targetSdkVersion) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (app.removed) {
|
if (app.removed) {
|
||||||
procs.add(app);
|
procs.add(app);
|
||||||
} else if (app.setAdj >= ProcessList.CACHED_APP_MIN_ADJ) {
|
} else if (app.setAdj >= ProcessList.CACHED_APP_MIN_ADJ) {
|
||||||
@@ -5421,6 +5406,55 @@ public final class ActivityManagerService extends ActivityManagerNative
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Kills all background processes, except those matching any of the
|
||||||
|
* specified properties.
|
||||||
|
*
|
||||||
|
* @param minTargetSdk the target SDK version at or above which to preserve
|
||||||
|
* processes, or {@code -1} to ignore the target SDK
|
||||||
|
* @param maxProcState the process state at or below which to preserve
|
||||||
|
* processes, or {@code -1} to ignore the process state
|
||||||
|
*/
|
||||||
|
private void killAllBackgroundProcessesExcept(int minTargetSdk, int maxProcState) {
|
||||||
|
if (checkCallingPermission(android.Manifest.permission.KILL_BACKGROUND_PROCESSES)
|
||||||
|
!= PackageManager.PERMISSION_GRANTED) {
|
||||||
|
final String msg = "Permission Denial: killAllBackgroundProcessesExcept() from pid="
|
||||||
|
+ Binder.getCallingPid() + ", uid=" + Binder.getCallingUid()
|
||||||
|
+ " requires " + android.Manifest.permission.KILL_BACKGROUND_PROCESSES;
|
||||||
|
Slog.w(TAG, msg);
|
||||||
|
throw new SecurityException(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
final long callingId = Binder.clearCallingIdentity();
|
||||||
|
try {
|
||||||
|
synchronized (this) {
|
||||||
|
final ArrayList<ProcessRecord> procs = new ArrayList<>();
|
||||||
|
final int NP = mProcessNames.getMap().size();
|
||||||
|
for (int ip = 0; ip < NP; ip++) {
|
||||||
|
final SparseArray<ProcessRecord> apps = mProcessNames.getMap().valueAt(ip);
|
||||||
|
final int NA = apps.size();
|
||||||
|
for (int ia = 0; ia < NA; ia++) {
|
||||||
|
final ProcessRecord app = apps.valueAt(ia);
|
||||||
|
if (app.removed) {
|
||||||
|
procs.add(app);
|
||||||
|
} else if ((minTargetSdk < 0 || app.info.targetSdkVersion < minTargetSdk)
|
||||||
|
&& (maxProcState < 0 || app.setProcState > maxProcState)) {
|
||||||
|
app.removed = true;
|
||||||
|
procs.add(app);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
final int N = procs.size();
|
||||||
|
for (int i = 0; i < N; i++) {
|
||||||
|
removeProcessLocked(procs.get(i), false, true, "kill all background except");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
Binder.restoreCallingIdentity(callingId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void forceStopPackage(final String packageName, int userId) {
|
public void forceStopPackage(final String packageName, int userId) {
|
||||||
if (checkCallingPermission(android.Manifest.permission.FORCE_STOP_PACKAGES)
|
if (checkCallingPermission(android.Manifest.permission.FORCE_STOP_PACKAGES)
|
||||||
@@ -18056,7 +18090,8 @@ public final class ActivityManagerService extends ActivityManagerNative
|
|||||||
|
|
||||||
final boolean isDensityChange = (changes & ActivityInfo.CONFIG_DENSITY) != 0;
|
final boolean isDensityChange = (changes & ActivityInfo.CONFIG_DENSITY) != 0;
|
||||||
if (isDensityChange) {
|
if (isDensityChange) {
|
||||||
killAllBackgroundProcesses(Build.VERSION_CODES.N);
|
killAllBackgroundProcessesExcept(Build.VERSION_CODES.N,
|
||||||
|
ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i=mLruProcesses.size()-1; i>=0; i--) {
|
for (int i=mLruProcesses.size()-1; i>=0; i--) {
|
||||||
|
|||||||
Reference in New Issue
Block a user