|
120 | 120 |
|
121 | 121 | import java.io.BufferedInputStream; |
122 | 122 | import java.io.BufferedOutputStream; |
| 123 | +import java.io.BufferedReader; |
123 | 124 | import java.io.DataInputStream; |
124 | 125 | import java.io.DataOutputStream; |
125 | 126 | import java.io.File; |
|
128 | 129 | import java.io.FileNotFoundException; |
129 | 130 | import java.io.FileOutputStream; |
130 | 131 | import java.io.IOException; |
| 132 | +import java.io.InputStream; |
131 | 133 | import java.io.InputStreamReader; |
132 | 134 | import java.io.PrintWriter; |
| 135 | +import java.io.StringWriter; |
133 | 136 | import java.lang.IllegalStateException; |
134 | 137 | import java.lang.ref.WeakReference; |
135 | 138 | import java.util.ArrayList; |
@@ -844,9 +847,11 @@ public void binderDied() { |
844 | 847 | static final int SHOW_COMPAT_MODE_DIALOG_MSG = 30; |
845 | 848 | static final int DISPATCH_FOREGROUND_ACTIVITIES_CHANGED = 31; |
846 | 849 | static final int DISPATCH_PROCESS_DIED = 32; |
| 850 | + static final int REPORT_MEM_USAGE = 33; |
847 | 851 |
|
848 | 852 | AlertDialog mUidAlert; |
849 | 853 | CompatModeDialog mCompatModeDialog; |
| 854 | + long mLastMemUsageReportTime = 0; |
850 | 855 |
|
851 | 856 | final Handler mHandler = new Handler() { |
852 | 857 | //public Handler() { |
@@ -1186,6 +1191,56 @@ public void handleMessage(Message msg) { |
1186 | 1191 | dispatchProcessDied(pid, uid); |
1187 | 1192 | break; |
1188 | 1193 | } |
| 1194 | + case REPORT_MEM_USAGE: { |
| 1195 | + boolean isDebuggable = "1".equals(SystemProperties.get(SYSTEM_DEBUGGABLE, "0")); |
| 1196 | + if (!isDebuggable) { |
| 1197 | + return; |
| 1198 | + } |
| 1199 | + synchronized (ActivityManagerService.this) { |
| 1200 | + long now = SystemClock.uptimeMillis(); |
| 1201 | + if (now < (mLastMemUsageReportTime+10000)) { |
| 1202 | + // Don't report more than every 10 seconds to somewhat |
| 1203 | + // avoid spamming. |
| 1204 | + return; |
| 1205 | + } |
| 1206 | + mLastMemUsageReportTime = now; |
| 1207 | + } |
| 1208 | + Thread thread = new Thread() { |
| 1209 | + @Override public void run() { |
| 1210 | + try { |
| 1211 | + java.lang.Process proc = Runtime.getRuntime().exec(new String[] { |
| 1212 | + "procrank", }); |
| 1213 | + final InputStreamReader converter = new InputStreamReader( |
| 1214 | + proc.getInputStream()); |
| 1215 | + BufferedReader in = new BufferedReader(converter); |
| 1216 | + String line; |
| 1217 | + while (true) { |
| 1218 | + line = in.readLine(); |
| 1219 | + if (line == null) { |
| 1220 | + break; |
| 1221 | + } |
| 1222 | + if (line.length() > 0) { |
| 1223 | + Slog.i(TAG, line); |
| 1224 | + } |
| 1225 | + } |
| 1226 | + converter.close(); |
| 1227 | + } catch (IOException e) { |
| 1228 | + } |
| 1229 | + StringWriter sw = new StringWriter(); |
| 1230 | + PrintWriter pw = new PrintWriter(sw); |
| 1231 | + dumpApplicationMemoryUsage(null, pw, " ", new String[] { }, true); |
| 1232 | + Slog.i(TAG, sw.toString()); |
| 1233 | + synchronized (ActivityManagerService.this) { |
| 1234 | + long now = SystemClock.uptimeMillis(); |
| 1235 | + if (mLastMemUsageReportTime < now) { |
| 1236 | + mLastMemUsageReportTime = now; |
| 1237 | + } |
| 1238 | + } |
| 1239 | + } |
| 1240 | + }; |
| 1241 | + thread.start(); |
| 1242 | + break; |
| 1243 | + } |
1189 | 1244 | } |
1190 | 1245 | } |
1191 | 1246 | }; |
@@ -1326,7 +1381,7 @@ protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { |
1326 | 1381 | return; |
1327 | 1382 | } |
1328 | 1383 |
|
1329 | | - mActivityManagerService.dumpApplicationMemoryUsage(fd, pw, " ", args); |
| 1384 | + mActivityManagerService.dumpApplicationMemoryUsage(fd, pw, " ", args, false); |
1330 | 1385 | } |
1331 | 1386 | } |
1332 | 1387 |
|
@@ -2755,6 +2810,7 @@ final void appDiedLocked(ProcessRecord app, int pid, |
2755 | 2810 | addProcessToGcListLocked(rec); |
2756 | 2811 | } |
2757 | 2812 | } |
| 2813 | + mHandler.sendEmptyMessage(REPORT_MEM_USAGE); |
2758 | 2814 | scheduleAppGcsLocked(); |
2759 | 2815 | } |
2760 | 2816 | } |
@@ -9216,7 +9272,7 @@ public int compare(MemItem lhs, MemItem rhs) { |
9216 | 9272 | } |
9217 | 9273 |
|
9218 | 9274 | final void dumpApplicationMemoryUsage(FileDescriptor fd, |
9219 | | - PrintWriter pw, String prefix, String[] args) { |
| 9275 | + PrintWriter pw, String prefix, String[] args, boolean brief) { |
9220 | 9276 | boolean dumpAll = false; |
9221 | 9277 |
|
9222 | 9278 | int opti = 0; |
@@ -9354,15 +9410,19 @@ final void dumpApplicationMemoryUsage(FileDescriptor fd, |
9354 | 9410 | } |
9355 | 9411 | } |
9356 | 9412 |
|
9357 | | - pw.println(); |
9358 | | - pw.println("Total PSS by process:"); |
9359 | | - dumpMemItems(pw, " ", procMems, true); |
9360 | | - pw.println(); |
| 9413 | + if (!brief) { |
| 9414 | + pw.println(); |
| 9415 | + pw.println("Total PSS by process:"); |
| 9416 | + dumpMemItems(pw, " ", procMems, true); |
| 9417 | + pw.println(); |
| 9418 | + } |
9361 | 9419 | pw.println("Total PSS by OOM adjustment:"); |
9362 | 9420 | dumpMemItems(pw, " ", oomMems, false); |
9363 | | - pw.println(); |
9364 | | - pw.println("Total PSS by category:"); |
9365 | | - dumpMemItems(pw, " ", catMems, true); |
| 9421 | + if (!brief) { |
| 9422 | + pw.println(); |
| 9423 | + pw.println("Total PSS by category:"); |
| 9424 | + dumpMemItems(pw, " ", catMems, true); |
| 9425 | + } |
9366 | 9426 | pw.println(); |
9367 | 9427 | pw.print("Total PSS: "); pw.print(totalPss); pw.println(" Kb"); |
9368 | 9428 | } |
|
0 commit comments