aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java
diff options
context:
space:
mode:
authorGravatar Googler <noreply@google.com>2016-09-19 20:59:57 +0000
committerGravatar Laszlo Csomor <laszlocsomor@google.com>2016-09-20 06:46:34 +0000
commit6e7c3a46ae0fd84369664636407d406368318869 (patch)
treee4cc12dcf80610f079b5e0d3aa9916e02a38041b /src/main/java
parent4e2f75d8e60020f13a7df452488ec4cc7a719f03 (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')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java15
-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.java79
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")