Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dc6a05ec authored by Alan Viverette's avatar Alan Viverette Committed by android-build-merger
Browse files

Merge "Check process state when killing background processes for density" into nyc-dev

am: 57ef138c

* commit '57ef138c':
  Check process state when killing background processes for density
parents d3a46023 57ef138c
Loading
Loading
Loading
Loading
+51 −16
Original line number Diff line number Diff line
@@ -5359,17 +5359,6 @@ public final class ActivityManagerService extends ActivityManagerNative
    @Override
    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)
                != PackageManager.PERMISSION_GRANTED) {
            final String msg = "Permission Denial: killAllBackgroundProcesses() from pid="
@@ -5393,10 +5382,6 @@ public final class ActivityManagerService extends ActivityManagerNative
                            // We don't kill persistent processes.
                            continue;
                        }
                        if (targetSdkVersion > 0
                                && app.info.targetSdkVersion >= targetSdkVersion) {
                            continue;
                        }
                        if (app.removed) {
                            procs.add(app);
                        } 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
    public void forceStopPackage(final String packageName, int userId) {
        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;
                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--) {