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()