Produce code coverage results

We now include a code-coverage report that can be processed to give
us coverage metrics.

A Code coverage report is generated by doing a full debug build, which
will enable the profiler to collect metrics during the test phase.

The generated profiler data will be stored in code-coverage.zip that can
be further processed by other tools.

Change-Id: Iad2b3a453cd2579735ddbe669a173dec1129c87f
diff --git a/src/main/groovy/com/android/tools/internal/emulator/BuildEmulator.groovy b/src/main/groovy/com/android/tools/internal/emulator/BuildEmulator.groovy
index e7433df..9163d88 100644
--- a/src/main/groovy/com/android/tools/internal/emulator/BuildEmulator.groovy
+++ b/src/main/groovy/com/android/tools/internal/emulator/BuildEmulator.groovy
@@ -82,6 +82,9 @@
     }
 
     boolean windows = false
+
+    // True if this is a full debug build which includes coverage.
+    boolean debug = false
     @Input
     String revision
 
@@ -91,9 +94,18 @@
     @TaskAction
     void build() {
 
-        String command = windows ?
-                "$project.projectDir/android/rebuild.sh --verbose --mingw --out-dir=$output --sdk-revision=$revision --sdk-build-number=$build_number --symbols --crash-prod" :
-                "$project.projectDir/android/rebuild.sh --verbose --out-dir=$output --sdk-revision=$revision --sdk-build-number=$build_number --symbols --crash-prod"
+        String command = "$project.projectDir/android/rebuild.sh --verbose --out-dir=$output --sdk-revision=$revision --sdk-build-number=$build_number"
+
+
+        if (windows) {
+            command = command + " --mingw"
+        }
+
+        if (debug) {
+            command = command + " --debug"
+        } else {
+            command = command + " --symbols --crash-prod"
+        }
 
         LoggerWriter stdout = new LoggerWriter(logger, LogLevel.INFO)
         LoggerWriter stderr = new LoggerWriter(logger, LogLevel.ERROR)
@@ -110,15 +122,21 @@
         stdout.reset();
         stderr.reset();
 
+        if (!debug) {
+            uploadSymbols(stdout, stderr)
+        }
+    }
+
+    void uploadSymbols(LoggerWriter stdout, LoggerWriter stderr) {
         /**
          * Upload the symbols
          */
-        command = "$project.projectDir/android/scripts/upload-symbols.sh --crash-prod --symbol-dir=$output/build/symbols"
+        String command = "$project.projectDir/android/scripts/upload-symbols.sh --crash-prod --symbol-dir=$output/build/symbols"
 
-        p = command.execute()
+        Process p = command.execute()
         p.consumeProcessOutput(stdout, stderr)
 
-        result = p.waitFor()
+        int result = p.waitFor()
 
         /*
           upload symbols throws errors intermittently due to use of xargs
diff --git a/src/main/groovy/com/android/tools/internal/sdk/base/SdkEmulatorPlugin.groovy b/src/main/groovy/com/android/tools/internal/sdk/base/SdkEmulatorPlugin.groovy
index 2c3d387..9a5fbbf 100644
--- a/src/main/groovy/com/android/tools/internal/sdk/base/SdkEmulatorPlugin.groovy
+++ b/src/main/groovy/com/android/tools/internal/sdk/base/SdkEmulatorPlugin.groovy
@@ -79,6 +79,11 @@
         copyFiles.noticeTaskNames = noticeTaskNames
         copyFiles.mustRunAfter cleanFolder
 
+        Task copyCodeCoverage = project.tasks.create("copyBuild${platformName.capitalize()}CodeCoverage", Copy)
+        copyCodeCoverage.from(sdkDebugRoot).include("**/*code-coverage.zip")
+        copyCodeCoverage.destinationDir = project.ext.androidHostDist
+        copyCodeCoverage.mustRunAfter copyFiles
+
         Task copyBuildInfo = project.tasks.create("copyBuild${platformName.capitalize()}Info", Copy)
         copyBuildInfo.from(sdkRoot).include("android-info.txt")
         copyBuildInfo.destinationDir = project.ext.androidHostDist
@@ -89,7 +94,9 @@
         zipFiles.destinationDir = project.ext.androidHostDist
 
         Zip zipDebugFiles = project.tasks.create("zip${platformName.capitalize()}DebugSdk", Zip)
-        zipDebugFiles.from(sdkDebugRoot)
+        // Tool items do not support multiple labels (only release/debug). We don't want
+        // The code-coverage zip to end up in th final debug/release zip. (b/111696853)
+        zipDebugFiles.from(sdkDebugRoot).exclude("**/*code-coverage.zip")
         zipDebugFiles.destinationDir = project.ext.androidHostDist
 
         String buildNumber = System.getenv("BUILD_NUMBER")
@@ -111,7 +118,7 @@
 
         makeTask.description = "Packages the ${platformName.capitalize()} emulator"
         makeTask.group = "Android SDK"
-        makeTask.dependsOn cleanFolder, copyFiles, zipFiles, zipDebugFiles, copyBuildInfo
+        makeTask.dependsOn cleanFolder, copyFiles, zipFiles, zipDebugFiles, copyBuildInfo, copyCodeCoverage
         project.afterEvaluate {
             List<Task> copyTasks = Lists.newArrayList()