diff options
author | 2015-08-28 15:08:02 +0000 | |
---|---|---|
committer | 2015-08-31 19:09:16 +0000 | |
commit | df6a3081cea419c2e974b5f955c43f1d14e6283d (patch) | |
tree | 30a22ca8c4a85546d7a3670d91bb4a800ea23117 /src/main/java/com/google/devtools/build/lib | |
parent | 601be74a64585172bd487caa267623bf7b00253c (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.java | 64 |
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)); } |