aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java23
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/ProguardHelper.java42
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;