diff options
author | 2016-09-19 20:59:57 +0000 | |
---|---|---|
committer | 2016-09-20 06:46:34 +0000 | |
commit | 6e7c3a46ae0fd84369664636407d406368318869 (patch) | |
tree | e4cc12dcf80610f079b5e0d3aa9916e02a38041b /src/main/java | |
parent | 4e2f75d8e60020f13a7df452488ec4cc7a719f03 (diff) |
This change adds two implicit outputs to the AndroidBinary rule that are produced by ProGuard:
- The list of dead code in the input class files (-printusage).
- The list of classes and class members matched by the various '-keep' options (-printseeds).
--
MOS_MIGRATED_REVID=133628437
Diffstat (limited to 'src/main/java')
3 files changed, 89 insertions, 9 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 ed545f87f1..a30885b296 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 @@ -935,11 +935,17 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { .add(sdk.getAndroidJar()) .addTransitive(common.getTransitiveNeverLinkLibraries()) .build(); + Artifact proguardSeeds = + ruleContext.getImplicitOutputArtifact(JavaSemantics.JAVA_BINARY_PROGUARD_SEEDS); + Artifact proguardUsage = + ruleContext.getImplicitOutputArtifact(JavaSemantics.JAVA_BINARY_PROGUARD_USAGE); ProguardOutput result = ProguardHelper.createProguardAction( ruleContext, sdk.getProguard(), deployJarArtifact, proguardSpecs, + proguardSeeds, + proguardUsage, proguardMapping, libraryJars, proguardOutputJar, @@ -964,7 +970,12 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { throws InterruptedException { NestedSetBuilder<Artifact> failures = NestedSetBuilder.<Artifact>stableOrder(); ProguardOutput outputs = - ProguardHelper.getProguardOutputs(proguardOutputJar, ruleContext, semantics); + ProguardHelper.getProguardOutputs( + proguardOutputJar, + /* proguardSeeds */ (Artifact) null, + /* proguardUsage */ (Artifact) null, + ruleContext, + semantics); outputs.addAllToSet(failures); JavaOptimizationMode optMode = getJavaOptimizationMode(ruleContext); ruleContext.registerAction( @@ -975,7 +986,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { optMode == JavaOptimizationMode.LEGACY ? "without proguard_specs" : "in optimization mode " + optMode))); - return new ProguardOutput(deployJarArtifact, null, null, null); + return new ProguardOutput(deployJarArtifact, null, null, null, null, null); } private static ResourceApk shrinkResources( diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java index c475c55498..8f3be1af11 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java @@ -71,6 +71,10 @@ public interface JavaSemantics { fromTemplates("%{name}_proguard.map"); SafeImplicitOutputsFunction JAVA_BINARY_PROGUARD_PROTO_MAP = fromTemplates("%{name}_proguard.pbmap"); + SafeImplicitOutputsFunction JAVA_BINARY_PROGUARD_SEEDS = + fromTemplates("%{name}_proguard.seeds"); + SafeImplicitOutputsFunction JAVA_BINARY_PROGUARD_USAGE = + fromTemplates("%{name}_proguard.usage"); SafeImplicitOutputsFunction JAVA_BINARY_PROGUARD_CONFIG = fromTemplates("%{name}_proguard.config"); 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 e4daee2693..22e7cfde8d 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 @@ -32,7 +32,6 @@ import com.google.devtools.build.lib.packages.AttributeMap; import com.google.devtools.build.lib.packages.BuildType; import com.google.devtools.build.lib.rules.java.JavaConfiguration.JavaOptimizationMode; import com.google.devtools.build.lib.syntax.Type; - import javax.annotation.Nullable; /** @@ -53,15 +52,21 @@ public abstract class ProguardHelper { private final Artifact outputJar; @Nullable private final Artifact mapping; @Nullable private final Artifact protoMapping; + @Nullable private final Artifact seeds; + @Nullable private final Artifact usage; private final Artifact config; public ProguardOutput(Artifact outputJar, @Nullable Artifact mapping, @Nullable Artifact protoMapping, + @Nullable Artifact seeds, + @Nullable Artifact usage, Artifact config) { this.outputJar = checkNotNull(outputJar); this.mapping = mapping; this.protoMapping = protoMapping; + this.seeds = seeds; + this.usage = usage; this.config = config; } @@ -79,6 +84,16 @@ public abstract class ProguardHelper { return protoMapping; } + @Nullable + public Artifact getSeeds() { + return seeds; + } + + @Nullable + public Artifact getUsage() { + return usage; + } + public Artifact getConfig() { return config; } @@ -92,6 +107,12 @@ public abstract class ProguardHelper { if (protoMapping != null) { filesBuilder.add(protoMapping); } + if (seeds != null) { + filesBuilder.add(seeds); + } + if (usage != null) { + filesBuilder.add(usage); + } if (config != null) { filesBuilder.add(config); } @@ -135,8 +156,18 @@ public abstract class ProguardHelper { collectProguardSpecs(ruleContext, bootclasspath, mainClassName); Artifact singleJar = ruleContext.getImplicitOutputArtifact(JavaSemantics.JAVA_BINARY_MERGED_JAR); - return createProguardAction(ruleContext, proguard, singleJar, proguardSpecs, (Artifact) null, - bootclasspath, deployJar, semantics, /* optimizationPases */ 3); + return createProguardAction( + ruleContext, + proguard, + singleJar, + proguardSpecs, + /* proguardSeeds */ (Artifact) null, + /* proguardUsage */ (Artifact) null, + /* proguardMapping */ (Artifact) null, + bootclasspath, + deployJar, + semantics, + /* optimizationPases */ 3); } private ImmutableList<Artifact> collectProguardSpecs( @@ -249,7 +280,11 @@ public abstract class ProguardHelper { } public static ProguardOutput getProguardOutputs( - Artifact outputJar, RuleContext ruleContext, JavaSemantics semantics) + Artifact outputJar, + @Nullable Artifact proguardSeeds, + @Nullable Artifact proguardUsage, + RuleContext ruleContext, + JavaSemantics semantics) throws InterruptedException { JavaOptimizationMode optMode = getJavaOptimizationMode(ruleContext); boolean mappingRequested = genProguardMapping(ruleContext.attributes()); @@ -268,7 +303,12 @@ public abstract class ProguardHelper { ruleContext.getImplicitOutputArtifact(JavaSemantics.JAVA_BINARY_PROGUARD_CONFIG); return new ProguardOutput( - outputJar, proguardOutputMap, proguardOutputProtoMap, proguardConfigOutput); + outputJar, + proguardOutputMap, + proguardOutputProtoMap, + proguardSeeds, + proguardUsage, + proguardConfigOutput); } /** @@ -293,6 +333,8 @@ public abstract class ProguardHelper { FilesToRunProvider proguard, Artifact programJar, ImmutableList<Artifact> proguardSpecs, + @Nullable Artifact proguardSeeds, + @Nullable Artifact proguardUsage, @Nullable Artifact proguardMapping, Iterable<Artifact> libraryJars, Artifact proguardOutputJar, @@ -302,8 +344,9 @@ public abstract class ProguardHelper { Preconditions.checkArgument(optMode != JavaOptimizationMode.NOOP); Preconditions.checkArgument(optMode != JavaOptimizationMode.LEGACY || !proguardSpecs.isEmpty()); - ProguardOutput output = getProguardOutputs(proguardOutputJar, ruleContext, semantics); - + ProguardOutput output = + getProguardOutputs(proguardOutputJar, proguardSeeds, proguardUsage, ruleContext, semantics); + if (optimizationPasses == null) { // Run proguard as a single step. Builder builder = makeBuilder( @@ -315,6 +358,8 @@ public abstract class ProguardHelper { output.getOutputJar(), output.getMapping(), output.getProtoMapping(), + output.getSeeds(), + output.getUsage(), output.getConfig()) .setProgressMessage("Trimming binary with Proguard") .addOutput(proguardOutputJar); @@ -334,6 +379,8 @@ public abstract class ProguardHelper { output.getOutputJar(), /* proguardOutputMap */ null, /* proguardOutputProtoMap */ null, + /* proguardSeeds */ null, + /* proguardUsage */ null, /* proguardConfigOutput */ null) .setProgressMessage("Trimming binary with Proguard: Verification/Shrinking Pass") .addArgument("-runtype INITIAL") @@ -354,6 +401,8 @@ public abstract class ProguardHelper { output.getOutputJar(), /* proguardOutputMap */ null, /* proguardOutputProtoMap */ null, + /* proguardSeeds */ null, + /* proguardUsage */ null, /* proguardConfigOutput */ null) .setProgressMessage("Trimming binary with Proguard: Optimization Pass " + (i + 1)) .addArgument("-runtype OPTIMIZATION") @@ -374,6 +423,8 @@ public abstract class ProguardHelper { output.getOutputJar(), output.getMapping(), output.getProtoMapping(), + output.getSeeds(), + output.getUsage(), output.getConfig()) .setProgressMessage("Trimming binary with Proguard: Obfuscation and Final Ouput Pass") .addArgument("-runtype FINAL") @@ -396,6 +447,8 @@ public abstract class ProguardHelper { Artifact proguardOutputJar, @Nullable Artifact proguardOutputMap, @Nullable Artifact proguardOutputProtoMap, + @Nullable Artifact proguardSeeds, + @Nullable Artifact proguardUsage, @Nullable Artifact proguardConfigOutput) { Builder builder = new SpawnAction.Builder() @@ -442,6 +495,18 @@ public abstract class ProguardHelper { .addOutputArgument(proguardOutputProtoMap); } + if (proguardSeeds != null) { + builder + .addArgument("-printseeds") + .addOutputArgument(proguardSeeds); + } + + if (proguardUsage != null) { + builder + .addArgument("-printusage") + .addOutputArgument(proguardUsage); + } + if (proguardConfigOutput != null) { builder .addArgument("-printconfiguration") |