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
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 415de2a..79260c9 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 static RuleConfiguredTargetBuilder createAndroidBinary(RuleContext ruleContext,
+ public static RuleConfiguredTargetBuilder createAndroidBinary(
+ RuleContext ruleContext,
NestedSetBuilder<Artifact> filesBuilder,
Artifact deployJar,
JavaCommon javaCommon,
@@ -297,17 +298,24 @@
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 @@
}
}
+ /**
+ * 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 @@
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 @@
.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));
}