diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java | 23 | ||||
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/java/ProguardHelper.java | 42 |
2 files changed, 36 insertions, 29 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java index cbebe5f8ad..662efcfd06 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java @@ -831,17 +831,30 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { .add(sdk.getAndroidJar()) .addTransitive(common.getTransitiveNeverLinkLibraries()) .build(); - ProguardOutput result = ProguardHelper.createProguardAction(ruleContext, sdk.getProguard(), - deployJarArtifact, proguardSpecs, proguardMapping, libraryJars, proguardOutputJar, + ProguardOutput result = ProguardHelper.createProguardAction( + ruleContext, + sdk.getProguard(), + deployJarArtifact, + proguardSpecs, + proguardMapping, + libraryJars, + proguardOutputJar, ruleContext.attributes().get("proguard_generate_mapping", Type.BOOLEAN), - ruleContext.attributes().has("proguard_optimization_passes", Type.INTEGER) - ? ruleContext.attributes().get("proguard_optimization_passes", Type.INTEGER) - : null); + getProguardOptimizationPasses(ruleContext)); // Since Proguard is being run, add its output artifacts to the given filesBuilder result.addAllToSet(filesBuilder); return result; } + @Nullable + private static Integer getProguardOptimizationPasses(RuleContext ruleContext) { + if (ruleContext.attributes().has("proguard_optimization_passes", Type.INTEGER)) { + return ruleContext.attributes().get("proguard_optimization_passes", Type.INTEGER); + } else { + return null; + } + } + private static ProguardOutput createEmptyProguardAction(RuleContext ruleContext, Artifact proguardOutputJar, Artifact deployJarArtifact) throws InterruptedException { ImmutableList.Builder<Artifact> failures = diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/ProguardHelper.java b/src/main/java/com/google/devtools/build/lib/rules/java/ProguardHelper.java index 8864ec1421..3dbdc860af 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/ProguardHelper.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/ProguardHelper.java @@ -242,6 +242,7 @@ public abstract class ProguardHelper { Artifact proguardOutputJar, boolean mappingRequested, @Nullable Integer optimizationPasses) throws InterruptedException { + JavaOptimizationMode optMode = getJavaOptimizationMode(ruleContext); Preconditions.checkArgument(optMode != JavaOptimizationMode.NOOP); Preconditions.checkArgument(optMode != JavaOptimizationMode.LEGACY || !proguardSpecs.isEmpty()); @@ -269,10 +270,6 @@ public abstract class ProguardHelper { .setProgressMessage("Trimming binary with Proguard") .addOutput(proguardOutputJar); - if (proguardOutputMap != null) { - builder.addOutput(proguardOutputMap); - } - ruleContext.registerAction(builder.build(ruleContext)); } else { // Optimization passes have been specified, so run proguard in multiple phases. @@ -287,13 +284,13 @@ public abstract class ProguardHelper { proguardMapping, libraryJars, proguardOutputJar, - proguardOutputMap) + /* proguardOutputMap */ null) .setProgressMessage("Trimming binary with Proguard: Verification/Shrinking Pass") .addArgument("-runtype INITIAL") - .addOutput(lastStageOutput) .addArgument("-nextstageoutput") - .addArgument(lastStageOutput.getExecPathString()) + .addOutputArgument(lastStageOutput) .build(ruleContext)); + for (int i = 0; i < optimizationPasses; i++) { Artifact optimizationOutput = getProguardTempArtifact( ruleContext, optMode.name().toLowerCase(), "proguard_optimization_" + (i + 1) + ".jar"); @@ -305,15 +302,13 @@ public abstract class ProguardHelper { proguardMapping, libraryJars, proguardOutputJar, - proguardOutputMap) + /* proguardOutputMap */ null) .setProgressMessage("Trimming binary with Proguard: Optimization Pass " + (i + 1)) .addArgument("-runtype OPTIMIZATION") - .addInput(lastStageOutput) .addArgument("-laststageoutput") - .addArgument(lastStageOutput.getExecPathString()) - .addOutput(optimizationOutput) + .addInputArgument(lastStageOutput) .addArgument("-nextstageoutput") - .addArgument(optimizationOutput.getExecPathString()) + .addOutputArgument(optimizationOutput) .build(ruleContext)); lastStageOutput = optimizationOutput; } @@ -328,15 +323,10 @@ public abstract class ProguardHelper { proguardOutputMap) .setProgressMessage("Trimming binary with Proguard: Obfuscation and Final Ouput Pass") .addArgument("-runtype FINAL") - .addInput(lastStageOutput) .addArgument("-laststageoutput") - .addArgument(lastStageOutput.getExecPathString()) + .addInputArgument(lastStageOutput) .addOutput(proguardOutputJar); - if (proguardOutputMap != null) { - builder.addOutput(proguardOutputMap); - } - ruleContext.registerAction(builder.build(ruleContext)); } @@ -351,29 +341,33 @@ public abstract class ProguardHelper { Iterable<Artifact> libraryJars, Artifact proguardOutputJar, @Nullable Artifact proguardOutputMap) { + Builder builder = new SpawnAction.Builder() - .addInput(programJar) .addInputs(libraryJars) .addInputs(proguardSpecs) .setExecutable(proguard) .setMnemonic("Proguard") .addArgument("-forceprocessing") .addArgument("-injars") - .addArgument(programJar.getExecPathString()) + .addInputArgument(programJar) // This is handled by the build system there is no need for proguard to check if things are // up to date. .addArgument("-outjars") + // Don't register the output jar as an output of the action, because multiple proguard + // actions will be created for optimization runs which will overwrite the jar, and only + // the final proguard action will declare the output jar as an output. .addArgument(proguardOutputJar.getExecPathString()); for (Artifact libraryJar : libraryJars) { - builder.addArgument("-libraryjars") + builder + .addArgument("-libraryjars") .addArgument(libraryJar.getExecPathString()); } if (proguardMapping != null) { - builder.addInput(proguardMapping) + builder .addArgument("-applymapping") - .addArgument(proguardMapping.getExecPathString()); + .addInputArgument(proguardMapping); } for (Artifact proguardSpec : proguardSpecs) { @@ -383,7 +377,7 @@ public abstract class ProguardHelper { if (proguardOutputMap != null) { builder .addArgument("-printmapping") - .addArgument(proguardOutputMap.getExecPathString()); + .addOutputArgument(proguardOutputMap); } return builder; |