Switch IProcessObserver to report process state

When IProcessObserver was created, the only information
we had for the state of a process was its "importance".
Now we have the process state, which is much more useful.
Switch to reporting that.

Change-Id: Icdb3eea8cf96f4eff7ed3d584f940a1bd9cc3884
This commit is contained in:
Dianne Hackborn
2014-04-29 17:56:57 -07:00
parent dbe2aed24f
commit 684bf34ee8
6 changed files with 83 additions and 112 deletions

View File

@@ -1626,13 +1626,6 @@ public class ActivityManager {
*/
public int lastTrimLevel;
/**
* Constant for {@link #importance}: this is a persistent process.
* Only used when reporting to process observers.
* @hide
*/
public static final int IMPORTANCE_PERSISTENT = 50;
/**
* Constant for {@link #importance}: this process is running the
* foreground UI.
@@ -1748,9 +1741,16 @@ public class ActivityManager {
*/
public int importanceReasonImportance;
/**
* Current process state, as per PROCESS_STATE_* constants.
* @hide
*/
public int processState;
public RunningAppProcessInfo() {
importance = IMPORTANCE_FOREGROUND;
importanceReasonCode = REASON_UNKNOWN;
processState = PROCESS_STATE_IMPORTANT_FOREGROUND;
}
public RunningAppProcessInfo(String pProcessName, int pPid, String pArr[]) {
@@ -1776,6 +1776,7 @@ public class ActivityManager {
dest.writeInt(importanceReasonPid);
ComponentName.writeToParcel(importanceReasonComponent, dest);
dest.writeInt(importanceReasonImportance);
dest.writeInt(processState);
}
public void readFromParcel(Parcel source) {
@@ -1791,6 +1792,7 @@ public class ActivityManager {
importanceReasonPid = source.readInt();
importanceReasonComponent = ComponentName.readFromParcel(source);
importanceReasonImportance = source.readInt();
processState = source.readInt();
}
public static final Creator<RunningAppProcessInfo> CREATOR =

View File

@@ -20,7 +20,7 @@ package android.app;
oneway interface IProcessObserver {
void onForegroundActivitiesChanged(int pid, int uid, boolean foregroundActivities);
void onImportanceChanged(int pid, int uid, int importance);
void onProcessStateChanged(int pid, int uid, int procState);
void onProcessDied(int pid, int uid);
}

View File

@@ -1017,11 +1017,11 @@ public final class ActivityManagerService extends ActivityManagerNative
static class ProcessChangeItem {
static final int CHANGE_ACTIVITIES = 1<<0;
static final int CHANGE_IMPORTANCE= 1<<1;
static final int CHANGE_PROCESS_STATE = 1<<1;
int changes;
int uid;
int pid;
int importance;
int processState;
boolean foregroundActivities;
}
@@ -3200,11 +3200,10 @@ public final class ActivityManagerService extends ActivityManagerNative
observer.onForegroundActivitiesChanged(item.pid, item.uid,
item.foregroundActivities);
}
if ((item.changes&ProcessChangeItem.CHANGE_IMPORTANCE) != 0) {
if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG, "IMPORTANCE CHANGED pid="
+ item.pid + " uid=" + item.uid + ": " + item.importance);
observer.onImportanceChanged(item.pid, item.uid,
item.importance);
if ((item.changes&ProcessChangeItem.CHANGE_PROCESS_STATE) != 0) {
if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG, "PROCSTATE CHANGED pid="
+ item.pid + " uid=" + item.uid + ": " + item.processState);
observer.onProcessStateChanged(item.pid, item.uid, item.processState);
}
}
} catch (RemoteException e) {
@@ -10635,6 +10634,7 @@ public final class ActivityManagerService extends ActivityManagerNative
int adj = app.curAdj;
outInfo.importance = oomAdjToImportance(adj, outInfo);
outInfo.importanceReasonCode = app.adjTypeCode;
outInfo.processState = app.curProcState;
}
public List<ActivityManager.RunningAppProcessInfo> getRunningAppProcesses() {
@@ -14690,7 +14690,7 @@ public final class ActivityManagerService extends ActivityManagerNative
app.keeping = true;
app.curSchedGroup = Process.THREAD_GROUP_DEFAULT;
app.curProcState = ActivityManager.PROCESS_STATE_PERSISTENT;
// System process can do UI, and when they do we want to have
// System processes can do UI, and when they do we want to have
// them trim their memory after the user leaves the UI. To
// facilitate this, here we need to determine whether or not it
// is currently showing UI.
@@ -15308,86 +15308,7 @@ public final class ActivityManagerService extends ActivityManagerNative
adj = app.modifyRawOomAdj(adj);
app.curProcState = procState;
int importance = app.memImportance;
if (importance == 0 || adj != app.curAdj || schedGroup != app.curSchedGroup) {
app.curAdj = adj;
app.curSchedGroup = schedGroup;
if (!interesting) {
// For this reporting, if there is not something explicitly
// interesting in this process then we will push it to the
// background importance.
importance = ActivityManager.RunningAppProcessInfo.IMPORTANCE_BACKGROUND;
} else if (adj >= ProcessList.CACHED_APP_MIN_ADJ) {
importance = ActivityManager.RunningAppProcessInfo.IMPORTANCE_BACKGROUND;
} else if (adj >= ProcessList.SERVICE_B_ADJ) {
importance = ActivityManager.RunningAppProcessInfo.IMPORTANCE_SERVICE;
} else if (adj >= ProcessList.HOME_APP_ADJ) {
importance = ActivityManager.RunningAppProcessInfo.IMPORTANCE_BACKGROUND;
} else if (adj >= ProcessList.SERVICE_ADJ) {
importance = ActivityManager.RunningAppProcessInfo.IMPORTANCE_SERVICE;
} else if (adj >= ProcessList.HEAVY_WEIGHT_APP_ADJ) {
importance = ActivityManager.RunningAppProcessInfo.IMPORTANCE_CANT_SAVE_STATE;
} else if (adj >= ProcessList.PERCEPTIBLE_APP_ADJ) {
importance = ActivityManager.RunningAppProcessInfo.IMPORTANCE_PERCEPTIBLE;
} else if (adj >= ProcessList.VISIBLE_APP_ADJ) {
importance = ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE;
} else if (adj >= ProcessList.FOREGROUND_APP_ADJ) {
importance = ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND;
} else {
importance = ActivityManager.RunningAppProcessInfo.IMPORTANCE_PERSISTENT;
}
}
int changes = importance != app.memImportance ? ProcessChangeItem.CHANGE_IMPORTANCE : 0;
if (foregroundActivities != app.foregroundActivities) {
changes |= ProcessChangeItem.CHANGE_ACTIVITIES;
}
if (changes != 0) {
if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG, "Changes in " + app + ": " + changes);
app.memImportance = importance;
app.foregroundActivities = foregroundActivities;
int i = mPendingProcessChanges.size()-1;
ProcessChangeItem item = null;
while (i >= 0) {
item = mPendingProcessChanges.get(i);
if (item.pid == app.pid) {
if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG, "Re-using existing item: " + item);
break;
}
i--;
}
if (i < 0) {
// No existing item in pending changes; need a new one.
final int NA = mAvailProcessChanges.size();
if (NA > 0) {
item = mAvailProcessChanges.remove(NA-1);
if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG, "Retreiving available item: " + item);
} else {
item = new ProcessChangeItem();
if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG, "Allocating new item: " + item);
}
item.changes = 0;
item.pid = app.pid;
item.uid = app.info.uid;
if (mPendingProcessChanges.size() == 0) {
if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG,
"*** Enqueueing dispatch processes changed!");
mHandler.obtainMessage(DISPATCH_PROCESSES_CHANGED).sendToTarget();
}
mPendingProcessChanges.add(item);
}
item.changes |= changes;
item.importance = importance;
item.foregroundActivities = foregroundActivities;
if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG, "Item "
+ Integer.toHexString(System.identityHashCode(item))
+ " " + app.toShortString() + ": changes=" + item.changes
+ " importance=" + item.importance
+ " foreground=" + item.foregroundActivities
+ " type=" + app.adjType + " source=" + app.adjSource
+ " target=" + app.adjTarget);
}
app.foregroundActivities = foregroundActivities;
return app.curRawAdj;
}
@@ -15660,7 +15581,7 @@ public final class ActivityManagerService extends ActivityManagerNative
}
private final boolean applyOomAdjLocked(ProcessRecord app, boolean wasKeeping,
ProcessRecord TOP_APP, boolean doingAll, boolean reportingProcessState, long now) {
ProcessRecord TOP_APP, boolean doingAll, long now) {
boolean success = true;
if (app.curRawAdj != app.setRawAdj) {
@@ -15679,6 +15600,8 @@ public final class ActivityManagerService extends ActivityManagerNative
app.setRawAdj = app.curRawAdj;
}
int changes = 0;
if (app.curAdj != app.setAdj) {
ProcessList.setOomAdj(app.pid, app.curAdj);
if (DEBUG_SWITCH || DEBUG_OOM_ADJ) Slog.v(
@@ -15720,9 +15643,14 @@ public final class ActivityManagerService extends ActivityManagerNative
app.curSchedGroup <= Process.THREAD_GROUP_BG_NONINTERACTIVE);
}
}
if (app.repForegroundActivities != app.foregroundActivities) {
app.repForegroundActivities = app.foregroundActivities;
changes |= ProcessChangeItem.CHANGE_ACTIVITIES;
}
if (app.repProcState != app.curProcState) {
app.repProcState = app.curProcState;
if (!reportingProcessState && app.thread != null) {
changes |= ProcessChangeItem.CHANGE_PROCESS_STATE;
if (app.thread != null) {
try {
if (false) {
//RuntimeException h = new RuntimeException("here");
@@ -15767,6 +15695,51 @@ public final class ActivityManagerService extends ActivityManagerNative
app.procStateChanged = true;
}
}
if (changes != 0) {
if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG, "Changes in " + app + ": " + changes);
int i = mPendingProcessChanges.size()-1;
ProcessChangeItem item = null;
while (i >= 0) {
item = mPendingProcessChanges.get(i);
if (item.pid == app.pid) {
if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG, "Re-using existing item: " + item);
break;
}
i--;
}
if (i < 0) {
// No existing item in pending changes; need a new one.
final int NA = mAvailProcessChanges.size();
if (NA > 0) {
item = mAvailProcessChanges.remove(NA-1);
if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG, "Retreiving available item: " + item);
} else {
item = new ProcessChangeItem();
if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG, "Allocating new item: " + item);
}
item.changes = 0;
item.pid = app.pid;
item.uid = app.info.uid;
if (mPendingProcessChanges.size() == 0) {
if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG,
"*** Enqueueing dispatch processes changed!");
mHandler.obtainMessage(DISPATCH_PROCESSES_CHANGED).sendToTarget();
}
mPendingProcessChanges.add(item);
}
item.changes |= changes;
item.processState = app.repProcState;
item.foregroundActivities = app.repForegroundActivities;
if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG, "Item "
+ Integer.toHexString(System.identityHashCode(item))
+ " " + app.toShortString() + ": changes=" + item.changes
+ " procState=" + item.processState
+ " foreground=" + item.foregroundActivities
+ " type=" + app.adjType + " source=" + app.adjSource
+ " target=" + app.adjTarget);
}
return success;
}
@@ -15777,7 +15750,7 @@ public final class ActivityManagerService extends ActivityManagerNative
}
private final boolean updateOomAdjLocked(ProcessRecord app, int cachedAdj,
ProcessRecord TOP_APP, boolean doingAll, boolean reportingProcessState, long now) {
ProcessRecord TOP_APP, boolean doingAll, long now) {
if (app.thread == null) {
return false;
}
@@ -15786,8 +15759,7 @@ public final class ActivityManagerService extends ActivityManagerNative
computeOomAdjLocked(app, cachedAdj, TOP_APP, doingAll, now);
return applyOomAdjLocked(app, wasKeeping, TOP_APP, doingAll,
reportingProcessState, now);
return applyOomAdjLocked(app, wasKeeping, TOP_APP, doingAll, now);
}
final void updateProcessForegroundLocked(ProcessRecord proc, boolean isForeground,
@@ -15853,10 +15825,6 @@ public final class ActivityManagerService extends ActivityManagerNative
}
final boolean updateOomAdjLocked(ProcessRecord app) {
return updateOomAdjLocked(app, false);
}
final boolean updateOomAdjLocked(ProcessRecord app, boolean doingProcessState) {
final ActivityRecord TOP_ACT = resumedAppLocked();
final ProcessRecord TOP_APP = TOP_ACT != null ? TOP_ACT.app : null;
final boolean wasCached = app.cached;
@@ -15869,7 +15837,7 @@ public final class ActivityManagerService extends ActivityManagerNative
// need to do a complete oom adj.
final int cachedAdj = app.curRawAdj >= ProcessList.CACHED_APP_MIN_ADJ
? app.curRawAdj : ProcessList.UNKNOWN_ADJ;
boolean success = updateOomAdjLocked(app, cachedAdj, TOP_APP, false, doingProcessState,
boolean success = updateOomAdjLocked(app, cachedAdj, TOP_APP, false,
SystemClock.uptimeMillis());
if (wasCached != app.cached || app.curRawAdj == ProcessList.UNKNOWN_ADJ) {
// Changed to/from cached state, so apps after it in the LRU
@@ -16002,7 +15970,7 @@ public final class ActivityManagerService extends ActivityManagerNative
}
}
applyOomAdjLocked(app, wasKeeping, TOP_APP, true, false, now);
applyOomAdjLocked(app, wasKeeping, TOP_APP, true, now);
// Count the number of process types.
switch (app.curProcState) {

View File

@@ -503,7 +503,7 @@ public final class BroadcastQueue {
// are already core system stuff so don't matter for this.
r.curApp = filter.receiverList.app;
filter.receiverList.app.curReceiver = r;
mService.updateOomAdjLocked(r.curApp, true);
mService.updateOomAdjLocked(r.curApp);
}
}
try {

View File

@@ -77,7 +77,6 @@ final class ProcessRecord {
int curSchedGroup; // Currently desired scheduling class
int setSchedGroup; // Last set to background scheduling class
int trimMemoryLevel; // Last selected memory trimming level
int memImportance; // Importance constant computed from curAdj
int curProcState = -1; // Currently computed process state: ActivityManager.PROCESS_STATE_*
int repProcState = -1; // Last reported process state
int setProcState = -1; // Last set process state in process tracker
@@ -91,6 +90,7 @@ final class ProcessRecord {
boolean hasStartedServices; // Are there any started services running in this process?
boolean foregroundServices; // Running any services that are foreground?
boolean foregroundActivities; // Running any activities that are foreground?
boolean repForegroundActivities; // Last reported foreground activities.
boolean systemNoUi; // This is a system process, but not currently showing UI.
boolean hasShownUi; // Has UI been shown in this process since it was started?
boolean pendingUiClean; // Want to clean up resources from showing UI?
@@ -267,9 +267,10 @@ final class ProcessRecord {
pw.print(prefix); pw.print("persistent="); pw.print(persistent);
pw.print(" removed="); pw.println(removed);
}
if (hasClientActivities || foregroundActivities) {
if (hasClientActivities || foregroundActivities || repForegroundActivities) {
pw.print(prefix); pw.print("hasClientActivities="); pw.print(hasClientActivities);
pw.print(" foregroundActivities="); pw.println(foregroundActivities);
pw.print(" foregroundActivities="); pw.print(foregroundActivities);
pw.print(" (rep="); pw.print(repForegroundActivities); pw.println(")");
}
if (hasStartedServices) {
pw.print(prefix); pw.print("hasStartedServices="); pw.println(hasStartedServices);

View File

@@ -410,7 +410,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
}
@Override
public void onImportanceChanged(int pid, int uid, int importance) {
public void onProcessStateChanged(int pid, int uid, int procState) {
}
@Override