import org.chromium.base.CalledByNative;
import org.chromium.base.JNINamespace;
-import org.chromium.base.TraceEvent;
import org.chromium.content.R;
import java.io.File;
private static final String ACTION_START = "GPU_PROFILER_START";
private static final String ACTION_STOP = "GPU_PROFILER_STOP";
+ private static final String ACTION_LIST_CATEGORIES = "GPU_PROFILER_LIST_CATEGORIES";
private static final String FILE_EXTRA = "file";
private static final String CATEGORIES_EXTRA = "categories";
private static final String RECORD_CONTINUOUSLY_EXTRA = "continuous";
}
/**
- * Start profiling to a new file in the Downloads directory.
- *
- * Calls #startTracing(String, boolean, String, boolean) with a new timestamped filename.
- * @see #startTracing(String, boolean, String, boolean)
+ * Generates a unique filename to be used for tracing in the Downloads directory.
*/
- public boolean startTracing(boolean showToasts, String categories,
- boolean recordContinuously) {
- mShowToasts = showToasts;
+ @CalledByNative
+ private static String generateTracingFilePath() {
String state = Environment.getExternalStorageState();
if (!Environment.MEDIA_MOUNTED.equals(state)) {
- logAndToastError(
- mContext.getString(R.string.profiler_no_storage_toast));
- return false;
+ return null;
}
// Generate a hopefully-unique filename using the UTC timestamp.
Environment.DIRECTORY_DOWNLOADS);
File file = new File(
dir, "chrome-profile-results-" + formatter.format(new Date()));
+ return file.getPath();
+ }
- return startTracing(file.getPath(), showToasts, categories, recordContinuously);
+ /**
+ * Start profiling to a new file in the Downloads directory.
+ *
+ * Calls #startTracing(String, boolean, String, boolean) with a new timestamped filename.
+ * @see #startTracing(String, boolean, String, boolean)
+ */
+ public boolean startTracing(boolean showToasts, String categories,
+ boolean recordContinuously) {
+ mShowToasts = showToasts;
+
+ String filePath = generateTracingFilePath();
+ if (filePath == null) {
+ logAndToastError(
+ mContext.getString(R.string.profiler_no_storage_toast));
+ }
+ return startTracing(filePath, showToasts, categories, recordContinuously);
+ }
+
+ private void initializeNativeControllerIfNeeded() {
+ if (mNativeTracingControllerAndroid == 0) {
+ mNativeTracingControllerAndroid = nativeInit();
+ }
}
/**
return false;
}
// Lazy initialize the native side, to allow construction before the library is loaded.
- if (mNativeTracingControllerAndroid == 0) {
- mNativeTracingControllerAndroid = nativeInit();
- }
- if (!nativeStartTracing(mNativeTracingControllerAndroid, filename, categories,
+ initializeNativeControllerIfNeeded();
+ if (!nativeStartTracing(mNativeTracingControllerAndroid, categories,
recordContinuously)) {
logAndToastError(mContext.getString(R.string.profiler_error_toast));
return false;
}
logAndToastInfo(mContext.getString(R.string.profiler_started_toast) + ": " + categories);
- TraceEvent.setEnabledToMatchNative();
mFilename = filename;
mIsTracing = true;
return true;
*/
public void stopTracing() {
if (isTracing()) {
- nativeStopTracing(mNativeTracingControllerAndroid);
+ nativeStopTracing(mNativeTracingControllerAndroid, mFilename);
}
}
logAndToastInfo(
mContext.getString(R.string.profiler_stopped_toast, mFilename));
- TraceEvent.setEnabledToMatchNative();
mIsTracing = false;
mFilename = null;
}
+ /**
+ * Get known category groups.
+ */
+ public void getCategoryGroups() {
+ // Lazy initialize the native side, to allow construction before the library is loaded.
+ initializeNativeControllerIfNeeded();
+ if (!nativeGetKnownCategoryGroupsAsync(mNativeTracingControllerAndroid)) {
+ Log.e(TAG, "Unable to fetch tracing record groups list.");
+ }
+ }
+
@Override
protected void finalize() {
if (mNativeTracingControllerAndroid != 0) {
TracingIntentFilter(Context context) {
addAction(context.getPackageName() + "." + ACTION_START);
addAction(context.getPackageName() + "." + ACTION_STOP);
+ addAction(context.getPackageName() + "." + ACTION_LIST_CATEGORIES);
}
}
}
} else if (intent.getAction().endsWith(ACTION_STOP)) {
stopTracing();
+ } else if (intent.getAction().endsWith(ACTION_LIST_CATEGORIES)) {
+ getCategoryGroups();
} else {
Log.e(TAG, "Unexpected intent: " + intent);
}
private long mNativeTracingControllerAndroid;
private native long nativeInit();
private native void nativeDestroy(long nativeTracingControllerAndroid);
- private native boolean nativeStartTracing(long nativeTracingControllerAndroid, String filename,
- String categories, boolean recordContinuously);
- private native void nativeStopTracing(long nativeTracingControllerAndroid);
+ private native boolean nativeStartTracing(
+ long nativeTracingControllerAndroid, String categories, boolean recordContinuously);
+ private native void nativeStopTracing(long nativeTracingControllerAndroid, String filename);
+ private native boolean nativeGetKnownCategoryGroupsAsync(long nativeTracingControllerAndroid);
private native String nativeGetDefaultCategories();
}