Make perf metrics collection & output via instrumentation simpler

- Added includeDetailedStats metadata to TimedTest for collecting additional
  metrics like memory usage and binder transactions
- Added PerformanceCollectorTestCase interface for hard-typing test class as
  performance test while still able to inherit from instrumenation test classes
- Reverted previous changes to PerformanceTestBase, will deprecate
  PerformanceTestBase/Case in a future CL
- Removed 'performance.' prefix from keys written to instrumentation output
diff --git a/test-runner/android/test/InstrumentationTestRunner.java b/test-runner/android/test/InstrumentationTestRunner.java
index 773d7a9..3e9cd9f 100644
--- a/test-runner/android/test/InstrumentationTestRunner.java
+++ b/test-runner/android/test/InstrumentationTestRunner.java
@@ -27,8 +27,6 @@
 import android.os.Looper;
 import android.os.Parcelable;
 import android.os.PerformanceCollector;
-import android.os.Process;
-import android.os.SystemClock;
 import android.os.PerformanceCollector.PerformanceResultsWriter;
 import android.test.suitebuilder.TestMethod;
 import android.test.suitebuilder.TestPredicates;
@@ -226,23 +224,6 @@
      * identifies the path to the generated code coverage file.
      */
     private static final String REPORT_KEY_COVERAGE_PATH = "coverageFilePath";
-    /**
-     * If included at the start of reporting keys, this prefix marks the key as a performance
-     * metric.
-     */
-    private static final String REPORT_KEY_PREFIX = "performance.";
-    /**
-     * If included in the status or final bundle sent to an IInstrumentationWatcher, this key
-     * reports the cpu time in milliseconds of the current test.
-     */
-    private static final String REPORT_KEY_PERF_CPU_TIME =
-        REPORT_KEY_PREFIX + PerformanceCollector.METRIC_KEY_CPU_TIME;
-    /**
-     * If included in the status or final bundle sent to an IInstrumentationWatcher, this key
-     * reports the run time in milliseconds of the current test.
-     */
-    private static final String REPORT_KEY_PERF_EXECUTION_TIME =
-        REPORT_KEY_PREFIX + PerformanceCollector.METRIC_KEY_EXECUTION_TIME;
 
     /**
      * The test is starting.
@@ -630,9 +611,9 @@
         int mTestNum = 0;
         int mTestResultCode = 0;
         String mTestClass = null;
+        PerformanceCollector mPerfCollector = new PerformanceCollector();
         boolean mIsTimedTest = false;
-        long mCpuTime = 0;
-        long mExecTime = 0;
+        boolean mIncludeDetailedStats = false;
 
         public WatcherResultPrinter(int numTests) {
             mResultTemplate = new Bundle();
@@ -675,20 +656,28 @@
             mTestResultCode = 0;
 
             mIsTimedTest = false;
+            mIncludeDetailedStats = false;
             try {
-                // Look for TimedTest annotation on both test class and test
-                // method
-                mIsTimedTest = test.getClass().isAnnotationPresent(TimedTest.class) ||
-                    test.getClass().getMethod(testName).isAnnotationPresent(TimedTest.class);
+                // Look for TimedTest annotation on both test class and test method
+                if (test.getClass().getMethod(testName).isAnnotationPresent(TimedTest.class)) {
+                    mIsTimedTest = true;
+                    mIncludeDetailedStats = test.getClass().getMethod(testName).getAnnotation(
+                            TimedTest.class).includeDetailedStats();
+                } else if (test.getClass().isAnnotationPresent(TimedTest.class)) {
+                    mIsTimedTest = true;
+                    mIncludeDetailedStats = test.getClass().getAnnotation(
+                            TimedTest.class).includeDetailedStats();
+                }
             } catch (SecurityException e) {
                 throw new IllegalStateException(e);
             } catch (NoSuchMethodException e) {
                 throw new IllegalStateException(e);
             }
 
-            if (mIsTimedTest) {
-                mExecTime = SystemClock.uptimeMillis();
-                mCpuTime = Process.getElapsedCpuTime();
+            if (mIsTimedTest && mIncludeDetailedStats) {
+                mPerfCollector.beginSnapshot("");
+            } else if (mIsTimedTest) {
+                mPerfCollector.startTiming("");
             }
         }
 
@@ -720,11 +709,10 @@
          * @see junit.framework.TestListener#endTest(Test)
          */
         public void endTest(Test test) {
-            if (mIsTimedTest) {
-                mCpuTime = Process.getElapsedCpuTime() - mCpuTime;
-                mExecTime = SystemClock.uptimeMillis() - mExecTime;
-                mTestResult.putLong(REPORT_KEY_PERF_CPU_TIME, mCpuTime);
-                mTestResult.putLong(REPORT_KEY_PERF_EXECUTION_TIME, mExecTime);
+            if (mIsTimedTest && mIncludeDetailedStats) {
+                mTestResult.putAll(mPerfCollector.endSnapshot());
+            } else if (mIsTimedTest) {
+                writeStopTiming(mPerfCollector.stopTiming(""));
             }
 
             if (mTestResultCode == 0) {
@@ -760,7 +748,7 @@
             for (Parcelable p :
                     results.getParcelableArrayList(PerformanceCollector.METRIC_KEY_ITERATIONS)) {
                 Bundle iteration = (Bundle)p;
-                String index = "performance.iteration" + i + ".";
+                String index = "iteration" + i + ".";
                 mTestResult.putString(index + PerformanceCollector.METRIC_KEY_LABEL,
                         iteration.getString(PerformanceCollector.METRIC_KEY_LABEL));
                 mTestResult.putLong(index + PerformanceCollector.METRIC_KEY_CPU_TIME,
@@ -772,15 +760,15 @@
         }
 
         public void writeMeasurement(String label, long value) {
-            mTestResult.putLong(REPORT_KEY_PREFIX + label, value);
+            mTestResult.putLong(label, value);
         }
 
         public void writeMeasurement(String label, float value) {
-            mTestResult.putFloat(REPORT_KEY_PREFIX + label, value);
+            mTestResult.putFloat(label, value);
         }
 
         public void writeMeasurement(String label, String value) {
-            mTestResult.putString(REPORT_KEY_PREFIX + label, value);
+            mTestResult.putString(label, value);
         }
 
         // TODO report the end of the cycle