diff options
| author | 2021-04-28 01:26:42 +0000 | |
|---|---|---|
| committer | 2021-04-28 01:26:42 +0000 | |
| commit | e5e92aee86ba9b1e3db5e5a08bdd9c3c90e841c9 (patch) | |
| tree | 0aafed8680352921bd53804d29c759d55426331f | |
| parent | 1700fa9e5cbe7fd0ae5ec3f80e49627c16bd0015 (diff) | |
| parent | e8317ba8200fd51ef1365ddd10bc239a48f17297 (diff) | |
Merge "Exempt apps with INSTALL_PACKAGES from freezer" into sc-dev
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(); } |