aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ddms/libs/ddmlib/src/com/android/ddmlib/Client.java17
-rw-r--r--ddms/libs/ddmlib/src/com/android/ddmlib/ClientData.java6
-rw-r--r--ddms/libs/ddmlib/src/com/android/ddmlib/HandleProfiling.java62
3 files changed, 81 insertions, 4 deletions
diff --git a/ddms/libs/ddmlib/src/com/android/ddmlib/Client.java b/ddms/libs/ddmlib/src/com/android/ddmlib/Client.java
index d05fa14..52c9506 100644
--- a/ddms/libs/ddmlib/src/com/android/ddmlib/Client.java
+++ b/ddms/libs/ddmlib/src/com/android/ddmlib/Client.java
@@ -241,13 +241,22 @@ public class Client {
}
public void toggleMethodProfiling() {
+ boolean canStream = false; //mClientData.hasFeature(ClientData.FEATURE_PROFILING_STREAMING);
try {
if (mClientData.getMethodProfilingStatus() == MethodProfilingStatus.ON) {
- HandleProfiling.sendMPRE(this);
+ if (canStream) {
+ HandleProfiling.sendMPSE(this);
+ } else {
+ HandleProfiling.sendMPRE(this);
+ }
} else {
- String file = "/sdcard/" + mClientData.getClientDescription().replaceAll("\\:.*", "") +
- ".trace";
- HandleProfiling.sendMPRS(this, file, 8*1024*1024, 0 /*flags*/);
+ if (canStream) {
+ HandleProfiling.sendMPSS(this, 8*1024*1024, 0 /*flags*/);
+ } else {
+ String file = "/sdcard/" + mClientData.getClientDescription().replaceAll("\\:.*", "") +
+ ".trace";
+ HandleProfiling.sendMPRS(this, file, 8*1024*1024, 0 /*flags*/);
+ }
}
} catch (IOException e) {
Log.w("ddms", "Toggle method profiling failed");
diff --git a/ddms/libs/ddmlib/src/com/android/ddmlib/ClientData.java b/ddms/libs/ddmlib/src/com/android/ddmlib/ClientData.java
index 356f5d0..53e1352 100644
--- a/ddms/libs/ddmlib/src/com/android/ddmlib/ClientData.java
+++ b/ddms/libs/ddmlib/src/com/android/ddmlib/ClientData.java
@@ -124,6 +124,12 @@ public class ClientData {
public final static String FEATURE_PROFILING = "method-trace-profiling"; // $NON-NLS-1$
/**
+ * String for feature enabling direct streaming of method profiling data
+ * @see #hasFeature(String)
+ */
+ public final static String FEATURE_PROFILING_STREAMING = "method-trace-profiling-streaming"; // $NON-NLS-1$
+
+ /**
* String for feature allowing to dump hprof files
* @see #hasFeature(String)
*/
diff --git a/ddms/libs/ddmlib/src/com/android/ddmlib/HandleProfiling.java b/ddms/libs/ddmlib/src/com/android/ddmlib/HandleProfiling.java
index 3b69973..fcc1d26 100644
--- a/ddms/libs/ddmlib/src/com/android/ddmlib/HandleProfiling.java
+++ b/ddms/libs/ddmlib/src/com/android/ddmlib/HandleProfiling.java
@@ -29,6 +29,8 @@ final class HandleProfiling 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");
public static final int CHUNK_FAIL = type("FAIL");
@@ -41,6 +43,7 @@ final class HandleProfiling extends ChunkHandler {
*/
public static void register(MonitorThread mt) {
mt.registerChunkHandler(CHUNK_MPRE, mInst);
+ mt.registerChunkHandler(CHUNK_MPSE, mInst);
mt.registerChunkHandler(CHUNK_MPRQ, mInst);
}
@@ -67,6 +70,8 @@ final class HandleProfiling extends ChunkHandler {
if (type == CHUNK_MPRE) {
handleMPRE(client, data);
+ } else if (type == CHUNK_MPSE) {
+ handleMPSE(client, data);
} else if (type == CHUNK_MPRQ) {
handleMPRQ(client, data);
} else if (type == CHUNK_FAIL) {
@@ -160,6 +165,63 @@ final class HandleProfiling extends ChunkHandler {
}
/**
+ * Send a MPSS (Method Profiling Streaming Start) request to the client.
+ *
+ * The arguments to this method will eventually be passed to
+ * android.os.Debug.startMethodTracing() on the device.
+ *
+ * @param bufferSize is the desired buffer size in bytes (8MB is good)
+ * @param flags see startMethodTracing() docs; use 0 for default behavior
+ */
+ public static void sendMPSS(Client client, int bufferSize,
+ int flags) throws IOException {
+
+ ByteBuffer rawBuf = allocBuffer(2*4);
+ JdwpPacket packet = new JdwpPacket(rawBuf);
+ ByteBuffer buf = getChunkDataBuf(rawBuf);
+
+ buf.putInt(bufferSize);
+ buf.putInt(flags);
+
+ finishChunkPacket(packet, CHUNK_MPSS, buf.position());
+ Log.d("ddm-prof", "Sending " + name(CHUNK_MPSS)
+ + "', size=" + bufferSize + ", flags=" + flags);
+ client.sendAndConsume(packet, mInst);
+
+ // send a status query. this ensure that the status is properly updated if for some
+ // reason starting the tracing failed.
+ sendMPRQ(client);
+ }
+
+ /**
+ * Send a MPSE (Method Profiling Streaming End) request to the client.
+ */
+ public static void sendMPSE(Client client) throws IOException {
+ ByteBuffer rawBuf = allocBuffer(0);
+ JdwpPacket packet = new JdwpPacket(rawBuf);
+ ByteBuffer buf = getChunkDataBuf(rawBuf);
+
+ // no data
+
+ finishChunkPacket(packet, CHUNK_MPSE, buf.position());
+ Log.d("ddm-prof", "Sending " + name(CHUNK_MPSE));
+ client.sendAndConsume(packet, mInst);
+ }
+
+ /**
+ * Handle incoming profiling data. The MPSE packet includes the
+ * complete .trace file.
+ */
+ private void handleMPSE(Client client, ByteBuffer data) {
+ // TODO
+ byte[] stuff = new byte[Math.min(100, data.capacity())];
+ data.get(stuff, 0, stuff.length);
+ String sample = new String(stuff);
+ Log.e("ddm-prof", "GOT MPSE (" + data.capacity() + " bytes): '" +
+ sample + "' ...");
+ }
+
+ /**
* Send a MPRQ (Method PRofiling Query) request to the client.
*/
public static void sendMPRQ(Client client) throws IOException {