summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Li Li <dualli@google.com> 2022-11-10 18:13:04 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2022-11-10 18:13:04 +0000
commitba9a87e48e38dbdd021ea650e77179e4bfd51515 (patch)
tree61b0b149baa169a05c6ae7982209333d8547a819
parentdbf04234c770b28d62654ed3621811923aec3415 (diff)
parent4cfcaa21adff11c535d78357cd11dcd7406dfcbc (diff)
Merge "Freezer: add flag for INSTALL_PACKAGE exemption"
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java4
-rw-r--r--services/core/java/com/android/server/am/CachedAppOptimizer.java26
-rw-r--r--services/core/java/com/android/server/am/ProcessList.java3
3 files changed, 32 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 2761a864f22f..af6eaf4e94bd 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -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
diff --git a/services/core/java/com/android/server/am/CachedAppOptimizer.java b/services/core/java/com/android/server/am/CachedAppOptimizer.java
index cbf0aae50e87..2d7b0dc7b536 100644
--- a/services/core/java/com/android/server/am/CachedAppOptimizer.java
+++ b/services/core/java/com/android/server/am/CachedAppOptimizer.java
@@ -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) {
diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java
index 42bfc4cc7130..ecea96e927e3 100644
--- a/services/core/java/com/android/server/am/ProcessList.java
+++ b/services/core/java/com/android/server/am/ProcessList.java
@@ -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");