aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools
diff options
context:
space:
mode:
authorGravatar Googler <noreply@google.com>2016-11-01 22:09:27 +0000
committerGravatar Laszlo Csomor <laszlocsomor@google.com>2016-11-02 08:29:58 +0000
commit9ab28cbb989306be774bb73b083961b18d4de07d (patch)
tree6d125bca4b5e5bd843be1a8321aa07efdea82f89 /src/main/java/com/google/devtools
parent0c6e4cdab3c38f8751fb3b944ccaa53866e4c032 (diff)
Add support for Rex package map
-- MOS_MIGRATED_REVID=137877037
Diffstat (limited to 'src/main/java/com/google/devtools')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java25
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java8
2 files changed, 32 insertions, 1 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 af68930c66..9a40b22f97 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
@@ -151,6 +151,21 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
"'proguard_apply_mapping' can only be used when 'proguard_specs' is also set");
}
+ if (ruleContext.attributes().isAttributeValueExplicitlySpecified("rex_package_map")
+ && !ruleContext.attributes().get("rewrite_dexes_with_rex", Type.BOOLEAN)) {
+ ruleContext.throwWithAttributeError(
+ "rex_package_map",
+ "'rex_package_map' can only be used when 'rewrite_dexes_with_rex' is also set");
+ }
+
+ if (ruleContext.attributes().isAttributeValueExplicitlySpecified("rex_package_map")
+ && ruleContext.attributes()
+ .get(ProguardHelper.PROGUARD_SPECS, BuildType.LABEL_LIST)
+ .isEmpty()) {
+ ruleContext.throwWithAttributeError("rex_package_map",
+ "'rex_package_map' can only be used when 'proguard_specs' is also set");
+ }
+
// TODO(bazel-team): Find a way to simplify this code.
// treeKeys() means that the resulting map sorts the entries by key, which is necessary to
// ensure determinism.
@@ -462,11 +477,19 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
.addOutputArgument(finalDexes);
if (proguardOutput.getMapping() != null) {
finalProguardMap = getDxArtifact(ruleContext, "rexed_proguard.map");
+ Artifact finalRexPackageMap = getDxArtifact(ruleContext, "rex_output_package.map");
rexActionBuilder
.addArgument("--proguard_input_map")
.addInputArgument(proguardOutput.getMapping())
.addArgument("--proguard_output_map")
- .addOutputArgument(finalProguardMap);
+ .addOutputArgument(finalProguardMap)
+ .addArgument("--rex_output_package_map")
+ .addOutputArgument(finalRexPackageMap);
+ if (ruleContext.attributes().isAttributeValueExplicitlySpecified("rex_package_map")) {
+ Artifact rexPackageMap =
+ ruleContext.getPrerequisiteArtifact("rex_package_map", Mode.TARGET);
+ rexActionBuilder.addArgument("--rex_input_package_map").addInputArgument(rexPackageMap);
+ }
} else {
finalProguardMap = proguardOutput.getMapping();
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java
index 0efb3dc191..e1156fa866 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java
@@ -783,6 +783,14 @@ public final class AndroidRuleClasses {
.undocumented("No-op, soon to be removed"))
.add(attr(":extra_proguard_specs", LABEL_LIST).value(JavaSemantics.EXTRA_PROGUARD_SPECS))
.add(attr("rewrite_dexes_with_rex", BOOLEAN).value(false).undocumented("experimental"))
+ /*
+ File to be used as a package map for Rex tool that keeps the assignment of classes to
+ dex files of a multi-dex application stable over time.
+ Can only be used when <code>proguard_specs</code> is also specified. When
+ <code>proguard_specs</code> is specified, but a package map isn't or there were changes,
+ Rex suggests an updated package map that can be saved and reused for subsequent builds.
+ */
+ .add(attr("rex_package_map", LABEL).legacyAllowAnyFileType().undocumented("experimental"))
.advertiseProvider(JavaCompilationArgsProvider.class)
.build();
}