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

Commit 4cfcaa21 authored by Li Li's avatar Li Li
Browse files

Freezer: add flag for INSTALL_PACKAGE exemption

If activity_manager_native_boot.freeze_exempt_inst_pkg is true, exempt
apps with INSTALL_PACKAGE permission from being frozen.

Otherwise, disable this exemption so apps with INSTALL_PACKAGE can also
be frozen.

Bug: 253913470
Test: verify com.android.vending can be frozen in cached mode.
Change-Id: I6f54edb3f7f469bfd242e6306a1fd1192f1df17a
parent 4d742ae9
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -19050,6 +19050,10 @@ public class ActivityManagerService extends IActivityManager.Stub
        return mOomAdjuster.mCachedAppOptimizer.useFreezer();
    }
    public boolean isAppFreezerExemptInstPkg() {
        return mOomAdjuster.mCachedAppOptimizer.freezerExemptInstPkg();
    }
    /**
     * Resets the state of the {@link com.android.server.am.AppErrors} instance.
     * This is intended for testing within the CTS only and is protected by
+26 −0
Original line number Diff line number Diff line
@@ -89,6 +89,8 @@ public final class CachedAppOptimizer {
            "compact_proc_state_throttle";
    @VisibleForTesting static final String KEY_FREEZER_DEBOUNCE_TIMEOUT =
            "freeze_debounce_timeout";
    @VisibleForTesting static final String KEY_FREEZER_EXEMPT_INST_PKG =
            "freeze_exempt_inst_pkg";

    // RSS Indices
    private static final int RSS_TOTAL_INDEX = 0;
@@ -137,6 +139,7 @@ public final class CachedAppOptimizer {
    @VisibleForTesting static final String DEFAULT_COMPACT_PROC_STATE_THROTTLE =
            String.valueOf(ActivityManager.PROCESS_STATE_RECEIVER);
    @VisibleForTesting static final long DEFAULT_FREEZER_DEBOUNCE_TIMEOUT = 600_000L;
    @VisibleForTesting static final Boolean DEFAULT_FREEZER_EXEMPT_INST_PKG = true;

    @VisibleForTesting static final Uri CACHED_APP_FREEZER_ENABLED_URI = Settings.Global.getUriFor(
                Settings.Global.CACHED_APPS_FREEZER_ENABLED);
@@ -277,6 +280,8 @@ public final class CachedAppOptimizer {
                        for (String name : properties.getKeyset()) {
                            if (KEY_FREEZER_DEBOUNCE_TIMEOUT.equals(name)) {
                                updateFreezerDebounceTimeout();
                            } else if (KEY_FREEZER_EXEMPT_INST_PKG.equals(name)) {
                                updateFreezerExemptInstPkg();
                            }
                        }
                    }
@@ -357,6 +362,7 @@ public final class CachedAppOptimizer {
    private boolean mFreezerOverride = false;

    @VisibleForTesting volatile long mFreezerDebounceTimeout = DEFAULT_FREEZER_DEBOUNCE_TIMEOUT;
    @VisibleForTesting volatile boolean mFreezerExemptInstPkg = DEFAULT_FREEZER_EXEMPT_INST_PKG;

    // Maps process ID to last compaction statistics for processes that we've fully compacted. Used
    // when evaluating throttles that we only consider for "full" compaction, so we don't store
@@ -566,6 +572,15 @@ public final class CachedAppOptimizer {
        }
    }

    /**
     * Returns whether freezer exempts INSTALL_PACKAGES.
     */
    public boolean freezerExemptInstPkg() {
        synchronized (mPhenotypeFlagLock) {
            return mUseFreezer && mFreezerExemptInstPkg;
        }
    }

    @GuardedBy("mProcLock")
    void dump(PrintWriter pw) {
        pw.println("CachedAppOptimizer settings");
@@ -647,6 +662,7 @@ public final class CachedAppOptimizer {
            pw.println("  " + KEY_USE_FREEZER + "=" + mUseFreezer);
            pw.println("  " + KEY_FREEZER_STATSD_SAMPLE_RATE + "=" + mFreezerStatsdSampleRate);
            pw.println("  " + KEY_FREEZER_DEBOUNCE_TIMEOUT + "=" + mFreezerDebounceTimeout);
            pw.println("  " + KEY_FREEZER_EXEMPT_INST_PKG + "=" + mFreezerExemptInstPkg);
            synchronized (mProcLock) {
                int size = mFrozenProcesses.size();
                pw.println("  Apps frozen: " + size);
@@ -1007,6 +1023,7 @@ public final class CachedAppOptimizer {
                    KEY_USE_FREEZER, DEFAULT_USE_FREEZER)) {
            mUseFreezer = isFreezerSupported();
            updateFreezerDebounceTimeout();
            updateFreezerExemptInstPkg();
        } else {
            mUseFreezer = false;
        }
@@ -1194,6 +1211,15 @@ public final class CachedAppOptimizer {
        if (mFreezerDebounceTimeout < 0) {
            mFreezerDebounceTimeout = DEFAULT_FREEZER_DEBOUNCE_TIMEOUT;
        }
        Slog.d(TAG_AM, "Freezer timeout set to " + mFreezerDebounceTimeout);
    }

    @GuardedBy("mPhenotypeFlagLock")
    private void updateFreezerExemptInstPkg() {
        mFreezerExemptInstPkg = DeviceConfig.getBoolean(
                DeviceConfig.NAMESPACE_ACTIVITY_MANAGER_NATIVE_BOOT,
                KEY_FREEZER_EXEMPT_INST_PKG, DEFAULT_FREEZER_EXEMPT_INST_PKG);
        Slog.d(TAG_AM, "Freezer exemption set to " + mFreezerExemptInstPkg);
    }

    private boolean parseProcStateThrottle(String procStateThrottleString) {
+2 −1
Original line number Diff line number Diff line
@@ -1693,7 +1693,8 @@ public final class ProcessList {
                            app.info.packageName);
                    externalStorageAccess = storageManagerInternal.hasExternalStorageAccess(uid,
                            app.info.packageName);
                    if (pm.checkPermission(Manifest.permission.INSTALL_PACKAGES,
                    if (mService.isAppFreezerExemptInstPkg()
                            && pm.checkPermission(Manifest.permission.INSTALL_PACKAGES,
                            app.info.packageName, userId)
                            == PackageManager.PERMISSION_GRANTED) {
                        Slog.i(TAG, app.info.packageName + " is exempt from freezer");