Emit TRIM_MEMORY_UI_HIDDEN event on switching to background
Previously it won't be emitted while switching from foreground to cached, but we should send it on the visibility changes. Bug: 194748319 Test: atest CtsAppTestCases Change-Id: I901d7d32790d6b888f960ca1bdfb160ea1786cde
This commit is contained in:
@@ -1047,6 +1047,7 @@ public class AppProfiler {
|
||||
mService.setProcessTrackerStateLOSP(app, trackerMemFactor, now);
|
||||
state.setProcStateChanged(false);
|
||||
}
|
||||
trimMemoryUiHiddenIfNecessaryLSP(app);
|
||||
if (curProcState >= ActivityManager.PROCESS_STATE_HOME && !app.isKilledByAm()) {
|
||||
if (trimMemoryLevel < curLevel[0] && (thread = app.getThread()) != null) {
|
||||
try {
|
||||
@@ -1089,24 +1090,6 @@ public class AppProfiler {
|
||||
}
|
||||
profile.setTrimMemoryLevel(ComponentCallbacks2.TRIM_MEMORY_BACKGROUND);
|
||||
} else {
|
||||
if ((curProcState >= ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND
|
||||
|| state.isSystemNoUi()) && profile.hasPendingUiClean()) {
|
||||
// If this application is now in the background and it
|
||||
// had done UI, then give it the special trim level to
|
||||
// have it free UI resources.
|
||||
final int level = ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN;
|
||||
if (trimMemoryLevel < level && (thread = app.getThread()) != null) {
|
||||
try {
|
||||
if (DEBUG_SWITCH || DEBUG_OOM_ADJ) {
|
||||
Slog.v(TAG_OOM_ADJ, "Trimming memory of bg-ui "
|
||||
+ app.processName + " to " + level);
|
||||
}
|
||||
thread.scheduleTrimMemory(level);
|
||||
} catch (RemoteException e) {
|
||||
}
|
||||
}
|
||||
profile.setPendingUiClean(false);
|
||||
}
|
||||
if (trimMemoryLevel < fgTrimLevel && (thread = app.getThread()) != null) {
|
||||
try {
|
||||
if (DEBUG_SWITCH || DEBUG_OOM_ADJ) {
|
||||
@@ -1133,28 +1116,36 @@ public class AppProfiler {
|
||||
mService.setProcessTrackerStateLOSP(app, trackerMemFactor, now);
|
||||
state.setProcStateChanged(false);
|
||||
}
|
||||
if ((state.getCurProcState() >= ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND
|
||||
|| state.isSystemNoUi()) && profile.hasPendingUiClean()) {
|
||||
if (profile.getTrimMemoryLevel() < ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN
|
||||
&& (thread = app.getThread()) != null) {
|
||||
try {
|
||||
if (DEBUG_SWITCH || DEBUG_OOM_ADJ) {
|
||||
Slog.v(TAG_OOM_ADJ,
|
||||
"Trimming memory of ui hidden " + app.processName
|
||||
+ " to " + ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN);
|
||||
}
|
||||
thread.scheduleTrimMemory(ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN);
|
||||
} catch (RemoteException e) {
|
||||
}
|
||||
}
|
||||
profile.setPendingUiClean(false);
|
||||
}
|
||||
trimMemoryUiHiddenIfNecessaryLSP(app);
|
||||
profile.setTrimMemoryLevel(0);
|
||||
});
|
||||
}
|
||||
return allChanged;
|
||||
}
|
||||
|
||||
@GuardedBy({"mService", "mProcLock"})
|
||||
private void trimMemoryUiHiddenIfNecessaryLSP(ProcessRecord app) {
|
||||
if ((app.mState.getCurProcState() >= ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND
|
||||
|| app.mState.isSystemNoUi()) && app.mProfile.hasPendingUiClean()) {
|
||||
// If this application is now in the background and it
|
||||
// had done UI, then give it the special trim level to
|
||||
// have it free UI resources.
|
||||
final int level = ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN;
|
||||
IApplicationThread thread;
|
||||
if (app.mProfile.getTrimMemoryLevel() < level && (thread = app.getThread()) != null) {
|
||||
try {
|
||||
if (DEBUG_SWITCH || DEBUG_OOM_ADJ) {
|
||||
Slog.v(TAG_OOM_ADJ, "Trimming memory of bg-ui "
|
||||
+ app.processName + " to " + level);
|
||||
}
|
||||
thread.scheduleTrimMemory(level);
|
||||
} catch (RemoteException e) {
|
||||
}
|
||||
}
|
||||
app.mProfile.setPendingUiClean(false);
|
||||
}
|
||||
}
|
||||
|
||||
@GuardedBy("mProcLock")
|
||||
long getLowRamTimeSinceIdleLPr(long now) {
|
||||
return mLowRamTimeSinceLastIdle + (mLowRamStartTime > 0 ? (now - mLowRamStartTime) : 0);
|
||||
|
||||
Reference in New Issue
Block a user