diff options
| -rw-r--r-- | core/java/android/ddm/DdmHandleProfiling.java | 52 | ||||
| -rw-r--r-- | core/java/android/os/Debug.java | 11 |
2 files changed, 63 insertions, 0 deletions
diff --git a/core/java/android/ddm/DdmHandleProfiling.java b/core/java/android/ddm/DdmHandleProfiling.java index beed50507fa2..63ee445e4271 100644 --- a/core/java/android/ddm/DdmHandleProfiling.java +++ b/core/java/android/ddm/DdmHandleProfiling.java @@ -32,6 +32,8 @@ public class DdmHandleProfiling extends ChunkHandler { public static final int CHUNK_MPRS = type("MPRS"); public static final int CHUNK_MPRE = type("MPRE"); + public static final int CHUNK_MPSS = type("MPSS"); + public static final int CHUNK_MPSE = type("MPSE"); public static final int CHUNK_MPRQ = type("MPRQ"); private static DdmHandleProfiling mInstance = new DdmHandleProfiling(); @@ -46,6 +48,8 @@ public class DdmHandleProfiling extends ChunkHandler { public static void register() { DdmServer.registerHandler(CHUNK_MPRS, mInstance); DdmServer.registerHandler(CHUNK_MPRE, mInstance); + DdmServer.registerHandler(CHUNK_MPSS, mInstance); + DdmServer.registerHandler(CHUNK_MPSE, mInstance); DdmServer.registerHandler(CHUNK_MPRQ, mInstance); } @@ -73,6 +77,10 @@ public class DdmHandleProfiling extends ChunkHandler { return handleMPRS(request); } else if (type == CHUNK_MPRE) { return handleMPRE(request); + } else if (type == CHUNK_MPSS) { + return handleMPSS(request); + } else if (type == CHUNK_MPSE) { + return handleMPSE(request); } else if (type == CHUNK_MPRQ) { return handleMPRQ(request); } else { @@ -124,6 +132,50 @@ public class DdmHandleProfiling extends ChunkHandler { } /* + * Handle a "Method Profiling w/Streaming Start" request. + */ + private Chunk handleMPSS(Chunk request) { + ByteBuffer in = wrapChunk(request); + + int bufferSize = in.getInt(); + int flags = in.getInt(); + if (Config.LOGV) { + Log.v("ddm-heap", "Method prof stream start: size=" + bufferSize + + ", flags=" + flags); + } + + try { + Debug.startMethodTracingDdms(bufferSize, flags); + return null; // empty response + } catch (RuntimeException re) { + return createFailChunk(1, re.getMessage()); + } + } + + /* + * Handle a "Method Profiling w/Streaming End" request. + */ + private Chunk handleMPSE(Chunk request) { + byte result; + + if (Config.LOGV) { + Log.v("ddm-heap", "Method prof stream end"); + } + + try { + Debug.stopMethodTracing(); + result = 0; + } catch (RuntimeException re) { + Log.w("ddm-heap", "Method prof stream end failed: " + + re.getMessage()); + return createFailChunk(1, re.getMessage()); + } + + /* VM sent the (perhaps very large) response directly */ + return null; + } + + /* * Handle a "Method PRofiling Query" request. */ private Chunk handleMPRQ(Chunk request) { diff --git a/core/java/android/os/Debug.java b/core/java/android/os/Debug.java index 7043c2e575a6..8e9b11bdcd32 100644 --- a/core/java/android/os/Debug.java +++ b/core/java/android/os/Debug.java @@ -469,6 +469,17 @@ href="{@docRoot}guide/developing/tools/traceview.html">Traceview: A Graphical Lo } /** + * Starts method tracing without a backing file. When stopMethodTracing + * is called, the result is sent directly to DDMS. (If DDMS is not + * attached when tracing ends, the profiling data will be discarded.) + * + * @hide + */ + public static void startMethodTracingDdms(int bufferSize, int flags) { + VMDebug.startMethodTracingDdms(bufferSize, flags); + } + + /** * Determine whether method tracing is currently active. * @hide */ |