aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules/android
diff options
context:
space:
mode:
authorGravatar Googler <noreply@google.com>2017-11-21 10:48:16 -0800
committerGravatar Copybara-Service <copybara-piper@google.com>2017-11-21 10:50:20 -0800
commit59d2ece50d7998e355afff8fd7cabd4215fc070d (patch)
tree4fb6faa733c951e4a5ad83b11e239feaec52950f /src/main/java/com/google/devtools/build/lib/rules/android
parent1c2d2bd3b1c3b5d9929b6cac90c3b73fceca41ef (diff)
Add option to enable resource cycle shrinking.
This will instruct AAPT2 to produce conditional keep rules to allow for more aggressive code and resource shrinking. RELNOTES[NEW]: Add --experimental_android_resource_cycle_shrinking option to allow for more aggressive code and resource shrinking. PiperOrigin-RevId: 176530749
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/android')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java17
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java18
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesProcessorBuilder.java10
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java7
4 files changed, 50 insertions, 2 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 1bfcac40af..4d389e94d8 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
@@ -217,6 +217,8 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
configurationMap,
cppSemantics);
+ boolean shrinkResources = shouldShrinkResources(ruleContext);
+
// TODO(bazel-team): Resolve all the different cases of resource handling so this conditional
// can go away: recompile from android_resources, and recompile from android_binary attributes.
ApplicationManifest applicationManifest;
@@ -250,6 +252,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
ruleContext.attributes().get("crunch_png", Type.BOOLEAN),
ProguardHelper.getProguardConfigArtifact(ruleContext, ""),
createMainDexProguardSpec(ruleContext),
+ shouldShrinkResourceCycles(ruleContext, shrinkResources),
ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_PROCESSED_MANIFEST),
ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_RESOURCES_ZIP),
DataBinding.isEnabled(ruleContext)
@@ -294,8 +297,6 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
}
- boolean shrinkResources = shouldShrinkResources(ruleContext);
-
// Remove the library resource JARs from the binary's runtime classpath.
// Resource classes from android_library dependencies are replaced by the binary's resource
// class. We remove them only at the top level so that resources included by a library that is
@@ -785,6 +786,18 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
return (state == TriState.YES);
}
+ /** Returns {@code true} if resource shrinking should be performed. */
+ private static boolean shouldShrinkResourceCycles(
+ RuleContext ruleContext, boolean shrinkResources) throws RuleErrorException {
+ boolean global =
+ ruleContext.getFragment(AndroidConfiguration.class).useAndroidResourceCycleShrinking();
+ if (global && !shrinkResources) {
+ throw ruleContext.throwWithRuleError(
+ "resource cycle shrinking can only be enabled when resource shrinking is enabled");
+ }
+ return global;
+ }
+
private static ResourceApk shrinkResources(
RuleContext ruleContext,
ResourceApk resourceApk,
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 41d9f50e02..6b48275d3f 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
@@ -524,6 +524,18 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment {
public boolean useAndroidResourceShrinking;
@Option(
+ name = "experimental_android_resource_cycle_shrinking",
+ defaultValue = "false",
+ category = "semantics",
+ documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
+ effectTags = {OptionEffectTag.UNKNOWN},
+ help =
+ "Enables more shrinking of code and resources by instructing AAPT2 "
+ + "to emit conditional Proguard keep rules."
+ )
+ public boolean useAndroidResourceCycleShrinking;
+
+ @Option(
name = "android_manifest_merger",
defaultValue = "android",
category = "semantics",
@@ -727,6 +739,7 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment {
private final boolean useRexToCompressDexFiles;
private final boolean allowAndroidLibraryDepsWithoutSrcs;
private final boolean useAndroidResourceShrinking;
+ private final boolean useAndroidResourceCycleShrinking;
private final AndroidManifestMerger manifestMerger;
private final ApkSigningMethod apkSigningMethod;
private final boolean useSingleJarApkBuilder;
@@ -763,6 +776,7 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment {
this.allowAndroidLibraryDepsWithoutSrcs = options.allowAndroidLibraryDepsWithoutSrcs;
this.useAndroidResourceShrinking = options.useAndroidResourceShrinking
|| options.useExperimentalAndroidResourceShrinking;
+ this.useAndroidResourceCycleShrinking = options.useAndroidResourceCycleShrinking;
this.manifestMerger = options.manifestMerger;
this.apkSigningMethod = options.apkSigningMethod;
this.useSingleJarApkBuilder = options.useSingleJarApkBuilder;
@@ -884,6 +898,10 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment {
return useAndroidResourceShrinking;
}
+ public boolean useAndroidResourceCycleShrinking() {
+ return useAndroidResourceCycleShrinking;
+ }
+
public AndroidAaptVersion getAndroidAaptVersion() {
return androidAaptVersion;
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesProcessorBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesProcessorBuilder.java
index 0adb8b52cd..368fee5d40 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesProcessorBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesProcessorBuilder.java
@@ -77,6 +77,7 @@ public class AndroidResourcesProcessorBuilder {
private ResourceDependencies dependencies;
private Artifact proguardOut;
private Artifact mainDexProguardOut;
+ private boolean conditionalKeepRules;
private Artifact rTxtOut;
private Artifact sourceJarOut;
private boolean debug = false;
@@ -165,6 +166,11 @@ public class AndroidResourcesProcessorBuilder {
return this;
}
+ public AndroidResourcesProcessorBuilder conditionalKeepRules(boolean conditionalKeepRules) {
+ this.conditionalKeepRules = conditionalKeepRules;
+ return this;
+ }
+
public AndroidResourcesProcessorBuilder setMainDexProguardOut(Artifact mainDexProguardCfg) {
this.mainDexProguardOut = mainDexProguardCfg;
return this;
@@ -301,6 +307,10 @@ public class AndroidResourcesProcessorBuilder {
builder.add("--useCompiledResourcesForMerge");
}
+ if (conditionalKeepRules) {
+ builder.add("--conditionalKeepRules");
+ }
+
configureCommonFlags(outs, inputs, builder);
ParamFileInfo.Builder paramFileInfo = ParamFileInfo.builder(ParameterFileType.SHELL_QUOTED);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java b/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java
index e378f54fba..70ef13b9aa 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java
@@ -585,6 +585,7 @@ public final class ApplicationManifest {
boolean crunchPng,
Artifact proguardCfg,
@Nullable Artifact mainDexProguardCfg,
+ boolean conditionalKeepRules,
Artifact manifestOut,
Artifact mergedResources,
@Nullable Artifact dataBindingInfoZip,
@@ -623,6 +624,11 @@ public final class ApplicationManifest {
boolean skipParsingAction =
targetAaptVersion == AndroidAaptVersion.AAPT2 && androidConfiguration.skipParsingAction();
+ if (conditionalKeepRules && targetAaptVersion != AndroidAaptVersion.AAPT2) {
+ throw ruleContext.throwWithRuleError(
+ "resource cycle shrinking can only be enabled for builds with aapt2");
+ }
+
ResourceContainer processed =
new AndroidResourcesProcessorBuilder(ruleContext)
.setLibrary(false)
@@ -638,6 +644,7 @@ public final class ApplicationManifest {
.withDependencies(resourceDeps)
.setProguardOut(proguardCfg)
.setMainDexProguardOut(mainDexProguardCfg)
+ .conditionalKeepRules(conditionalKeepRules)
.setDataBindingInfoZip(dataBindingInfoZip)
.setApplicationId(manifestValues.get("applicationId"))
.setVersionCode(manifestValues.get("versionCode"))