aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build
diff options
context:
space:
mode:
authorGravatar Googler <noreply@google.com>2017-09-12 01:08:36 +0200
committerGravatar Philipp Wollermann <philwo@google.com>2017-09-12 14:07:16 +0200
commit0fc750b71a9e52bc599261f13bad11daaacdd3ec (patch)
tree34821d5f6213c80560a2bb2bdfc67d681aa1ff14 /src/main/java/com/google/devtools/build
parentdf8d70f694e1ed3f02004064a9de18ef4b82804c (diff)
Adds getProguardSpecsForManifest to AndroidSematics to inject proguard specs.
RELNOTES: None. PiperOrigin-RevId: 168300744
Diffstat (limited to 'src/main/java/com/google/devtools/build')
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidSemantics.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java14
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java24
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidSemantics.java3
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