aboutsummaryrefslogtreecommitdiffstats
path: root/ddms
diff options
context:
space:
mode:
Diffstat (limited to 'ddms')
-rw-r--r--ddms/libs/ddmlib/src/com/android/ddmlib/Client.java2
-rw-r--r--ddms/libs/ddmlib/src/com/android/ddmlib/ClientData.java24
-rw-r--r--ddms/libs/ddmlib/src/com/android/ddmlib/HandleProfiling.java60
-rw-r--r--ddms/libs/ddmuilib/src/com/android/ddmuilib/InfoPanel.java16
-rw-r--r--ddms/libs/ddmuilib/src/com/android/ddmuilib/handler/MethodProfilingHandler.java28
5 files changed, 114 insertions, 16 deletions
diff --git a/ddms/libs/ddmlib/src/com/android/ddmlib/Client.java b/ddms/libs/ddmlib/src/com/android/ddmlib/Client.java
index 52c9506..efa47d7 100644
--- a/ddms/libs/ddmlib/src/com/android/ddmlib/Client.java
+++ b/ddms/libs/ddmlib/src/com/android/ddmlib/Client.java
@@ -241,7 +241,7 @@ public class Client {
}
public void toggleMethodProfiling() {
- boolean canStream = false; //mClientData.hasFeature(ClientData.FEATURE_PROFILING_STREAMING);
+ boolean canStream = mClientData.hasFeature(ClientData.FEATURE_PROFILING_STREAMING);
try {
if (mClientData.getMethodProfilingStatus() == MethodProfilingStatus.ON) {
if (canStream) {
diff --git a/ddms/libs/ddmlib/src/com/android/ddmlib/ClientData.java b/ddms/libs/ddmlib/src/com/android/ddmlib/ClientData.java
index 53e1352..a064634 100644
--- a/ddms/libs/ddmlib/src/com/android/ddmlib/ClientData.java
+++ b/ddms/libs/ddmlib/src/com/android/ddmlib/ClientData.java
@@ -18,6 +18,7 @@ package com.android.ddmlib;
import com.android.ddmlib.HeapSegment.HeapSegmentElement;
+import java.io.File;
import java.nio.BufferUnderflowException;
import java.nio.ByteBuffer;
import java.util.ArrayList;
@@ -315,10 +316,29 @@ public class ClientData {
void onSuccess(String remoteFilePath, Client client);
/**
- * Called when method tracing failed.
+ * Called when a method tracing was successful.
+ * @param remoteFilePath the device-side path of the trace file.
* @param client the client that was profiled.
*/
- void onFailure(Client client);
+ void onSuccess(File localFile, Client client);
+
+ /**
+ * Called when method tracing failed to start
+ * @param client the client that was profiled.
+ */
+ void onStartFailure(Client client);
+
+ /**
+ * Called when method tracing failed to end on the VM side
+ * @param client the client that was profiled.
+ */
+ void onEndFailure(Client client);
+
+ /**
+ * Called when method tracing failed to end locally.
+ * @param client the client that was profiled.
+ */
+ void onEndLocalFailure(Client client, String message);
}
/**
diff --git a/ddms/libs/ddmlib/src/com/android/ddmlib/HandleProfiling.java b/ddms/libs/ddmlib/src/com/android/ddmlib/HandleProfiling.java
index fcc1d26..7d2eb45 100644
--- a/ddms/libs/ddmlib/src/com/android/ddmlib/HandleProfiling.java
+++ b/ddms/libs/ddmlib/src/com/android/ddmlib/HandleProfiling.java
@@ -19,6 +19,8 @@ package com.android.ddmlib;
import com.android.ddmlib.ClientData.IMethodProfilingHandler;
import com.android.ddmlib.ClientData.MethodProfilingStatus;
+import java.io.File;
+import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
@@ -154,7 +156,7 @@ final class HandleProfiling extends ChunkHandler {
Log.d("ddm-prof", "Method profiling has finished");
} else {
- handler.onFailure(client);
+ handler.onEndFailure(client);
Log.w("ddm-prof", "Method profiling has failed (check device log)");
}
@@ -213,12 +215,42 @@ final class HandleProfiling extends ChunkHandler {
* 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 + "' ...");
+ IMethodProfilingHandler handler = ClientData.getMethodProfilingHandler();
+ if (handler != null) {
+ FileOutputStream fos = null;
+ try {
+ File f = File.createTempFile(client.getClientData().getClientDescription(),
+ ".trace");
+ fos = new FileOutputStream(f);
+
+ byte[] stuff = new byte[data.capacity()];
+ data.get(stuff, 0, stuff.length);
+
+ fos.write(stuff);
+ fos.close();
+ fos = null;
+
+ Log.d("ddm-prof", "got trace file, size: " + data.capacity() + " bytes");
+
+ handler.onSuccess(f, client);
+ } catch (IOException e) {
+ handler.onEndLocalFailure(client, e.getMessage());
+
+ Log.e("ddm-prof", "fail to write trace file: " + e.getMessage());
+ Log.e("ddm-prof", e);
+ } finally {
+ if (fos != null) {
+ try {
+ fos.close();
+ } catch (IOException e) {
+ //ignore
+ }
+ }
+ }
+ }
+
+ client.getClientData().setMethodProfilingStatus(MethodProfilingStatus.OFF);
+ client.update(Client.CHANGE_METHOD_PROFILING_STATUS);
}
/**
@@ -255,7 +287,9 @@ final class HandleProfiling extends ChunkHandler {
}
private void handleFAIL(Client client, ByteBuffer data) {
- // this can be sent if MPRS failed (like wrong permission)
+ // this can be sent if
+ // - MPRS failed (like wrong permission)
+ // - MPSE failed for whatever reason
String filename = client.getClientData().getPendingMethodProfiling();
if (filename != null) {
@@ -265,9 +299,15 @@ final class HandleProfiling extends ChunkHandler {
// and notify of failure
IMethodProfilingHandler handler = ClientData.getMethodProfilingHandler();
if (handler != null) {
- handler.onFailure(client);
+ handler.onStartFailure(client);
+ }
+ } else {
+ // this is MPRE
+ // notify of failure
+ IMethodProfilingHandler handler = ClientData.getMethodProfilingHandler();
+ if (handler != null) {
+ handler.onEndFailure(client);
}
-
}
// send a query to know the current status
diff --git a/ddms/libs/ddmuilib/src/com/android/ddmuilib/InfoPanel.java b/ddms/libs/ddmuilib/src/com/android/ddmuilib/InfoPanel.java
index 6cbb999..d6979cb 100644
--- a/ddms/libs/ddmuilib/src/com/android/ddmuilib/InfoPanel.java
+++ b/ddms/libs/ddmuilib/src/com/android/ddmuilib/InfoPanel.java
@@ -164,10 +164,22 @@ public class InfoPanel extends TablePanel {
item.setText(1, isDdmAware);
item = mTable.getItem(ENT_PROCESS_ID);
item.setText(1, pid);
+
item = mTable.getItem(ENT_SUPPORTS_PROFILING);
- item.setText(1, Boolean.toString(cd.hasFeature(ClientData.FEATURE_PROFILING)));
+ if (cd.hasFeature(ClientData.FEATURE_PROFILING_STREAMING)) {
+ item.setText(1, "Yes");
+ } else if (cd.hasFeature(ClientData.FEATURE_PROFILING)) {
+ item.setText(1, "Yes (Application must be able to write on the SD Card)");
+ } else {
+ item.setText(1, "No");
+ }
+
item = mTable.getItem(ENT_SUPPORTS_HPROF);
- item.setText(1, Boolean.toString(cd.hasFeature(ClientData.FEATURE_HPROF)));
+ if (cd.hasFeature(ClientData.FEATURE_HPROF)) {
+ item.setText(1, "Yes (Application must be able to write on the SD Card)");
+ } else {
+ item.setText(1, "No");
+ }
}
mCol2.pack();
diff --git a/ddms/libs/ddmuilib/src/com/android/ddmuilib/handler/MethodProfilingHandler.java b/ddms/libs/ddmuilib/src/com/android/ddmuilib/handler/MethodProfilingHandler.java
index f469a7d..c029186 100644
--- a/ddms/libs/ddmuilib/src/com/android/ddmuilib/handler/MethodProfilingHandler.java
+++ b/ddms/libs/ddmuilib/src/com/android/ddmuilib/handler/MethodProfilingHandler.java
@@ -45,7 +45,7 @@ public class MethodProfilingHandler extends BaseFileHandler
super(parentShell);
}
- public void onFailure(final Client client) {
+ public void onStartFailure(final Client client) {
mParentShell.getDisplay().asyncExec(new Runnable() {
public void run() {
displayError(
@@ -56,6 +56,28 @@ public class MethodProfilingHandler extends BaseFileHandler
});
}
+ public void onEndFailure(final Client client) {
+ mParentShell.getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ displayError(
+ "Unable to finish Method Profiling for application '%1$s'.\n" +
+ "Check logcat for more information.",
+ client.getClientData().getClientDescription());
+ }
+ });
+ }
+
+ public void onEndLocalFailure(final Client client, final String message) {
+ mParentShell.getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ displayError(String.format(
+ "Unable to write trace file locally for application\n\t%1$s\n\n%2$s",
+ client.getClientData().getClientDescription(),
+ message));
+ }
+ });
+ }
+
public void onSuccess(final String remoteFilePath, final Client client) {
mParentShell.getDisplay().asyncExec(new Runnable() {
public void run() {
@@ -85,6 +107,10 @@ public class MethodProfilingHandler extends BaseFileHandler
});
}
+ public void onSuccess(File localFile, final Client client) {
+ openInTraceview(localFile.getAbsolutePath());
+ }
+
private void pullAndOpen(SyncService sync, String remoteFilePath)
throws InvocationTargetException, InterruptedException, IOException {
// get a temp file