From 3527866d8d3cb81e89cec195a0106a01abe6f6e7 Mon Sep 17 00:00:00 2001 From: Li Li Date: Sun, 25 Apr 2021 00:38:20 -0700 Subject: [PATCH] Exempt apps with INSTALL_PACKAGES from freezer System applications with INSTALL_PACKAGES permission, like store apps, have long-running processes in order to keep the system stable and secure. Don't freeze them even if they are cached. Bug: 184584402 Test: Verified store apps with the permission won't be frozen. Change-Id: I4ae45a3688ac6d50c0e7d6ef11ce506b283ee82f Signed-off-by: Li Li --- .../android/server/am/CachedAppOptimizer.java | 2 +- .../java/com/android/server/am/OomAdjuster.java | 4 ++++ .../server/am/ProcessCachedOptimizerRecord.java | 17 +++++++++++++++++ .../java/com/android/server/am/ProcessList.java | 10 +++++++++- 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 8dc9d03dedb76..cc750ce3eefe1 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 960cc42e8ec95..98f5cba51c766 100644 --- a/services/core/java/com/android/server/am/OomAdjuster.java +++ b/services/core/java/com/android/server/am/OomAdjuster.java @@ -3037,6 +3037,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 026c1d3fd204a..a33e7e5bac373 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 fae941d172a21..5a9c4dea47034 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(); }