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
This commit is contained in:
Li Li
2022-11-09 20:14:52 -08:00
parent 4d742ae972
commit 4cfcaa21ad
3 changed files with 32 additions and 1 deletions

View File

@@ -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

View File

@@ -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) {

View File

@@ -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");