Merge "[Frameworks] Add an 'am' cmd option to enable streaming in profiling."
am: e924640c4b
Change-Id: I7e56dd815f5ac72b27ac6e2e2ca7614eaa648db1
This commit is contained in:
@@ -110,6 +110,7 @@ public class Am extends BaseCommand {
|
||||
private String mProfileFile;
|
||||
private int mSamplingInterval;
|
||||
private boolean mAutoStop;
|
||||
private boolean mStreaming; // Streaming the profiling output to a file.
|
||||
private int mStackId;
|
||||
|
||||
/**
|
||||
@@ -127,7 +128,7 @@ public class Am extends BaseCommand {
|
||||
pw.println(
|
||||
"usage: am [subcommand] [options]\n" +
|
||||
"usage: am start [-D] [-N] [-W] [-P <FILE>] [--start-profiler <FILE>]\n" +
|
||||
" [--sampling INTERVAL] [-R COUNT] [-S]\n" +
|
||||
" [--sampling INTERVAL] [--streaming] [-R COUNT] [-S]\n" +
|
||||
" [--track-allocation] [--user <USER_ID> | current] <INTENT>\n" +
|
||||
" am startservice [--user <USER_ID> | current] <INTENT>\n" +
|
||||
" am stopservice [--user <USER_ID> | current] <INTENT>\n" +
|
||||
@@ -138,7 +139,8 @@ public class Am extends BaseCommand {
|
||||
" am instrument [-r] [-e <NAME> <VALUE>] [-p <FILE>] [-w]\n" +
|
||||
" [--user <USER_ID> | current]\n" +
|
||||
" [--no-window-animation] [--abi <ABI>] <COMPONENT>\n" +
|
||||
" am profile start [--user <USER_ID> current] [--sampling INTERVAL] <PROCESS> <FILE>\n" +
|
||||
" am profile start [--user <USER_ID> current] [--sampling INTERVAL]\n"+
|
||||
" [--streaming] <PROCESS> <FILE>\n" +
|
||||
" am profile stop [--user <USER_ID> current] [<PROCESS>]\n" +
|
||||
" am dumpheap [--user <USER_ID> current] [-n] <PROCESS> <FILE>\n" +
|
||||
" am set-debug-app [-w] [--persistent] <PACKAGE>\n" +
|
||||
@@ -191,6 +193,8 @@ public class Am extends BaseCommand {
|
||||
" --start-profiler <FILE>: start profiler and send results to <FILE>\n" +
|
||||
" --sampling INTERVAL: use sample profiling with INTERVAL microseconds\n" +
|
||||
" between samples (use with --start-profiler)\n" +
|
||||
" --streaming: stream the profiling output to the specified file (use\n" +
|
||||
" with --start-profiler)\n" +
|
||||
" -P <FILE>: like above, but profiling stops when app goes idle\n" +
|
||||
" -R: repeat the activity launch <COUNT> times. Prior to each repeat,\n" +
|
||||
" the top activity will be finished.\n" +
|
||||
@@ -250,6 +254,9 @@ public class Am extends BaseCommand {
|
||||
" may be either a process name or pid. Options are:\n" +
|
||||
" --user <USER_ID> | current: When supplying a process name,\n" +
|
||||
" specify user of process to profile; uses current user if not specified.\n" +
|
||||
" --sampling INTERVAL: use sample profiling with INTERVAL microseconds\n" +
|
||||
" between samples\n" +
|
||||
" --streaming: stream the profiling output to the specified file\n" +
|
||||
"\n" +
|
||||
"am dumpheap: dump the heap of a process. The given <PROCESS> argument may\n" +
|
||||
" be either a process name or pid. Options are:\n" +
|
||||
@@ -483,6 +490,7 @@ public class Am extends BaseCommand {
|
||||
mProfileFile = null;
|
||||
mSamplingInterval = 0;
|
||||
mAutoStop = false;
|
||||
mStreaming = false;
|
||||
mUserId = defUser;
|
||||
mStackId = INVALID_STACK_ID;
|
||||
|
||||
@@ -503,6 +511,8 @@ public class Am extends BaseCommand {
|
||||
mAutoStop = false;
|
||||
} else if (opt.equals("--sampling")) {
|
||||
mSamplingInterval = Integer.parseInt(nextArgRequired());
|
||||
} else if (opt.equals("--streaming")) {
|
||||
mStreaming = true;
|
||||
} else if (opt.equals("-R")) {
|
||||
mRepeat = Integer.parseInt(nextArgRequired());
|
||||
} else if (opt.equals("-S")) {
|
||||
@@ -615,7 +625,8 @@ public class Am extends BaseCommand {
|
||||
System.err.println("Consider using a file under /data/local/tmp/");
|
||||
return;
|
||||
}
|
||||
profilerInfo = new ProfilerInfo(mProfileFile, fd, mSamplingInterval, mAutoStop);
|
||||
profilerInfo = new ProfilerInfo(mProfileFile, fd, mSamplingInterval, mAutoStop,
|
||||
mStreaming);
|
||||
}
|
||||
|
||||
IActivityManager.WaitResult result = null;
|
||||
@@ -973,6 +984,7 @@ public class Am extends BaseCommand {
|
||||
int userId = UserHandle.USER_CURRENT;
|
||||
int profileType = 0;
|
||||
mSamplingInterval = 0;
|
||||
mStreaming = false;
|
||||
|
||||
String process = null;
|
||||
|
||||
@@ -986,6 +998,8 @@ public class Am extends BaseCommand {
|
||||
userId = parseUserArg(nextArgRequired());
|
||||
} else if (opt.equals("--wall")) {
|
||||
wall = true;
|
||||
} else if (opt.equals("--streaming")) {
|
||||
mStreaming = true;
|
||||
} else if (opt.equals("--sampling")) {
|
||||
mSamplingInterval = Integer.parseInt(nextArgRequired());
|
||||
} else {
|
||||
@@ -1037,7 +1051,7 @@ public class Am extends BaseCommand {
|
||||
System.err.println("Consider using a file under /data/local/tmp/");
|
||||
return;
|
||||
}
|
||||
profilerInfo = new ProfilerInfo(profileFile, fd, mSamplingInterval, false);
|
||||
profilerInfo = new ProfilerInfo(profileFile, fd, mSamplingInterval, false, mStreaming);
|
||||
}
|
||||
|
||||
try {
|
||||
|
||||
@@ -534,6 +534,7 @@ public final class ActivityThread {
|
||||
ParcelFileDescriptor profileFd;
|
||||
int samplingInterval;
|
||||
boolean autoStopProfiler;
|
||||
boolean streamingOutput;
|
||||
boolean profiling;
|
||||
boolean handlingProfiling;
|
||||
public void setProfiler(ProfilerInfo profilerInfo) {
|
||||
@@ -559,6 +560,7 @@ public final class ActivityThread {
|
||||
profileFd = fd;
|
||||
samplingInterval = profilerInfo.samplingInterval;
|
||||
autoStopProfiler = profilerInfo.autoStopProfiler;
|
||||
streamingOutput = profilerInfo.streamingOutput;
|
||||
}
|
||||
public void startProfiling() {
|
||||
if (profileFd == null || profiling) {
|
||||
@@ -567,7 +569,8 @@ public final class ActivityThread {
|
||||
try {
|
||||
int bufferSize = SystemProperties.getInt("debug.traceview-buffer-size-mb", 8);
|
||||
VMDebug.startMethodTracing(profileFile, profileFd.getFileDescriptor(),
|
||||
bufferSize * 1024 * 1024, 0, samplingInterval != 0, samplingInterval);
|
||||
bufferSize * 1024 * 1024, 0, samplingInterval != 0, samplingInterval,
|
||||
streamingOutput);
|
||||
profiling = true;
|
||||
} catch (RuntimeException e) {
|
||||
Slog.w(TAG, "Profiling failed on path " + profileFile);
|
||||
@@ -5109,6 +5112,7 @@ public final class ActivityThread {
|
||||
mProfiler.profileFd = data.initProfilerInfo.profileFd;
|
||||
mProfiler.samplingInterval = data.initProfilerInfo.samplingInterval;
|
||||
mProfiler.autoStopProfiler = data.initProfilerInfo.autoStopProfiler;
|
||||
mProfiler.streamingOutput = data.initProfilerInfo.streamingOutput;
|
||||
}
|
||||
|
||||
// send up app name; do this *before* waiting for debugger
|
||||
|
||||
@@ -39,11 +39,16 @@ public class ProfilerInfo implements Parcelable {
|
||||
/* Automatically stop the profiler when the app goes idle. */
|
||||
public final boolean autoStopProfiler;
|
||||
|
||||
public ProfilerInfo(String filename, ParcelFileDescriptor fd, int interval, boolean autoStop) {
|
||||
/* Indicates whether to stream the profiling info to the out file continuously. */
|
||||
public final boolean streamingOutput;
|
||||
|
||||
public ProfilerInfo(String filename, ParcelFileDescriptor fd, int interval, boolean autoStop,
|
||||
boolean streaming) {
|
||||
profileFile = filename;
|
||||
profileFd = fd;
|
||||
samplingInterval = interval;
|
||||
autoStopProfiler = autoStop;
|
||||
streamingOutput = streaming;
|
||||
}
|
||||
|
||||
public int describeContents() {
|
||||
@@ -64,6 +69,7 @@ public class ProfilerInfo implements Parcelable {
|
||||
}
|
||||
out.writeInt(samplingInterval);
|
||||
out.writeInt(autoStopProfiler ? 1 : 0);
|
||||
out.writeInt(streamingOutput ? 1 : 0);
|
||||
}
|
||||
|
||||
public static final Parcelable.Creator<ProfilerInfo> CREATOR =
|
||||
@@ -82,5 +88,6 @@ public class ProfilerInfo implements Parcelable {
|
||||
profileFd = in.readInt() != 0 ? ParcelFileDescriptor.CREATOR.createFromParcel(in) : null;
|
||||
samplingInterval = in.readInt();
|
||||
autoStopProfiler = in.readInt() != 0;
|
||||
streamingOutput = in.readInt() != 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1119,8 +1119,8 @@ public final class Debug
|
||||
* @hide
|
||||
*/
|
||||
public static void startMethodTracing(String traceName, FileDescriptor fd,
|
||||
int bufferSize, int flags) {
|
||||
VMDebug.startMethodTracing(traceName, fd, bufferSize, flags, false, 0);
|
||||
int bufferSize, int flags, boolean streamOutput) {
|
||||
VMDebug.startMethodTracing(traceName, fd, bufferSize, flags, false, 0, streamOutput);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1381,6 +1381,7 @@ public final class ActivityManagerService extends ActivityManagerNative
|
||||
ParcelFileDescriptor mProfileFd;
|
||||
int mSamplingInterval = 0;
|
||||
boolean mAutoStopProfiler = false;
|
||||
boolean mStreamingOutput = false;
|
||||
int mProfileType = 0;
|
||||
final ProcessMap<Pair<Long, String>> mMemWatchProcesses = new ProcessMap<>();
|
||||
String mMemWatchDumpProcName;
|
||||
@@ -6566,12 +6567,14 @@ public final class ActivityManagerService extends ActivityManagerNative
|
||||
ParcelFileDescriptor profileFd = null;
|
||||
int samplingInterval = 0;
|
||||
boolean profileAutoStop = false;
|
||||
boolean profileStreamingOutput = false;
|
||||
if (mProfileApp != null && mProfileApp.equals(processName)) {
|
||||
mProfileProc = app;
|
||||
profileFile = mProfileFile;
|
||||
profileFd = mProfileFd;
|
||||
samplingInterval = mSamplingInterval;
|
||||
profileAutoStop = mAutoStopProfiler;
|
||||
profileStreamingOutput = mStreamingOutput;
|
||||
}
|
||||
boolean enableTrackAllocation = false;
|
||||
if (mTrackAllocationApp != null && mTrackAllocationApp.equals(processName)) {
|
||||
@@ -6601,7 +6604,8 @@ public final class ActivityManagerService extends ActivityManagerNative
|
||||
profileFd = profileFd.dup();
|
||||
}
|
||||
ProfilerInfo profilerInfo = profileFile == null ? null
|
||||
: new ProfilerInfo(profileFile, profileFd, samplingInterval, profileAutoStop);
|
||||
: new ProfilerInfo(profileFile, profileFd, samplingInterval, profileAutoStop,
|
||||
profileStreamingOutput);
|
||||
thread.bindApplication(processName, appInfo, providers, app.instrumentationClass,
|
||||
profilerInfo, app.instrumentationArguments, app.instrumentationWatcher,
|
||||
app.instrumentationUiAutomationConnection, testMode,
|
||||
@@ -12034,6 +12038,7 @@ public final class ActivityManagerService extends ActivityManagerNative
|
||||
mProfileFd = profilerInfo.profileFd;
|
||||
mSamplingInterval = profilerInfo.samplingInterval;
|
||||
mAutoStopProfiler = profilerInfo.autoStopProfiler;
|
||||
mStreamingOutput = profilerInfo.streamingOutput;
|
||||
mProfileType = 0;
|
||||
}
|
||||
}
|
||||
@@ -14915,7 +14920,7 @@ public final class ActivityManagerService extends ActivityManagerNative
|
||||
pw.println(" mProfileApp=" + mProfileApp + " mProfileProc=" + mProfileProc);
|
||||
pw.println(" mProfileFile=" + mProfileFile + " mProfileFd=" + mProfileFd);
|
||||
pw.println(" mSamplingInterval=" + mSamplingInterval + " mAutoStopProfiler="
|
||||
+ mAutoStopProfiler);
|
||||
+ mAutoStopProfiler + " mStreamingOutput=" + mStreamingOutput);
|
||||
pw.println(" mProfileType=" + mProfileType);
|
||||
}
|
||||
}
|
||||
@@ -21434,6 +21439,7 @@ public final class ActivityManagerService extends ActivityManagerNative
|
||||
mProfileFile = null;
|
||||
mProfileType = 0;
|
||||
mAutoStopProfiler = false;
|
||||
mStreamingOutput = false;
|
||||
mSamplingInterval = 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -1296,7 +1296,8 @@ public final class ActivityStackSupervisor implements DisplayListener {
|
||||
}
|
||||
|
||||
profilerInfo = new ProfilerInfo(profileFile, profileFd,
|
||||
mService.mSamplingInterval, mService.mAutoStopProfiler);
|
||||
mService.mSamplingInterval, mService.mAutoStopProfiler,
|
||||
mService.mStreamingOutput);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user