diff options
author | Googler <noreply@google.com> | 2017-09-12 01:08:36 +0200 |
---|---|---|
committer | Philipp Wollermann <philwo@google.com> | 2017-09-12 14:07:16 +0200 |
commit | 0fc750b71a9e52bc599261f13bad11daaacdd3ec (patch) | |
tree | 34821d5f6213c80560a2bb2bdfc67d681aa1ff14 /src/main/java/com | |
parent | df8d70f694e1ed3f02004064a9de18ef4b82804c (diff) |
Adds getProguardSpecsForManifest to AndroidSematics to inject proguard specs.
RELNOTES: None.
PiperOrigin-RevId: 168300744
Diffstat (limited to 'src/main/java/com')
4 files changed, 47 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidSemantics.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidSemantics.java index a73ddde836..4331b39a55 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidSemantics.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidSemantics.java @@ -85,6 +85,12 @@ public class BazelAndroidSemantics implements AndroidSemantics { } @Override + public ImmutableList<Artifact> getProguardSpecsForManifest( + RuleContext ruleContext, Artifact manifest) { + return ImmutableList.of(); + } + + @Override public void addCoverageSupport(RuleContext ruleContext, AndroidCommon common, JavaSemantics javaSemantics, boolean forAndroidTest, Builder attributes, JavaCompilationArtifacts.Builder artifactsBuilder) { 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 550597a7a1..bcf734040b 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 @@ -418,6 +418,20 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { ImmutableList<Artifact> proguardSpecs = ProguardHelper.collectTransitiveProguardSpecs( ruleContext, ImmutableList.of(resourceApk.getResourceProguardConfig())); + boolean assumeMinSdkVersion = + ruleContext.getFragment(AndroidConfiguration.class).assumeMinSdkVersion(); + if (!proguardSpecs.isEmpty() && assumeMinSdkVersion) { + // NB: Order here is important. We're including generated Proguard specs before the user's + // specs so that they can override values. + proguardSpecs = + ImmutableList.<Artifact>builder() + .addAll( + androidSemantics.getProguardSpecsForManifest( + ruleContext, applicationManifest.getManifest())) + .addAll(proguardSpecs) + .build(); + } + boolean rexEnabled = ruleContext.getFragment(AndroidConfiguration.class).useRexToCompressDexFiles() || (ruleContext.attributes().get("rewrite_dexes_with_rex", Type.BOOLEAN)); diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java index 9b8ef3b677..0d8b70d105 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java @@ -454,6 +454,19 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment { ) public boolean incrementalDexingErrorOnMissedJars; + // TODO(b/31711689): Remove this flag when this optimization is proven to work globally. + @Option( + name = "experimental_android_assume_minsdkversion", + defaultValue = "false", + metadataTags = {OptionMetadataTag.EXPERIMENTAL}, + documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, + effectTags = {OptionEffectTag.UNKNOWN}, + help = + "When enabled, the minSdkVersion is parsed from the merged AndroidManifest and used to " + + "instruct Proguard on valid Android build versions." + ) + public boolean assumeMinSdkVersion; + @Option( name = "experimental_android_use_parallel_dex2oat", category = "experimental", @@ -742,6 +755,7 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment { host.incrementalDexingBinaries = incrementalDexingBinaries; host.incrementalDexingForLiteProtos = incrementalDexingForLiteProtos; host.incrementalDexingErrorOnMissedJars = incrementalDexingErrorOnMissedJars; + host.assumeMinSdkVersion = assumeMinSdkVersion; host.nonIncrementalPerTargetDexopts = nonIncrementalPerTargetDexopts; host.dexoptsSupportedInIncrementalDexing = dexoptsSupportedInIncrementalDexing; host.dexoptsSupportedInDexMerger = dexoptsSupportedInDexMerger; @@ -785,6 +799,7 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment { private final ImmutableSet<AndroidBinaryType> incrementalDexingBinaries; private final boolean incrementalDexingForLiteProtos; private final boolean incrementalDexingErrorOnMissedJars; + private final boolean assumeMinSdkVersion; private final ImmutableList<String> dexoptsSupportedInIncrementalDexing; private final ImmutableList<String> targetDexoptsThatPreventIncrementalDexing; private final ImmutableList<String> dexoptsSupportedInDexMerger; @@ -821,6 +836,7 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment { } this.incrementalDexingForLiteProtos = options.incrementalDexingForLiteProtos; this.incrementalDexingErrorOnMissedJars = options.incrementalDexingErrorOnMissedJars; + this.assumeMinSdkVersion = options.assumeMinSdkVersion; this.dexoptsSupportedInIncrementalDexing = ImmutableList.copyOf(options.dexoptsSupportedInIncrementalDexing); this.targetDexoptsThatPreventIncrementalDexing = @@ -890,6 +906,14 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment { } /** + * Returns true if an -assumevalues should be generated for Proguard based on the minSdkVersion + * of the merged AndroidManifest. + */ + public boolean assumeMinSdkVersion() { + return assumeMinSdkVersion; + } + + /** * dx flags supported in incremental dexing actions. */ public ImmutableList<String> getDexoptsSupportedInIncrementalDexing() { diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSemantics.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSemantics.java index f7637a7e3f..14d892460a 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSemantics.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSemantics.java @@ -89,6 +89,9 @@ public interface AndroidSemantics { */ Artifact getApkDebugSigningKey(RuleContext ruleContext); + /** Given an Android {@code manifest}, returns a list of relevant Proguard specs. */ + ImmutableList<Artifact> getProguardSpecsForManifest(RuleContext ruleContext, Artifact manifest); + /** * Add coverage instrumentation to the Java compilation of an Android binary. * @throws InterruptedException |