summaryrefslogtreecommitdiffstats
path: root/services/java/com
diff options
context:
space:
mode:
authorDianne Hackborn <hackbod@google.com>2011-07-21 16:02:07 -0700
committerDianne Hackborn <hackbod@google.com>2011-07-21 16:02:56 -0700
commitf0754f5ba7a45b517cffcb3c2c96f2a32aeac06d (patch)
tree5083b856cd3f6825fe674d00b3f955a591faff72 /services/java/com
parent040c2f91ed0968f3193031cabbf51b756930adc7 (diff)
downloadframeworks_base-f0754f5ba7a45b517cffcb3c2c96f2a32aeac06d.zip
frameworks_base-f0754f5ba7a45b517cffcb3c2c96f2a32aeac06d.tar.gz
frameworks_base-f0754f5ba7a45b517cffcb3c2c96f2a32aeac06d.tar.bz2
Fix bug where memory trim was not being delivered with correct level.
Also improve how we handle services, keeping track of whether they showed UI and if so putting them immediately on the LRU list. Change-Id: I816834668722fc67071863acdb4a7f427a982a08
Diffstat (limited to 'services/java/com')
-rw-r--r--services/java/com/android/server/am/ActivityManagerService.java48
-rw-r--r--services/java/com/android/server/am/ActivityStack.java1
-rw-r--r--services/java/com/android/server/am/ProcessRecord.java2
3 files changed, 32 insertions, 19 deletions
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index 0924b86..18efc0c 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -3628,6 +3628,7 @@ public final class ActivityManagerService extends ActivityManagerNative
app.setSchedGroup = Process.THREAD_GROUP_BG_NONINTERACTIVE;
app.forcingToForeground = null;
app.foregroundServices = false;
+ app.hasShownUi = false;
app.debugging = false;
mHandler.removeMessages(PROC_START_TIMEOUT_MSG, app);
@@ -9218,6 +9219,7 @@ public final class ActivityManagerService extends ActivityManagerNative
app.forcingToForeground = null;
app.foregroundServices = false;
app.foregroundActivities = false;
+ app.hasShownUi = false;
killServicesLocked(app, true);
@@ -9331,8 +9333,6 @@ public final class ActivityManagerService extends ActivityManagerNative
// This app is persistent, so we need to keep its record around.
// If it is not already on the pending app list, add it there
// and start a new process for it.
- app.forcingToForeground = null;
- app.foregroundServices = false;
if (mPersistentStartingProcesses.indexOf(app) < 0) {
mPersistentStartingProcesses.add(app);
restart = true;
@@ -12728,21 +12728,31 @@ public final class ActivityManagerService extends ActivityManagerNative
while (jt.hasNext() && adj > FOREGROUND_APP_ADJ) {
ServiceRecord s = jt.next();
if (s.startRequested) {
- if (now < (s.lastActivity+MAX_SERVICE_INACTIVITY)) {
- // This service has seen some activity within
- // recent memory, so we will keep its process ahead
- // of the background processes.
+ if (app.hasShownUi) {
+ // If this process has shown some UI, let it immediately
+ // go to the LRU list because it may be pretty heavy with
+ // UI stuff. We'll tag it with a label just to help
+ // debug and understand what is going on.
if (adj > SECONDARY_SERVER_ADJ) {
- adj = SECONDARY_SERVER_ADJ;
- app.adjType = "started-services";
- app.hidden = false;
+ app.adjType = "started-bg-ui-services";
+ }
+ } else {
+ if (now < (s.lastActivity+MAX_SERVICE_INACTIVITY)) {
+ // This service has seen some activity within
+ // recent memory, so we will keep its process ahead
+ // of the background processes.
+ if (adj > SECONDARY_SERVER_ADJ) {
+ adj = SECONDARY_SERVER_ADJ;
+ app.adjType = "started-services";
+ app.hidden = false;
+ }
+ }
+ // If we have let the service slide into the background
+ // state, still have some text describing what it is doing
+ // even though the service no longer has an impact.
+ if (adj > SECONDARY_SERVER_ADJ) {
+ app.adjType = "started-bg-services";
}
- }
- // If we have let the service slide into the background
- // state, still have some text describing what it is doing
- // even though the service no longer has an impact.
- if (adj > SECONDARY_SERVER_ADJ) {
- app.adjType = "started-bg-services";
}
// Don't kill this process because it is doing work; it
// has said it is doing work.
@@ -13351,15 +13361,15 @@ public final class ActivityManagerService extends ActivityManagerNative
break;
}
}
- } else if (app.curAdj >= PERCEPTIBLE_APP_ADJ) {
- if (app.trimMemoryLevel < ComponentCallbacks.TRIM_MEMORY_INVISIBLE
+ } else if (app.curAdj == HEAVY_WEIGHT_APP_ADJ) {
+ if (app.trimMemoryLevel < ComponentCallbacks.TRIM_MEMORY_BACKGROUND
&& app.thread != null) {
try {
- app.thread.scheduleTrimMemory(ComponentCallbacks.TRIM_MEMORY_INVISIBLE);
+ app.thread.scheduleTrimMemory(ComponentCallbacks.TRIM_MEMORY_BACKGROUND);
} catch (RemoteException e) {
}
}
- app.trimMemoryLevel = ComponentCallbacks.TRIM_MEMORY_INVISIBLE;
+ app.trimMemoryLevel = ComponentCallbacks.TRIM_MEMORY_BACKGROUND;
} else {
app.trimMemoryLevel = 0;
}
diff --git a/services/java/com/android/server/am/ActivityStack.java b/services/java/com/android/server/am/ActivityStack.java
index 0d89081..cc58eaf 100644
--- a/services/java/com/android/server/am/ActivityStack.java
+++ b/services/java/com/android/server/am/ActivityStack.java
@@ -559,6 +559,7 @@ final class ActivityStack {
r.forceNewConfig = false;
showAskCompatModeDialogLocked(r);
r.compat = mService.compatibilityInfoForPackageLocked(r.info.applicationInfo);
+ app.hasShownUi = true;
app.thread.scheduleLaunchActivity(new Intent(r.intent), r,
System.identityHashCode(r),
r.info, r.compat, r.icicle, results, newIntents, !andResume,
diff --git a/services/java/com/android/server/am/ProcessRecord.java b/services/java/com/android/server/am/ProcessRecord.java
index 9e597aa..5b59363 100644
--- a/services/java/com/android/server/am/ProcessRecord.java
+++ b/services/java/com/android/server/am/ProcessRecord.java
@@ -66,6 +66,7 @@ class ProcessRecord {
boolean setIsForeground; // Running foreground UI when last set?
boolean foregroundServices; // Running any services that are foreground?
boolean foregroundActivities; // Running any activities that are foreground?
+ boolean hasShownUi; // Has UI been shown in this process since it was started?
boolean bad; // True if disabled in the bad process list
boolean killedBackground; // True when proc has been killed due to too many bg
String waitingToKill; // Process is waiting to be killed when in the bg; reason
@@ -185,6 +186,7 @@ class ProcessRecord {
pw.print(prefix); pw.print("curSchedGroup="); pw.print(curSchedGroup);
pw.print(" setSchedGroup="); pw.print(setSchedGroup);
pw.print(" trimMemoryLevel="); pw.println(trimMemoryLevel);
+ pw.print(" hasShownUi="); pw.println(hasShownUi);
pw.print(prefix); pw.print("setIsForeground="); pw.print(setIsForeground);
pw.print(" foregroundServices="); pw.print(foregroundServices);
pw.print(" forcingToForeground="); pw.println(forcingToForeground);