From 10a2eb7fb0e3f45f202649723733aa841aecac43 Mon Sep 17 00:00:00 2001 From: Googler Date: Tue, 3 Nov 2015 16:41:02 +0000 Subject: Add support for proguard's -applymapping option to android_binary. RELNOTES[NEW]: android_binary now supports proguard_apply_mapping to re-use a previously generated proguard mapping. -- MOS_MIGRATED_REVID=106945104 --- .../devtools/build/lib/rules/android/AndroidBinary.java | 12 +++++++++++- .../devtools/build/lib/rules/android/AndroidRuleClasses.java | 7 +++++++ 2 files changed, 18 insertions(+), 1 deletion(-) 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 a287862241..4e716f80b6 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 @@ -138,6 +138,13 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { return null; } + if (ruleContext.attributes().isAttributeValueExplicitlySpecified("proguard_apply_mapping") + && ruleContext.attributes().get(PROGUARD_SPECS, BuildType.LABEL_LIST).isEmpty()) { + ruleContext.attributeError("proguard_apply_mapping", + "'proguard_apply_mapping' can only be used when 'proguard_specs' is also set"); + return null; + } + // 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. @@ -281,6 +288,9 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { Artifact deployJar = createDeployJar(ruleContext, javaSemantics, androidCommon, resourceClasses, ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_BINARY_DEPLOY_JAR)); + Artifact proguardMapping = ruleContext.getPrerequisiteArtifact( + "proguard_apply_mapping", Mode.TARGET); + return createAndroidBinary( ruleContext, @@ -297,7 +307,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { splitResourceApk, resourceClasses, ImmutableList.of(), - null); + proguardMapping); } 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 3daf4fee37..cc047a0826 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 @@ -679,6 +679,13 @@ com/google/common/base/Objects.class */ .add(attr("proguard_generate_mapping", BOOLEAN).value(false) .nonconfigurable("value is referenced in an ImplicitOutputsFunction")) + /* + File to be used as a mapping for proguard. + ${SYNOPSIS} + A mapping file generated by proguard_generate_mapping to be + re-used to apply the same mapping to a new build. + */ + .add(attr("proguard_apply_mapping", LABEL).legacyAllowAnyFileType()) /* Enables legacy native support, where pre-compiled native libraries are copied directly into the APK. -- cgit v1.2.3