aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib
diff options
context:
space:
mode:
authorGravatar Michael Staib <mstaib@google.com>2015-08-28 15:08:02 +0000
committerGravatar Kristina Chodorow <kchodorow@google.com>2015-08-31 19:09:16 +0000
commitdf6a3081cea419c2e974b5f955c43f1d14e6283d (patch)
tree30a22ca8c4a85546d7a3670d91bb4a800ea23117 /src/main/java/com/google/devtools/build/lib
parent601be74a64585172bd487caa267623bf7b00253c (diff)
Fix Jack's proguard specs.
Jack dexing currently only includes proguard specs from the binary itself, not from any dependencies. There's no reason for this, just an accidental inconsistency in the original implementation. -- MOS_MIGRATED_REVID=101776897
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java64
1 files changed, 43 insertions, 21 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 415de2a683..79260c980f 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
@@ -281,7 +281,8 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
}
- public static RuleConfiguredTargetBuilder createAndroidBinary(RuleContext ruleContext,
+ public static RuleConfiguredTargetBuilder createAndroidBinary(
+ RuleContext ruleContext,
NestedSetBuilder<Artifact> filesBuilder,
Artifact deployJar,
JavaCommon javaCommon,
@@ -297,17 +298,24 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
ImmutableList<Artifact> apksUnderTest,
Artifact proguardMapping) {
- ProguardOutput proguardOutput = applyProguard(ruleContext,
- androidCommon,
- deployJar,
- filesBuilder,
- resourceApk,
- ruleContext.getPrerequisiteArtifacts(PROGUARD_SPECS, Mode.TARGET).list(),
- proguardMapping);
+ ImmutableList<Artifact> proguardSpecs =
+ getTransitiveProguardSpecs(
+ ruleContext,
+ resourceApk,
+ ruleContext.getPrerequisiteArtifacts(PROGUARD_SPECS, Mode.TARGET).list());
+
+ ProguardOutput proguardOutput =
+ applyProguard(
+ ruleContext,
+ androidCommon,
+ deployJar,
+ filesBuilder,
+ proguardSpecs,
+ proguardMapping);
Artifact jarToDex = proguardOutput.outputJar;
DexingOutput dexingOutput =
shouldDexWithJack(ruleContext)
- ? dexWithJack(ruleContext, androidCommon)
+ ? dexWithJack(ruleContext, androidCommon, proguardSpecs)
: dex(
ruleContext,
getMultidexMode(ruleContext),
@@ -673,13 +681,35 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
}
}
+ /**
+ * Retrieves the full set of proguard specs that should be applied to this binary.
+ *
+ * <p>If an empty list is passed (i.e., there are no proguardSpecs on this rule), an empty list
+ * will be returned, regardless of any specs from dependencies or the resourceApk.
+ */
+ private static ImmutableList<Artifact> getTransitiveProguardSpecs(
+ RuleContext ruleContext, ResourceApk resourceApk, ImmutableList<Artifact> proguardSpecs) {
+ if (proguardSpecs.isEmpty()) {
+ return proguardSpecs;
+ }
+
+ ImmutableSortedSet.Builder<Artifact> builder =
+ ImmutableSortedSet.<Artifact>orderedBy(Artifact.EXEC_PATH_COMPARATOR).addAll(proguardSpecs);
+ for (ProguardSpecProvider dep :
+ ruleContext.getPrerequisites("deps", Mode.TARGET, ProguardSpecProvider.class)) {
+ builder.addAll(dep.getTransitiveProguardSpecs());
+ }
+ Artifact output = resourceApk.getResourceProguardConfig();
+ builder.add(output);
+ return builder.build().asList();
+ }
+
/** Applies the proguard specifications, and creates a ProguardedJar. */
private static ProguardOutput applyProguard(
RuleContext ruleContext,
AndroidCommon common,
Artifact deployJarArtifact,
NestedSetBuilder<Artifact> filesBuilder,
- ResourceApk resourceApk,
ImmutableList<Artifact> proguardSpecs,
Artifact proguardMapping) {
Artifact proguardOutputJar =
@@ -695,15 +725,6 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
return createEmptyProguardAction(ruleContext, proguardOutputJar, deployJarArtifact);
}
- ImmutableSortedSet.Builder<Artifact> builder =
- ImmutableSortedSet.<Artifact>orderedBy(Artifact.EXEC_PATH_COMPARATOR).addAll(proguardSpecs);
- for (ProguardSpecProvider dep : ruleContext.getPrerequisites("deps", Mode.TARGET,
- ProguardSpecProvider.class)) {
- builder.addAll(dep.getTransitiveProguardSpecs());
- }
- Artifact output = resourceApk.getResourceProguardConfig();
- builder.add(output);
- proguardSpecs = builder.build().asList();
AndroidSdkProvider sdk = AndroidSdkProvider.fromRuleContext(ruleContext);
return createProguardAction(ruleContext, common, sdk.getProguard(), deployJarArtifact,
proguardSpecs, proguardMapping, sdk.getAndroidJar(), proguardOutputJar, filesBuilder);
@@ -801,13 +822,14 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
.isJackUsedForDexing();
}
- static DexingOutput dexWithJack(RuleContext ruleContext, AndroidCommon androidCommon) {
+ static DexingOutput dexWithJack(
+ RuleContext ruleContext, AndroidCommon androidCommon, ImmutableList<Artifact> proguardSpecs) {
Artifact classesDexZip =
androidCommon.compileDexWithJack(
getMultidexMode(ruleContext),
Optional.fromNullable(
ruleContext.getPrerequisiteArtifact("main_dex_list", Mode.TARGET)),
- ruleContext.getPrerequisiteArtifacts(PROGUARD_SPECS, Mode.TARGET).list());
+ proguardSpecs);
return new DexingOutput(classesDexZip, null, ImmutableList.of(classesDexZip));
}