summaryrefslogtreecommitdiff
path: root/core/java/android/app/ActivityThread.java
diff options
context:
space:
mode:
Diffstat (limited to 'core/java/android/app/ActivityThread.java')
-rw-r--r--core/java/android/app/ActivityThread.java547
1 files changed, 283 insertions, 264 deletions
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index df63ab342dfe..5e3dc023f233 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -534,17 +534,10 @@ public final class ActivityThread {
private native void dumpGraphicsInfo(FileDescriptor fd);
private class ApplicationThread extends ApplicationThreadNative {
- private static final String HEAP_FULL_COLUMN
- = "%13s %8s %8s %8s %8s %8s %8s %8s %8s %8s %8s";
- private static final String HEAP_COLUMN
- = "%13s %8s %8s %8s %8s %8s %8s %8s";
private static final String ONE_COUNT_COLUMN = "%21s %8d";
private static final String TWO_COUNT_COLUMNS = "%21s %8d %21s %8d";
private static final String DB_INFO_FORMAT = " %8s %8s %14s %14s %s";
- // Formatting for checkin service - update version if row format changes
- private static final int ACTIVITY_THREAD_CHECKIN_VERSION = 3;
-
private int mLastProcessState = -1;
private void updatePendingConfiguration(Configuration config) {
@@ -558,7 +551,7 @@ public final class ActivityThread {
public final void schedulePauseActivity(IBinder token, boolean finished,
boolean userLeaving, int configChanges) {
- queueOrSendMessage(
+ sendMessage(
finished ? H.PAUSE_ACTIVITY_FINISHING : H.PAUSE_ACTIVITY,
token,
(userLeaving ? 1 : 0),
@@ -567,32 +560,32 @@ public final class ActivityThread {
public final void scheduleStopActivity(IBinder token, boolean showWindow,
int configChanges) {
- queueOrSendMessage(
+ sendMessage(
showWindow ? H.STOP_ACTIVITY_SHOW : H.STOP_ACTIVITY_HIDE,
token, 0, configChanges);
}
public final void scheduleWindowVisibility(IBinder token, boolean showWindow) {
- queueOrSendMessage(
+ sendMessage(
showWindow ? H.SHOW_WINDOW : H.HIDE_WINDOW,
token);
}
public final void scheduleSleeping(IBinder token, boolean sleeping) {
- queueOrSendMessage(H.SLEEPING, token, sleeping ? 1 : 0);
+ sendMessage(H.SLEEPING, token, sleeping ? 1 : 0);
}
public final void scheduleResumeActivity(IBinder token, int processState,
boolean isForward) {
updateProcessState(processState, false);
- queueOrSendMessage(H.RESUME_ACTIVITY, token, isForward ? 1 : 0);
+ sendMessage(H.RESUME_ACTIVITY, token, isForward ? 1 : 0);
}
public final void scheduleSendResult(IBinder token, List<ResultInfo> results) {
ResultData res = new ResultData();
res.token = token;
res.results = results;
- queueOrSendMessage(H.SEND_RESULT, res);
+ sendMessage(H.SEND_RESULT, res);
}
// we use token to identify this activity without having to send the
@@ -626,7 +619,7 @@ public final class ActivityThread {
updatePendingConfiguration(curConfig);
- queueOrSendMessage(H.LAUNCH_ACTIVITY, r);
+ sendMessage(H.LAUNCH_ACTIVITY, r);
}
public final void scheduleRelaunchActivity(IBinder token,
@@ -641,12 +634,12 @@ public final class ActivityThread {
data.intents = intents;
data.token = token;
- queueOrSendMessage(H.NEW_INTENT, data);
+ sendMessage(H.NEW_INTENT, data);
}
public final void scheduleDestroyActivity(IBinder token, boolean finishing,
int configChanges) {
- queueOrSendMessage(H.DESTROY_ACTIVITY, token, finishing ? 1 : 0,
+ sendMessage(H.DESTROY_ACTIVITY, token, finishing ? 1 : 0,
configChanges);
}
@@ -658,7 +651,7 @@ public final class ActivityThread {
sync, false, mAppThread.asBinder(), sendingUser);
r.info = info;
r.compatInfo = compatInfo;
- queueOrSendMessage(H.RECEIVER, r);
+ sendMessage(H.RECEIVER, r);
}
public final void scheduleCreateBackupAgent(ApplicationInfo app,
@@ -668,7 +661,7 @@ public final class ActivityThread {
d.compatInfo = compatInfo;
d.backupMode = backupMode;
- queueOrSendMessage(H.CREATE_BACKUP_AGENT, d);
+ sendMessage(H.CREATE_BACKUP_AGENT, d);
}
public final void scheduleDestroyBackupAgent(ApplicationInfo app,
@@ -677,7 +670,7 @@ public final class ActivityThread {
d.appInfo = app;
d.compatInfo = compatInfo;
- queueOrSendMessage(H.DESTROY_BACKUP_AGENT, d);
+ sendMessage(H.DESTROY_BACKUP_AGENT, d);
}
public final void scheduleCreateService(IBinder token,
@@ -688,7 +681,7 @@ public final class ActivityThread {
s.info = info;
s.compatInfo = compatInfo;
- queueOrSendMessage(H.CREATE_SERVICE, s);
+ sendMessage(H.CREATE_SERVICE, s);
}
public final void scheduleBindService(IBinder token, Intent intent,
@@ -702,7 +695,7 @@ public final class ActivityThread {
if (DEBUG_SERVICE)
Slog.v(TAG, "scheduleBindService token=" + token + " intent=" + intent + " uid="
+ Binder.getCallingUid() + " pid=" + Binder.getCallingPid());
- queueOrSendMessage(H.BIND_SERVICE, s);
+ sendMessage(H.BIND_SERVICE, s);
}
public final void scheduleUnbindService(IBinder token, Intent intent) {
@@ -710,7 +703,7 @@ public final class ActivityThread {
s.token = token;
s.intent = intent;
- queueOrSendMessage(H.UNBIND_SERVICE, s);
+ sendMessage(H.UNBIND_SERVICE, s);
}
public final void scheduleServiceArgs(IBinder token, boolean taskRemoved, int startId,
@@ -722,11 +715,11 @@ public final class ActivityThread {
s.flags = flags;
s.args = args;
- queueOrSendMessage(H.SERVICE_ARGS, s);
+ sendMessage(H.SERVICE_ARGS, s);
}
public final void scheduleStopService(IBinder token) {
- queueOrSendMessage(H.STOP_SERVICE, token);
+ sendMessage(H.STOP_SERVICE, token);
}
public final void bindApplication(String processName,
@@ -763,24 +756,24 @@ public final class ActivityThread {
data.initProfileFile = profileFile;
data.initProfileFd = profileFd;
data.initAutoStopProfiler = false;
- queueOrSendMessage(H.BIND_APPLICATION, data);
+ sendMessage(H.BIND_APPLICATION, data);
}
public final void scheduleExit() {
- queueOrSendMessage(H.EXIT_APPLICATION, null);
+ sendMessage(H.EXIT_APPLICATION, null);
}
public final void scheduleSuicide() {
- queueOrSendMessage(H.SUICIDE, null);
+ sendMessage(H.SUICIDE, null);
}
public void requestThumbnail(IBinder token) {
- queueOrSendMessage(H.REQUEST_THUMBNAIL, token);
+ sendMessage(H.REQUEST_THUMBNAIL, token);
}
public void scheduleConfigurationChanged(Configuration config) {
updatePendingConfiguration(config);
- queueOrSendMessage(H.CONFIGURATION_CHANGED, config);
+ sendMessage(H.CONFIGURATION_CHANGED, config);
}
public void updateTimeZone() {
@@ -807,7 +800,7 @@ public final class ActivityThread {
data.fd = ParcelFileDescriptor.dup(fd);
data.token = servicetoken;
data.args = args;
- queueOrSendMessage(H.DUMP_SERVICE, data);
+ sendMessage(H.DUMP_SERVICE, data, 0, 0, true /*async*/);
} catch (IOException e) {
Slog.w(TAG, "dumpService failed", e);
}
@@ -825,11 +818,11 @@ public final class ActivityThread {
}
public void scheduleLowMemory() {
- queueOrSendMessage(H.LOW_MEMORY, null);
+ sendMessage(H.LOW_MEMORY, null);
}
public void scheduleActivityConfigurationChanged(IBinder token) {
- queueOrSendMessage(H.ACTIVITY_CONFIGURATION_CHANGED, token);
+ sendMessage(H.ACTIVITY_CONFIGURATION_CHANGED, token);
}
public void profilerControl(boolean start, String path, ParcelFileDescriptor fd,
@@ -837,14 +830,14 @@ public final class ActivityThread {
ProfilerControlData pcd = new ProfilerControlData();
pcd.path = path;
pcd.fd = fd;
- queueOrSendMessage(H.PROFILER_CONTROL, pcd, start ? 1 : 0, profileType);
+ sendMessage(H.PROFILER_CONTROL, pcd, start ? 1 : 0, profileType);
}
public void dumpHeap(boolean managed, String path, ParcelFileDescriptor fd) {
DumpHeapData dhd = new DumpHeapData();
dhd.path = path;
dhd.fd = fd;
- queueOrSendMessage(H.DUMP_HEAP, dhd, managed ? 1 : 0);
+ sendMessage(H.DUMP_HEAP, dhd, managed ? 1 : 0, 0, true /*async*/);
}
public void setSchedulingGroup(int group) {
@@ -860,11 +853,11 @@ public final class ActivityThread {
}
public void dispatchPackageBroadcast(int cmd, String[] packages) {
- queueOrSendMessage(H.DISPATCH_PACKAGE_BROADCAST, packages, cmd);
+ sendMessage(H.DISPATCH_PACKAGE_BROADCAST, packages, cmd);
}
public void scheduleCrash(String msg) {
- queueOrSendMessage(H.SCHEDULE_CRASH, msg);
+ sendMessage(H.SCHEDULE_CRASH, msg);
}
public void dumpActivity(FileDescriptor fd, IBinder activitytoken,
@@ -875,7 +868,7 @@ public final class ActivityThread {
data.token = activitytoken;
data.prefix = prefix;
data.args = args;
- queueOrSendMessage(H.DUMP_ACTIVITY, data);
+ sendMessage(H.DUMP_ACTIVITY, data, 0, 0, true /*async*/);
} catch (IOException e) {
Slog.w(TAG, "dumpActivity failed", e);
}
@@ -888,7 +881,7 @@ public final class ActivityThread {
data.fd = ParcelFileDescriptor.dup(fd);
data.token = providertoken;
data.args = args;
- queueOrSendMessage(H.DUMP_PROVIDER, data);
+ sendMessage(H.DUMP_PROVIDER, data, 0, 0, true /*async*/);
} catch (IOException e) {
Slog.w(TAG, "dumpProvider failed", e);
}
@@ -929,82 +922,14 @@ public final class ActivityThread {
long openSslSocketCount = Debug.countInstancesOfClass(OpenSSLSocketImpl.class);
SQLiteDebug.PagerStats stats = SQLiteDebug.getDatabaseInfo();
- // For checkin, we print one long comma-separated list of values
+ dumpMemInfoTable(pw, memInfo, checkin, dumpFullInfo, dumpDalvik, Process.myPid(),
+ (mBoundApplication != null) ? mBoundApplication.processName : "unknown",
+ nativeMax, nativeAllocated, nativeFree,
+ dalvikMax, dalvikAllocated, dalvikFree);
+
if (checkin) {
// NOTE: if you change anything significant below, also consider changing
// ACTIVITY_THREAD_CHECKIN_VERSION.
- String processName = (mBoundApplication != null)
- ? mBoundApplication.processName : "unknown";
-
- // Header
- pw.print(ACTIVITY_THREAD_CHECKIN_VERSION); pw.print(',');
- pw.print(Process.myPid()); pw.print(',');
- pw.print(processName); pw.print(',');
-
- // Heap info - max
- pw.print(nativeMax); pw.print(',');
- pw.print(dalvikMax); pw.print(',');
- pw.print("N/A,");
- pw.print(nativeMax + dalvikMax); pw.print(',');
-
- // Heap info - allocated
- pw.print(nativeAllocated); pw.print(',');
- pw.print(dalvikAllocated); pw.print(',');
- pw.print("N/A,");
- pw.print(nativeAllocated + dalvikAllocated); pw.print(',');
-
- // Heap info - free
- pw.print(nativeFree); pw.print(',');
- pw.print(dalvikFree); pw.print(',');
- pw.print("N/A,");
- pw.print(nativeFree + dalvikFree); pw.print(',');
-
- // Heap info - proportional set size
- pw.print(memInfo.nativePss); pw.print(',');
- pw.print(memInfo.dalvikPss); pw.print(',');
- pw.print(memInfo.otherPss); pw.print(',');
- pw.print(memInfo.getTotalPss()); pw.print(',');
-
- // Heap info - swappable set size
- pw.print(memInfo.nativeSwappablePss); pw.print(',');
- pw.print(memInfo.dalvikSwappablePss); pw.print(',');
- pw.print(memInfo.otherSwappablePss); pw.print(',');
- pw.print(memInfo.getTotalSwappablePss()); pw.print(',');
-
- // Heap info - shared dirty
- pw.print(memInfo.nativeSharedDirty); pw.print(',');
- pw.print(memInfo.dalvikSharedDirty); pw.print(',');
- pw.print(memInfo.otherSharedDirty); pw.print(',');
- pw.print(memInfo.getTotalSharedDirty()); pw.print(',');
-
- // Heap info - shared clean
- pw.print(memInfo.nativeSharedClean); pw.print(',');
- pw.print(memInfo.dalvikSharedClean); pw.print(',');
- pw.print(memInfo.otherSharedClean); pw.print(',');
- pw.print(memInfo.getTotalSharedClean()); pw.print(',');
-
- // Heap info - private Dirty
- pw.print(memInfo.nativePrivateDirty); pw.print(',');
- pw.print(memInfo.dalvikPrivateDirty); pw.print(',');
- pw.print(memInfo.otherPrivateDirty); pw.print(',');
- pw.print(memInfo.getTotalPrivateDirty()); pw.print(',');
-
- // Heap info - private Clean
- pw.print(memInfo.nativePrivateClean); pw.print(',');
- pw.print(memInfo.dalvikPrivateClean); pw.print(',');
- pw.print(memInfo.otherPrivateClean); pw.print(',');
- pw.print(memInfo.getTotalPrivateClean()); pw.print(',');
-
- // Heap info - other areas
- for (int i=0; i<Debug.MemoryInfo.NUM_OTHER_STATS; i++) {
- pw.print(Debug.MemoryInfo.getOtherLabel(i)); pw.print(',');
- pw.print(memInfo.getOtherPss(i)); pw.print(',');
- pw.print(memInfo.getOtherSwappablePss(i)); pw.print(',');
- pw.print(memInfo.getOtherSharedDirty(i)); pw.print(',');
- pw.print(memInfo.getOtherSharedClean(i)); pw.print(',');
- pw.print(memInfo.getOtherPrivateDirty(i)); pw.print(',');
- pw.print(memInfo.getOtherPrivateClean(i)); pw.print(',');
- }
// Object counts
pw.print(viewInstanceCount); pw.print(',');
@@ -1039,128 +964,6 @@ public final class ActivityThread {
return;
}
- // otherwise, show human-readable format
- if (dumpFullInfo) {
- printRow(pw, HEAP_FULL_COLUMN, "", "Pss", "Pss", "Shared", "Private",
- "Shared", "Private", "Swapped", "Heap", "Heap", "Heap");
- printRow(pw, HEAP_FULL_COLUMN, "", "Total", "Clean", "Dirty", "Dirty",
- "Clean", "Clean", "Dirty", "Size", "Alloc", "Free");
- printRow(pw, HEAP_FULL_COLUMN, "", "------", "------", "------", "------",
- "------", "------", "------", "------", "------", "------");
- printRow(pw, HEAP_FULL_COLUMN, "Native Heap", memInfo.nativePss,
- memInfo.nativeSwappablePss, memInfo.nativeSharedDirty,
- memInfo.nativePrivateDirty, memInfo.nativeSharedClean,
- memInfo.nativePrivateClean, memInfo.nativeSwappedOut,
- nativeMax, nativeAllocated, nativeFree);
- printRow(pw, HEAP_FULL_COLUMN, "Dalvik Heap", memInfo.dalvikPss,
- memInfo.dalvikSwappablePss, memInfo.dalvikSharedDirty,
- memInfo.dalvikPrivateDirty, memInfo.dalvikSharedClean,
- memInfo.dalvikPrivateClean, memInfo.dalvikSwappedOut,
- dalvikMax, dalvikAllocated, dalvikFree);
- } else {
- printRow(pw, HEAP_COLUMN, "", "Pss", "Private",
- "Private", "Swapped", "Heap", "Heap", "Heap");
- printRow(pw, HEAP_COLUMN, "", "Total", "Dirty",
- "Clean", "Dirty", "Size", "Alloc", "Free");
- printRow(pw, HEAP_COLUMN, "", "------", "------", "------",
- "------", "------", "------", "------", "------");
- printRow(pw, HEAP_COLUMN, "Native Heap", memInfo.nativePss,
- memInfo.nativePrivateDirty,
- memInfo.nativePrivateClean, memInfo.nativeSwappedOut,
- nativeMax, nativeAllocated, nativeFree);
- printRow(pw, HEAP_COLUMN, "Dalvik Heap", memInfo.dalvikPss,
- memInfo.dalvikPrivateDirty,
- memInfo.dalvikPrivateClean, memInfo.dalvikSwappedOut,
- dalvikMax, dalvikAllocated, dalvikFree);
- }
-
- int otherPss = memInfo.otherPss;
- int otherSwappablePss = memInfo.otherSwappablePss;
- int otherSharedDirty = memInfo.otherSharedDirty;
- int otherPrivateDirty = memInfo.otherPrivateDirty;
- int otherSharedClean = memInfo.otherSharedClean;
- int otherPrivateClean = memInfo.otherPrivateClean;
- int otherSwappedOut = memInfo.otherSwappedOut;
-
- for (int i=0; i<Debug.MemoryInfo.NUM_OTHER_STATS; i++) {
- final int myPss = memInfo.getOtherPss(i);
- final int mySwappablePss = memInfo.getOtherSwappablePss(i);
- final int mySharedDirty = memInfo.getOtherSharedDirty(i);
- final int myPrivateDirty = memInfo.getOtherPrivateDirty(i);
- final int mySharedClean = memInfo.getOtherSharedClean(i);
- final int myPrivateClean = memInfo.getOtherPrivateClean(i);
- final int mySwappedOut = memInfo.getOtherSwappedOut(i);
- if (myPss != 0 || mySharedDirty != 0 || myPrivateDirty != 0
- || mySharedClean != 0 || myPrivateClean != 0 || mySwappedOut != 0) {
- if (dumpFullInfo) {
- printRow(pw, HEAP_FULL_COLUMN, Debug.MemoryInfo.getOtherLabel(i),
- myPss, mySwappablePss, mySharedDirty, myPrivateDirty,
- mySharedClean, myPrivateClean, mySwappedOut, "", "", "");
- } else {
- printRow(pw, HEAP_COLUMN, Debug.MemoryInfo.getOtherLabel(i),
- myPss, myPrivateDirty,
- myPrivateClean, mySwappedOut, "", "", "");
- }
- otherPss -= myPss;
- otherSwappablePss -= mySwappablePss;
- otherSharedDirty -= mySharedDirty;
- otherPrivateDirty -= myPrivateDirty;
- otherSharedClean -= mySharedClean;
- otherPrivateClean -= myPrivateClean;
- otherSwappedOut -= mySwappedOut;
- }
- }
-
- if (dumpFullInfo) {
- printRow(pw, HEAP_FULL_COLUMN, "Unknown", otherPss, otherSwappablePss,
- otherSharedDirty, otherPrivateDirty, otherSharedClean, otherPrivateClean,
- otherSwappedOut, "", "", "");
- printRow(pw, HEAP_FULL_COLUMN, "TOTAL", memInfo.getTotalPss(),
- memInfo.getTotalSwappablePss(),
- memInfo.getTotalSharedDirty(), memInfo.getTotalPrivateDirty(),
- memInfo.getTotalSharedClean(), memInfo.getTotalPrivateClean(),
- memInfo.getTotalSwappedOut(), nativeMax+dalvikMax,
- nativeAllocated+dalvikAllocated, nativeFree+dalvikFree);
- } else {
- printRow(pw, HEAP_COLUMN, "Unknown", otherPss,
- otherPrivateDirty, otherPrivateClean, otherSwappedOut,
- "", "", "");
- printRow(pw, HEAP_COLUMN, "TOTAL", memInfo.getTotalPss(),
- memInfo.getTotalPrivateDirty(),
- memInfo.getTotalPrivateClean(),
- memInfo.getTotalSwappedOut(),
- nativeMax+dalvikMax,
- nativeAllocated+dalvikAllocated, nativeFree+dalvikFree);
- }
-
- if (dumpDalvik) {
- pw.println(" ");
- pw.println(" Dalvik Details");
-
- for (int i=Debug.MemoryInfo.NUM_OTHER_STATS;
- i<Debug.MemoryInfo.NUM_OTHER_STATS + Debug.MemoryInfo.NUM_DVK_STATS; i++) {
- final int myPss = memInfo.getOtherPss(i);
- final int mySwappablePss = memInfo.getOtherSwappablePss(i);
- final int mySharedDirty = memInfo.getOtherSharedDirty(i);
- final int myPrivateDirty = memInfo.getOtherPrivateDirty(i);
- final int mySharedClean = memInfo.getOtherSharedClean(i);
- final int myPrivateClean = memInfo.getOtherPrivateClean(i);
- final int mySwappedOut = memInfo.getOtherSwappedOut(i);
- if (myPss != 0 || mySharedDirty != 0 || myPrivateDirty != 0
- || mySharedClean != 0 || myPrivateClean != 0) {
- if (dumpFullInfo) {
- printRow(pw, HEAP_FULL_COLUMN, Debug.MemoryInfo.getOtherLabel(i),
- myPss, mySwappablePss, mySharedDirty, myPrivateDirty,
- mySharedClean, myPrivateClean, mySwappedOut, "", "", "");
- } else {
- printRow(pw, HEAP_COLUMN, Debug.MemoryInfo.getOtherLabel(i),
- myPss, myPrivateDirty,
- myPrivateClean, mySwappedOut, "", "", "");
- }
- }
- }
- }
-
pw.println(" ");
pw.println(" Objects");
printRow(pw, TWO_COUNT_COLUMNS, "Views:", viewInstanceCount, "ViewRootImpl:",
@@ -1225,7 +1028,7 @@ public final class ActivityThread {
@Override
public void unstableProviderDied(IBinder provider) {
- queueOrSendMessage(H.UNSTABLE_PROVIDER_DIED, provider);
+ sendMessage(H.UNSTABLE_PROVIDER_DIED, provider);
}
@Override
@@ -1235,30 +1038,26 @@ public final class ActivityThread {
cmd.activityToken = activityToken;
cmd.requestToken = requestToken;
cmd.requestType = requestType;
- queueOrSendMessage(H.REQUEST_ASSIST_CONTEXT_EXTRAS, cmd);
- }
-
- private void printRow(PrintWriter pw, String format, Object...objs) {
- pw.println(String.format(format, objs));
+ sendMessage(H.REQUEST_ASSIST_CONTEXT_EXTRAS, cmd);
}
public void setCoreSettings(Bundle coreSettings) {
- queueOrSendMessage(H.SET_CORE_SETTINGS, coreSettings);
+ sendMessage(H.SET_CORE_SETTINGS, coreSettings);
}
public void updatePackageCompatibilityInfo(String pkg, CompatibilityInfo info) {
UpdateCompatibilityData ucd = new UpdateCompatibilityData();
ucd.pkg = pkg;
ucd.info = info;
- queueOrSendMessage(H.UPDATE_PACKAGE_COMPATIBILITY_INFO, ucd);
+ sendMessage(H.UPDATE_PACKAGE_COMPATIBILITY_INFO, ucd);
}
public void scheduleTrimMemory(int level) {
- queueOrSendMessage(H.TRIM_MEMORY, null, level);
+ sendMessage(H.TRIM_MEMORY, null, level);
}
public void scheduleTranslucentConversionComplete(IBinder token, boolean drawComplete) {
- queueOrSendMessage(H.TRANSLUCENT_CONVERSION_COMPLETE, token, drawComplete ? 1 : 0);
+ sendMessage(H.TRANSLUCENT_CONVERSION_COMPLETE, token, drawComplete ? 1 : 0);
}
public void setProcessState(int state) {
@@ -1281,7 +1080,7 @@ public final class ActivityThread {
@Override
public void scheduleInstallProvider(ProviderInfo provider) {
- queueOrSendMessage(H.INSTALL_PROVIDER, provider);
+ sendMessage(H.INSTALL_PROVIDER, provider);
}
}
@@ -1959,6 +1758,223 @@ public final class ActivityThread {
}
}
+ private static final String HEAP_FULL_COLUMN
+ = "%13s %8s %8s %8s %8s %8s %8s %8s %8s %8s %8s";
+ private static final String HEAP_COLUMN
+ = "%13s %8s %8s %8s %8s %8s %8s %8s";
+
+ // Formatting for checkin service - update version if row format changes
+ private static final int ACTIVITY_THREAD_CHECKIN_VERSION = 3;
+
+ static void printRow(PrintWriter pw, String format, Object...objs) {
+ pw.println(String.format(format, objs));
+ }
+
+ public static void dumpMemInfoTable(PrintWriter pw, Debug.MemoryInfo memInfo, boolean checkin,
+ boolean dumpFullInfo, boolean dumpDalvik, int pid, String processName,
+ long nativeMax, long nativeAllocated, long nativeFree,
+ long dalvikMax, long dalvikAllocated, long dalvikFree) {
+
+ // For checkin, we print one long comma-separated list of values
+ if (checkin) {
+ // NOTE: if you change anything significant below, also consider changing
+ // ACTIVITY_THREAD_CHECKIN_VERSION.
+
+ // Header
+ pw.print(ACTIVITY_THREAD_CHECKIN_VERSION); pw.print(',');
+ pw.print(pid); pw.print(',');
+ pw.print(processName); pw.print(',');
+
+ // Heap info - max
+ pw.print(nativeMax); pw.print(',');
+ pw.print(dalvikMax); pw.print(',');
+ pw.print("N/A,");
+ pw.print(nativeMax + dalvikMax); pw.print(',');
+
+ // Heap info - allocated
+ pw.print(nativeAllocated); pw.print(',');
+ pw.print(dalvikAllocated); pw.print(',');
+ pw.print("N/A,");
+ pw.print(nativeAllocated + dalvikAllocated); pw.print(',');
+
+ // Heap info - free
+ pw.print(nativeFree); pw.print(',');
+ pw.print(dalvikFree); pw.print(',');
+ pw.print("N/A,");
+ pw.print(nativeFree + dalvikFree); pw.print(',');
+
+ // Heap info - proportional set size
+ pw.print(memInfo.nativePss); pw.print(',');
+ pw.print(memInfo.dalvikPss); pw.print(',');
+ pw.print(memInfo.otherPss); pw.print(',');
+ pw.print(memInfo.getTotalPss()); pw.print(',');
+
+ // Heap info - swappable set size
+ pw.print(memInfo.nativeSwappablePss); pw.print(',');
+ pw.print(memInfo.dalvikSwappablePss); pw.print(',');
+ pw.print(memInfo.otherSwappablePss); pw.print(',');
+ pw.print(memInfo.getTotalSwappablePss()); pw.print(',');
+
+ // Heap info - shared dirty
+ pw.print(memInfo.nativeSharedDirty); pw.print(',');
+ pw.print(memInfo.dalvikSharedDirty); pw.print(',');
+ pw.print(memInfo.otherSharedDirty); pw.print(',');
+ pw.print(memInfo.getTotalSharedDirty()); pw.print(',');
+
+ // Heap info - shared clean
+ pw.print(memInfo.nativeSharedClean); pw.print(',');
+ pw.print(memInfo.dalvikSharedClean); pw.print(',');
+ pw.print(memInfo.otherSharedClean); pw.print(',');
+ pw.print(memInfo.getTotalSharedClean()); pw.print(',');
+
+ // Heap info - private Dirty
+ pw.print(memInfo.nativePrivateDirty); pw.print(',');
+ pw.print(memInfo.dalvikPrivateDirty); pw.print(',');
+ pw.print(memInfo.otherPrivateDirty); pw.print(',');
+ pw.print(memInfo.getTotalPrivateDirty()); pw.print(',');
+
+ // Heap info - private Clean
+ pw.print(memInfo.nativePrivateClean); pw.print(',');
+ pw.print(memInfo.dalvikPrivateClean); pw.print(',');
+ pw.print(memInfo.otherPrivateClean); pw.print(',');
+ pw.print(memInfo.getTotalPrivateClean()); pw.print(',');
+
+ // Heap info - other areas
+ for (int i=0; i<Debug.MemoryInfo.NUM_OTHER_STATS; i++) {
+ pw.print(Debug.MemoryInfo.getOtherLabel(i)); pw.print(',');
+ pw.print(memInfo.getOtherPss(i)); pw.print(',');
+ pw.print(memInfo.getOtherSwappablePss(i)); pw.print(',');
+ pw.print(memInfo.getOtherSharedDirty(i)); pw.print(',');
+ pw.print(memInfo.getOtherSharedClean(i)); pw.print(',');
+ pw.print(memInfo.getOtherPrivateDirty(i)); pw.print(',');
+ pw.print(memInfo.getOtherPrivateClean(i)); pw.print(',');
+ }
+ return;
+ }
+
+ // otherwise, show human-readable format
+ if (dumpFullInfo) {
+ printRow(pw, HEAP_FULL_COLUMN, "", "Pss", "Pss", "Shared", "Private",
+ "Shared", "Private", "Swapped", "Heap", "Heap", "Heap");
+ printRow(pw, HEAP_FULL_COLUMN, "", "Total", "Clean", "Dirty", "Dirty",
+ "Clean", "Clean", "Dirty", "Size", "Alloc", "Free");
+ printRow(pw, HEAP_FULL_COLUMN, "", "------", "------", "------", "------",
+ "------", "------", "------", "------", "------", "------");
+ printRow(pw, HEAP_FULL_COLUMN, "Native Heap", memInfo.nativePss,
+ memInfo.nativeSwappablePss, memInfo.nativeSharedDirty,
+ memInfo.nativePrivateDirty, memInfo.nativeSharedClean,
+ memInfo.nativePrivateClean, memInfo.nativeSwappedOut,
+ nativeMax, nativeAllocated, nativeFree);
+ printRow(pw, HEAP_FULL_COLUMN, "Dalvik Heap", memInfo.dalvikPss,
+ memInfo.dalvikSwappablePss, memInfo.dalvikSharedDirty,
+ memInfo.dalvikPrivateDirty, memInfo.dalvikSharedClean,
+ memInfo.dalvikPrivateClean, memInfo.dalvikSwappedOut,
+ dalvikMax, dalvikAllocated, dalvikFree);
+ } else {
+ printRow(pw, HEAP_COLUMN, "", "Pss", "Private",
+ "Private", "Swapped", "Heap", "Heap", "Heap");
+ printRow(pw, HEAP_COLUMN, "", "Total", "Dirty",
+ "Clean", "Dirty", "Size", "Alloc", "Free");
+ printRow(pw, HEAP_COLUMN, "", "------", "------", "------",
+ "------", "------", "------", "------", "------");
+ printRow(pw, HEAP_COLUMN, "Native Heap", memInfo.nativePss,
+ memInfo.nativePrivateDirty,
+ memInfo.nativePrivateClean, memInfo.nativeSwappedOut,
+ nativeMax, nativeAllocated, nativeFree);
+ printRow(pw, HEAP_COLUMN, "Dalvik Heap", memInfo.dalvikPss,
+ memInfo.dalvikPrivateDirty,
+ memInfo.dalvikPrivateClean, memInfo.dalvikSwappedOut,
+ dalvikMax, dalvikAllocated, dalvikFree);
+ }
+
+ int otherPss = memInfo.otherPss;
+ int otherSwappablePss = memInfo.otherSwappablePss;
+ int otherSharedDirty = memInfo.otherSharedDirty;
+ int otherPrivateDirty = memInfo.otherPrivateDirty;
+ int otherSharedClean = memInfo.otherSharedClean;
+ int otherPrivateClean = memInfo.otherPrivateClean;
+ int otherSwappedOut = memInfo.otherSwappedOut;
+
+ for (int i=0; i<Debug.MemoryInfo.NUM_OTHER_STATS; i++) {
+ final int myPss = memInfo.getOtherPss(i);
+ final int mySwappablePss = memInfo.getOtherSwappablePss(i);
+ final int mySharedDirty = memInfo.getOtherSharedDirty(i);
+ final int myPrivateDirty = memInfo.getOtherPrivateDirty(i);
+ final int mySharedClean = memInfo.getOtherSharedClean(i);
+ final int myPrivateClean = memInfo.getOtherPrivateClean(i);
+ final int mySwappedOut = memInfo.getOtherSwappedOut(i);
+ if (myPss != 0 || mySharedDirty != 0 || myPrivateDirty != 0
+ || mySharedClean != 0 || myPrivateClean != 0 || mySwappedOut != 0) {
+ if (dumpFullInfo) {
+ printRow(pw, HEAP_FULL_COLUMN, Debug.MemoryInfo.getOtherLabel(i),
+ myPss, mySwappablePss, mySharedDirty, myPrivateDirty,
+ mySharedClean, myPrivateClean, mySwappedOut, "", "", "");
+ } else {
+ printRow(pw, HEAP_COLUMN, Debug.MemoryInfo.getOtherLabel(i),
+ myPss, myPrivateDirty,
+ myPrivateClean, mySwappedOut, "", "", "");
+ }
+ otherPss -= myPss;
+ otherSwappablePss -= mySwappablePss;
+ otherSharedDirty -= mySharedDirty;
+ otherPrivateDirty -= myPrivateDirty;
+ otherSharedClean -= mySharedClean;
+ otherPrivateClean -= myPrivateClean;
+ otherSwappedOut -= mySwappedOut;
+ }
+ }
+
+ if (dumpFullInfo) {
+ printRow(pw, HEAP_FULL_COLUMN, "Unknown", otherPss, otherSwappablePss,
+ otherSharedDirty, otherPrivateDirty, otherSharedClean, otherPrivateClean,
+ otherSwappedOut, "", "", "");
+ printRow(pw, HEAP_FULL_COLUMN, "TOTAL", memInfo.getTotalPss(),
+ memInfo.getTotalSwappablePss(),
+ memInfo.getTotalSharedDirty(), memInfo.getTotalPrivateDirty(),
+ memInfo.getTotalSharedClean(), memInfo.getTotalPrivateClean(),
+ memInfo.getTotalSwappedOut(), nativeMax+dalvikMax,
+ nativeAllocated+dalvikAllocated, nativeFree+dalvikFree);
+ } else {
+ printRow(pw, HEAP_COLUMN, "Unknown", otherPss,
+ otherPrivateDirty, otherPrivateClean, otherSwappedOut,
+ "", "", "");
+ printRow(pw, HEAP_COLUMN, "TOTAL", memInfo.getTotalPss(),
+ memInfo.getTotalPrivateDirty(),
+ memInfo.getTotalPrivateClean(),
+ memInfo.getTotalSwappedOut(),
+ nativeMax+dalvikMax,
+ nativeAllocated+dalvikAllocated, nativeFree+dalvikFree);
+ }
+
+ if (dumpDalvik) {
+ pw.println(" ");
+ pw.println(" Dalvik Details");
+
+ for (int i=Debug.MemoryInfo.NUM_OTHER_STATS;
+ i<Debug.MemoryInfo.NUM_OTHER_STATS + Debug.MemoryInfo.NUM_DVK_STATS; i++) {
+ final int myPss = memInfo.getOtherPss(i);
+ final int mySwappablePss = memInfo.getOtherSwappablePss(i);
+ final int mySharedDirty = memInfo.getOtherSharedDirty(i);
+ final int myPrivateDirty = memInfo.getOtherPrivateDirty(i);
+ final int mySharedClean = memInfo.getOtherSharedClean(i);
+ final int myPrivateClean = memInfo.getOtherPrivateClean(i);
+ final int mySwappedOut = memInfo.getOtherSwappedOut(i);
+ if (myPss != 0 || mySharedDirty != 0 || myPrivateDirty != 0
+ || mySharedClean != 0 || myPrivateClean != 0) {
+ if (dumpFullInfo) {
+ printRow(pw, HEAP_FULL_COLUMN, Debug.MemoryInfo.getOtherLabel(i),
+ myPss, mySwappablePss, mySharedDirty, myPrivateDirty,
+ mySharedClean, myPrivateClean, mySwappedOut, "", "", "");
+ } else {
+ printRow(pw, HEAP_COLUMN, Debug.MemoryInfo.getOtherLabel(i),
+ myPss, myPrivateDirty,
+ myPrivateClean, mySwappedOut, "", "", "");
+ }
+ }
+ }
+ }
+ }
+
public void registerOnActivityPausedListener(Activity activity,
OnActivityPausedListener listener) {
synchronized (mOnPauseListeners) {
@@ -2033,28 +2049,31 @@ public final class ActivityThread {
mAppThread.scheduleSendResult(token, list);
}
- // if the thread hasn't started yet, we don't have the handler, so just
- // save the messages until we're ready.
- private void queueOrSendMessage(int what, Object obj) {
- queueOrSendMessage(what, obj, 0, 0);
+ private void sendMessage(int what, Object obj) {
+ sendMessage(what, obj, 0, 0, false);
}
- private void queueOrSendMessage(int what, Object obj, int arg1) {
- queueOrSendMessage(what, obj, arg1, 0);
+ private void sendMessage(int what, Object obj, int arg1) {
+ sendMessage(what, obj, arg1, 0, false);
}
- private void queueOrSendMessage(int what, Object obj, int arg1, int arg2) {
- synchronized (this) {
- if (DEBUG_MESSAGES) Slog.v(
- TAG, "SCHEDULE " + what + " " + mH.codeToString(what)
- + ": " + arg1 + " / " + obj);
- Message msg = Message.obtain();
- msg.what = what;
- msg.obj = obj;
- msg.arg1 = arg1;
- msg.arg2 = arg2;
- mH.sendMessage(msg);
+ private void sendMessage(int what, Object obj, int arg1, int arg2) {
+ sendMessage(what, obj, arg1, arg2, false);
+ }
+
+ private void sendMessage(int what, Object obj, int arg1, int arg2, boolean async) {
+ if (DEBUG_MESSAGES) Slog.v(
+ TAG, "SCHEDULE " + what + " " + mH.codeToString(what)
+ + ": " + arg1 + " / " + obj);
+ Message msg = Message.obtain();
+ msg.what = what;
+ msg.obj = obj;
+ msg.arg1 = arg1;
+ msg.arg2 = arg2;
+ if (async) {
+ msg.setAsynchronous(true);
}
+ mH.sendMessage(msg);
}
final void scheduleContextCleanup(ContextImpl context, String who,
@@ -2063,7 +2082,7 @@ public final class ActivityThread {
cci.context = context;
cci.who = who;
cci.what = what;
- queueOrSendMessage(H.CLEAN_UP_CONTEXT, cci);
+ sendMessage(H.CLEAN_UP_CONTEXT, cci);
}
private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
@@ -3592,7 +3611,7 @@ public final class ActivityThread {
target.onlyLocalRequest = true;
}
mRelaunchingActivities.add(target);
- queueOrSendMessage(H.RELAUNCH_ACTIVITY, target);
+ sendMessage(H.RELAUNCH_ACTIVITY, target);
}
if (fromServer) {
@@ -4900,7 +4919,7 @@ public final class ActivityThread {
mPendingConfiguration.isOtherSeqNewer(newConfig)) {
mPendingConfiguration = newConfig;
- queueOrSendMessage(H.CONFIGURATION_CHANGED, newConfig);
+ sendMessage(H.CONFIGURATION_CHANGED, newConfig);
}
}
}