summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Li Li <dualli@google.com> 2021-04-28 01:26:42 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2021-04-28 01:26:42 +0000
commite5e92aee86ba9b1e3db5e5a08bdd9c3c90e841c9 (patch)
tree0aafed8680352921bd53804d29c759d55426331f
parent1700fa9e5cbe7fd0ae5ec3f80e49627c16bd0015 (diff)
parente8317ba8200fd51ef1365ddd10bc239a48f17297 (diff)
Merge "Exempt apps with INSTALL_PACKAGES from freezer" into sc-dev
-rw-r--r--services/core/java/com/android/server/am/CachedAppOptimizer.java2
-rw-r--r--services/core/java/com/android/server/am/OomAdjuster.java4
-rw-r--r--services/core/java/com/android/server/am/ProcessCachedOptimizerRecord.java17
-rw-r--r--services/core/java/com/android/server/am/ProcessList.java10
4 files changed, 31 insertions, 2 deletions
diff --git a/services/core/java/com/android/server/am/CachedAppOptimizer.java b/services/core/java/com/android/server/am/CachedAppOptimizer.java
index 8dc9d03dedb7..cc750ce3eefe 100644
--- a/services/core/java/com/android/server/am/CachedAppOptimizer.java
+++ b/services/core/java/com/android/server/am/CachedAppOptimizer.java
@@ -395,7 +395,7 @@ public final class CachedAppOptimizer {
pw.println(" Tracking last compaction stats for " + mLastCompactionStats.size()
+ " processes.");
- pw.println(" " + KEY_USE_FREEZER + "=" + mUseFreezer);
+ pw.println(" " + KEY_USE_FREEZER + "=" + mUseFreezer);
pw.println(" " + KEY_FREEZER_STATSD_SAMPLE_RATE + "=" + mFreezerStatsdSampleRate);
pw.println(" " + KEY_FREEZER_DEBOUNCE_TIMEOUT + "=" + mFreezerDebounceTimeout);
if (DEBUG_COMPACTION) {
diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java
index 61c92b701346..649d05036027 100644
--- a/services/core/java/com/android/server/am/OomAdjuster.java
+++ b/services/core/java/com/android/server/am/OomAdjuster.java
@@ -3035,6 +3035,10 @@ public final class OomAdjuster {
return;
}
+ if (app.mOptRecord.isFreezeExempt()) {
+ return;
+ }
+
final ProcessCachedOptimizerRecord opt = app.mOptRecord;
// if an app is already frozen and shouldNotFreeze becomes true, immediately unfreeze
if (opt.isFrozen() && opt.shouldNotFreeze()) {
diff --git a/services/core/java/com/android/server/am/ProcessCachedOptimizerRecord.java b/services/core/java/com/android/server/am/ProcessCachedOptimizerRecord.java
index 026c1d3fd204..a33e7e5bac37 100644
--- a/services/core/java/com/android/server/am/ProcessCachedOptimizerRecord.java
+++ b/services/core/java/com/android/server/am/ProcessCachedOptimizerRecord.java
@@ -80,6 +80,12 @@ final class ProcessCachedOptimizerRecord {
@GuardedBy("mProcLock")
private boolean mShouldNotFreeze;
+ /**
+ * Exempt from freezer (now for system apps with INSTALL_PACKAGES permission)
+ */
+ @GuardedBy("mProcLock")
+ private boolean mFreezeExempt;
+
@GuardedBy("mProcLock")
long getLastCompactTime() {
return mLastCompactTime;
@@ -160,6 +166,16 @@ final class ProcessCachedOptimizerRecord {
mShouldNotFreeze = shouldNotFreeze;
}
+ @GuardedBy("mProcLock")
+ boolean isFreezeExempt() {
+ return mFreezeExempt;
+ }
+
+ @GuardedBy("mPreLock")
+ void setFreezeExempt(boolean exempt) {
+ mFreezeExempt = exempt;
+ }
+
ProcessCachedOptimizerRecord(ProcessRecord app) {
mApp = app;
mProcLock = app.mService.mProcLock;
@@ -173,6 +189,7 @@ final class ProcessCachedOptimizerRecord {
void dump(PrintWriter pw, String prefix, long nowUptime) {
pw.print(prefix); pw.print("lastCompactTime="); pw.print(mLastCompactTime);
pw.print(" lastCompactAction="); pw.println(mLastCompactAction);
+ pw.print(prefix); pw.print("isFreezeExempt="); pw.print(mFreezeExempt);
pw.print(" " + IS_FROZEN + "="); pw.println(mFrozen);
}
}
diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java
index fae941d172a2..5a9c4dea4703 100644
--- a/services/core/java/com/android/server/am/ProcessList.java
+++ b/services/core/java/com/android/server/am/ProcessList.java
@@ -54,6 +54,7 @@ import static com.android.server.am.ActivityManagerService.TAG_NETWORK;
import static com.android.server.am.ActivityManagerService.TAG_PROCESSES;
import static com.android.server.am.ActivityManagerService.TAG_UID_OBSERVERS;
+import android.Manifest;
import android.annotation.NonNull;
import android.app.ActivityManager;
import android.app.ActivityManager.ProcessCapability;
@@ -76,6 +77,7 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ApplicationInfo;
import android.content.pm.IPackageManager;
+import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
import android.content.res.Resources;
import android.graphics.Point;
@@ -1774,8 +1776,8 @@ public final class ProcessList {
checkSlow(startTime, "startProcess: done updating cpu stats");
try {
+ final int userId = UserHandle.getUserId(app.uid);
try {
- final int userId = UserHandle.getUserId(app.uid);
AppGlobals.getPackageManager().checkPackageStartable(app.info.packageName, userId);
} catch (RemoteException e) {
throw e.rethrowAsRuntimeException();
@@ -1798,6 +1800,12 @@ public final class ProcessList {
app.info.packageName);
externalStorageAccess = storageManagerInternal.hasExternalStorageAccess(uid,
app.info.packageName);
+ if (pm.checkPermission(Manifest.permission.INSTALL_PACKAGES,
+ app.info.packageName, userId)
+ == PackageManager.PERMISSION_GRANTED) {
+ Slog.i(TAG, app.info.packageName + " is exempt from freezer");
+ app.mOptRecord.setFreezeExempt(true);
+ }
} catch (RemoteException e) {
throw e.rethrowAsRuntimeException();
}