diff options
Diffstat (limited to 'core/java/android/app/ActivityThread.java')
| -rw-r--r-- | core/java/android/app/ActivityThread.java | 547 |
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); } } } |
