aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules
diff options
context:
space:
mode:
authorGravatar Googler <noreply@google.com>2016-08-26 17:21:40 +0000
committerGravatar John Cater <jcater@google.com>2016-08-26 18:43:21 +0000
commit8dc4257b9493bd2251636de1271a1972c17919ef (patch)
tree1fe2b7bba4e809da203fc03efcdd69a873a0a02b /src/main/java/com/google/devtools/build/lib/rules
parent19eec72f080b18acf1e184d65388c263bc268d10 (diff)
Add 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=131414162
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/ProguardHelper.java60
3 files changed, 62 insertions, 4 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 daf7d5b086..ae6b9ad159 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
@@ -960,7 +960,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 c2f5e7c69b..edbea1c954 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
@@ -70,6 +70,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..565da35671 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);
}
@@ -264,11 +285,22 @@ public abstract class ProguardHelper {
proguardOutputProtoMap = semantics.getProtoMapping(ruleContext);
}
+ Artifact proguardOutputSeeds =
+ ruleContext.getImplicitOutputArtifact(JavaSemantics.JAVA_BINARY_PROGUARD_SEEDS);
+
+ Artifact proguardOutputUsage =
+ ruleContext.getImplicitOutputArtifact(JavaSemantics.JAVA_BINARY_PROGUARD_USAGE);
+
Artifact proguardConfigOutput =
ruleContext.getImplicitOutputArtifact(JavaSemantics.JAVA_BINARY_PROGUARD_CONFIG);
return new ProguardOutput(
- outputJar, proguardOutputMap, proguardOutputProtoMap, proguardConfigOutput);
+ outputJar,
+ proguardOutputMap,
+ proguardOutputProtoMap,
+ proguardOutputSeeds,
+ proguardOutputUsage,
+ proguardConfigOutput);
}
/**
@@ -303,7 +335,7 @@ public abstract class ProguardHelper {
Preconditions.checkArgument(optMode != JavaOptimizationMode.LEGACY || !proguardSpecs.isEmpty());
ProguardOutput output = getProguardOutputs(proguardOutputJar, ruleContext, semantics);
-
+
if (optimizationPasses == null) {
// Run proguard as a single step.
Builder builder = makeBuilder(
@@ -315,6 +347,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 +368,8 @@ public abstract class ProguardHelper {
output.getOutputJar(),
/* proguardOutputMap */ null,
/* proguardOutputProtoMap */ null,
+ /* proguardOutputSeeds */ null,
+ /* proguardOutputUsage */ null,
/* proguardConfigOutput */ null)
.setProgressMessage("Trimming binary with Proguard: Verification/Shrinking Pass")
.addArgument("-runtype INITIAL")
@@ -354,6 +390,8 @@ public abstract class ProguardHelper {
output.getOutputJar(),
/* proguardOutputMap */ null,
/* proguardOutputProtoMap */ null,
+ /* proguardOutputSeeds */ null,
+ /* proguardOutputUsage */ null,
/* proguardConfigOutput */ null)
.setProgressMessage("Trimming binary with Proguard: Optimization Pass " + (i + 1))
.addArgument("-runtype OPTIMIZATION")
@@ -374,6 +412,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 +436,8 @@ public abstract class ProguardHelper {
Artifact proguardOutputJar,
@Nullable Artifact proguardOutputMap,
@Nullable Artifact proguardOutputProtoMap,
+ @Nullable Artifact proguardOutputSeeds,
+ @Nullable Artifact proguardOutputUsage,
@Nullable Artifact proguardConfigOutput) {
Builder builder = new SpawnAction.Builder()
@@ -442,6 +484,18 @@ public abstract class ProguardHelper {
.addOutputArgument(proguardOutputProtoMap);
}
+ if (proguardOutputSeeds != null) {
+ builder
+ .addArgument("-printseeds")
+ .addOutputArgument(proguardOutputSeeds);
+ }
+
+ if (proguardOutputUsage != null) {
+ builder
+ .addArgument("-printusage")
+ .addOutputArgument(proguardOutputUsage);
+ }
+
if (proguardConfigOutput != null) {
builder
.addArgument("-printconfiguration")