aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com
diff options
context:
space:
mode:
authorGravatar corysmith <corysmith@google.com>2017-11-22 14:18:50 -0800
committerGravatar Copybara-Service <copybara-piper@google.com>2017-11-22 14:20:29 -0800
commitaaad7e42e325a1cc84a43b797030b5964cb93ef5 (patch)
tree70de4c1c825577a5f1c49cc49fa76c2a3f8dd36a /src/main/java/com
parent6c91871f49e966128f18e2986449b4c19939c14e (diff)
Enable aapt2 for robolectric when available.
RELNOTES: None PiperOrigin-RevId: 176700595
Diffstat (limited to 'src/main/java/com')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java149
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java95
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/RobolectricResourceSymbolsActionBuilder.java32
3 files changed, 150 insertions, 126 deletions
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 e4b8c4d845..3455b43bf4 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
@@ -59,7 +59,8 @@ import javax.annotation.Nullable;
public class AndroidConfiguration extends BuildConfiguration.Fragment {
/**
- * Converter for {@link com.google.devtools.build.lib.rules.android.AndroidConfiguration.ConfigurationDistinguisher}
+ * Converter for {@link
+ * com.google.devtools.build.lib.rules.android.AndroidConfiguration.ConfigurationDistinguisher}
*/
public static final class ConfigurationDistinguisherConverter
extends EnumConverter<ConfigurationDistinguisher> {
@@ -68,18 +69,14 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment {
}
}
- /**
- * Converter for {@link ApkSigningMethod}.
- */
+ /** Converter for {@link ApkSigningMethod}. */
public static final class ApkSigningMethodConverter extends EnumConverter<ApkSigningMethod> {
public ApkSigningMethodConverter() {
super(ApkSigningMethod.class, "apk signing method");
}
}
- /**
- * Converter for {@link AndroidManifestMerger}
- */
+ /** Converter for {@link AndroidManifestMerger} */
public static final class AndroidManifestMergerConverter
extends EnumConverter<AndroidManifestMerger> {
public AndroidManifestMergerConverter() {
@@ -101,9 +98,9 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment {
* influences the output directory name: if it didn't, an Android and a non-Android configuration
* would conflict if they had the same toolchain identifier.
*
- * <p>Note that this is not just a theoretical concern: even if {@code --crosstool_top} and
- * {@code --android_crosstool_top} point to different labels, they may end up being redirected to
- * the same thing, and this is exactly what happens on OSX X.
+ * <p>Note that this is not just a theoretical concern: even if {@code --crosstool_top} and {@code
+ * --android_crosstool_top} point to different labels, they may end up being redirected to the
+ * same thing, and this is exactly what happens on OSX X.
*/
public enum ConfigurationDistinguisher {
MAIN(null),
@@ -120,9 +117,9 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment {
* Which APK signing method to use with the debug key for rules that build APKs.
*
* <ul>
- * <li>V1 uses the apksigner attribute from the android_sdk and signs the APK as a JAR.
- * <li>V2 uses the apksigner attribute from the android_sdk and signs the APK according to the APK
- * Signing Schema V2 that is only supported on Android N and later.
+ * <li>V1 uses the apksigner attribute from the android_sdk and signs the APK as a JAR.
+ * <li>V2 uses the apksigner attribute from the android_sdk and signs the APK according to the
+ * APK Signing Schema V2 that is only supported on Android N and later.
* </ul>
*/
public enum ApkSigningMethod {
@@ -155,8 +152,8 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment {
ANDROID;
public static List<String> getAttributeValues() {
- return ImmutableList.of(LEGACY.name().toLowerCase(), ANDROID.name().toLowerCase(),
- getRuleAttributeDefault());
+ return ImmutableList.of(
+ LEGACY.name().toLowerCase(), ANDROID.name().toLowerCase(), getRuleAttributeDefault());
}
public static String getRuleAttributeDefault() {
@@ -376,8 +373,9 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment {
defaultValue = "0",
documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
effectTags = {OptionEffectTag.LOADING_AND_ANALYSIS, OptionEffectTag.LOSES_INCREMENTAL_STATE},
- help = "Whether to use incremental dexing tools when building proguarded Android binaries. "
- + "Values > 0 turn the feature on, values > 1 run that many dexbuilder shards."
+ help =
+ "Whether to use incremental dexing tools when building proguarded Android binaries. "
+ + "Values > 0 turn the feature on, values > 1 run that many dexbuilder shards."
)
public int incrementalDexingShardsAfterProguard;
@@ -621,41 +619,64 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment {
public boolean exportsManifestDefault;
@Option(
- name = "experimental_android_throw_on_resource_conflict",
- defaultValue = "false",
- documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
- effectTags = {OptionEffectTag.UNKNOWN},
- help = "If passed, resource merge conflicts will be treated as errors instead of warnings"
+ name = "experimental_android_aapt2_robolectric",
+ defaultValue = "false",
+ documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
+ effectTags = {OptionEffectTag.UNKNOWN},
+ help = "If true, robolectric resources will be packaged using aapt2 if available."
+ )
+ public boolean useAapt2ForRobolectric;
+
+ @Option(
+ name = "experimental_android_throw_on_resource_conflict",
+ defaultValue = "false",
+ documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
+ effectTags = {OptionEffectTag.UNKNOWN},
+ help = "If passed, resource merge conflicts will be treated as errors instead of warnings"
)
public boolean throwOnResourceConflict;
@Option(
- name = "experimental_android_allow_android_resources",
- defaultValue = "false",
- documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
- effectTags = {OptionEffectTag.LOADING_AND_ANALYSIS},
- help = "For use in testing before migrating away from android_resources. If false, will"
- + " fail when non-whitelisted android_resources rules are encountered."
+ name = "experimental_use_manifest_from_resource_apk",
+ defaultValue = "true",
+ documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
+ effectTags = {OptionEffectTag.UNKNOWN},
+ help =
+ "Android library rule will use the AppManifest from the resource APK"
+ + " in the AAR file."
+ )
+ public boolean useManifestFromResourceApk;
+
+ @Option(
+ name = "experimental_android_allow_android_resources",
+ defaultValue = "false",
+ documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
+ effectTags = {OptionEffectTag.LOADING_AND_ANALYSIS},
+ help =
+ "For use in testing before migrating away from android_resources. If false, will"
+ + " fail when non-whitelisted android_resources rules are encountered."
)
public boolean allowAndroidResources;
@Option(
- name = "experimental_android_allow_resources_attr",
- defaultValue = "true",
- documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
- effectTags = {OptionEffectTag.LOADING_AND_ANALYSIS},
- help = "For use in testing before migrating away from android_resources. If false, will"
- + " fail when non-whitelisted instances of the 'resources' attribute are encountered."
+ name = "experimental_android_allow_resources_attr",
+ defaultValue = "true",
+ documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
+ effectTags = {OptionEffectTag.LOADING_AND_ANALYSIS},
+ help =
+ "For use in testing before migrating away from android_resources. If false, will"
+ + " fail when non-whitelisted instances of the 'resources' attribute are encountered."
)
public boolean allowResourcesAttr;
@Option(
- name = "experimental_skip_parsing_action",
- defaultValue = "false",
- documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
- effectTags = {OptionEffectTag.UNKNOWN},
- help = "Skips resource parsing action for library targets"
- + " and uses the output of the compile action instead for resource merging."
+ name = "experimental_skip_parsing_action",
+ defaultValue = "false",
+ documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
+ effectTags = {OptionEffectTag.UNKNOWN},
+ help =
+ "Skips resource parsing action for library targets"
+ + " and uses the output of the compile action instead for resource merging."
)
public boolean skipParsingAction;
@@ -711,9 +732,7 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment {
}
}
- /**
- * Configuration loader for the Android fragment.
- */
+ /** Configuration loader for the Android fragment. */
public static class Loader implements ConfigurationFragmentFactory {
@Override
public Fragment create(ConfigurationEnvironment env, BuildOptions buildOptions)
@@ -758,6 +777,7 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment {
private final boolean compressJavaResources;
private final boolean exportsManifestDefault;
private final AndroidAaptVersion androidAaptVersion;
+ private final boolean useAapt2ForRobolectric;
private final boolean throwOnResourceConflict;
private final boolean useParallelDex2Oat;
private final boolean allowAndroidResources;
@@ -766,7 +786,6 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment {
private final boolean skipParsingAction;
private final boolean fixedResourceNeverlinking;
-
AndroidConfiguration(Options options) throws InvalidConfigurationException {
this.sdk = options.sdk;
this.incrementalNativeLibs = options.incrementalNativeLibs;
@@ -786,8 +805,8 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment {
this.desugarJava8 = options.desugarJava8;
this.checkDesugarDeps = options.checkDesugarDeps;
this.allowAndroidLibraryDepsWithoutSrcs = options.allowAndroidLibraryDepsWithoutSrcs;
- this.useAndroidResourceShrinking = options.useAndroidResourceShrinking
- || options.useExperimentalAndroidResourceShrinking;
+ this.useAndroidResourceShrinking =
+ options.useAndroidResourceShrinking || options.useExperimentalAndroidResourceShrinking;
this.useAndroidResourceCycleShrinking = options.useAndroidResourceCycleShrinking;
this.manifestMerger = options.manifestMerger;
this.apkSigningMethod = options.apkSigningMethod;
@@ -797,6 +816,7 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment {
this.compressJavaResources = options.compressJavaResources;
this.exportsManifestDefault = options.exportsManifestDefault;
this.androidAaptVersion = options.androidAaptVersion;
+ this.useAapt2ForRobolectric = options.useAapt2ForRobolectric;
this.throwOnResourceConflict = options.throwOnResourceConflict;
this.useParallelDex2Oat = options.useParallelDex2Oat;
this.allowAndroidResources = options.allowAndroidResources;
@@ -807,8 +827,9 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment {
if (!dexoptsSupportedInIncrementalDexing.contains("--no-locals")) {
// TODO(bazel-team): Still needed? See DexArchiveAspect
- throw new InvalidConfigurationException("--dexopts_supported_in_incremental_dexing must "
- + "include '--no-locals' to enable coverage builds");
+ throw new InvalidConfigurationException(
+ "--dexopts_supported_in_incremental_dexing must "
+ + "include '--no-locals' to enable coverage builds");
}
if (incrementalDexingShardsAfterProguard < 0) {
throw new InvalidConfigurationException(
@@ -829,9 +850,7 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment {
return incrementalNativeLibs;
}
- /**
- * Returns whether to use incremental dexing.
- */
+ /** Returns whether to use incremental dexing. */
public boolean useIncrementalDexing() {
return incrementalDexing;
}
@@ -841,46 +860,40 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment {
return incrementalDexingShardsAfterProguard;
}
- /**
- * Returns whether to look for Jars produced by {@code JavaLiteProtoAspect}.
- */
+ /** Returns whether to look for Jars produced by {@code JavaLiteProtoAspect}. */
public boolean incrementalDexingForLiteProtos() {
return incrementalDexingForLiteProtos;
}
/**
- * Returns whether to report an error when Jars that weren't converted to dex archives are part
- * of an android binary.
+ * Returns whether to report an error when Jars that weren't converted to dex archives are part of
+ * an android binary.
*/
public boolean incrementalDexingErrorOnMissedJars() {
return incrementalDexingErrorOnMissedJars;
}
/**
- * Returns true if an -assumevalues should be generated for Proguard based on the minSdkVersion
- * of the merged AndroidManifest.
+ * 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.
- */
+ /** dx flags supported in incremental dexing actions. */
public ImmutableList<String> getDexoptsSupportedInIncrementalDexing() {
return dexoptsSupportedInIncrementalDexing;
}
- /**
- * dx flags supported in dexmerger actions.
- */
+ /** dx flags supported in dexmerger actions. */
public ImmutableList<String> getDexoptsSupportedInDexMerger() {
return dexoptsSupportedInDexMerger;
}
/**
- * Incremental dexing must not be used for binaries that list any of these flags in their
- * {@code dexopts} attribute.
+ * Incremental dexing must not be used for binaries that list any of these flags in their {@code
+ * dexopts} attribute.
*/
public ImmutableList<String> getTargetDexoptsThatPreventIncrementalDexing() {
return targetDexoptsThatPreventIncrementalDexing;
@@ -947,6 +960,10 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment {
return exportsManifestDefault;
}
+ public boolean useAapt2ForRobolectric() {
+ return useAapt2ForRobolectric;
+ }
+
boolean throwOnResourceConflict() {
return throwOnResourceConflict;
}
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 977cdc39bd..5b385796d7 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
@@ -44,7 +44,6 @@ import com.google.devtools.build.lib.packages.Attribute.LateBoundDefault;
import com.google.devtools.build.lib.packages.Attribute.SplitTransition;
import com.google.devtools.build.lib.packages.AttributeMap;
import com.google.devtools.build.lib.packages.BuildType;
-import com.google.devtools.build.lib.packages.ImplicitOutputsFunction;
import com.google.devtools.build.lib.packages.ImplicitOutputsFunction.SafeImplicitOutputsFunction;
import com.google.devtools.build.lib.packages.Rule;
import com.google.devtools.build.lib.packages.RuleClass;
@@ -68,9 +67,7 @@ import com.google.devtools.build.lib.syntax.Type;
import com.google.devtools.build.lib.util.FileType;
import java.util.List;
-/**
- * Rule definitions for Android rules.
- */
+/** Rule definitions for Android rules. */
public final class AndroidRuleClasses {
/** Sources generated by a given target, in particular, {@code R.java}. */
public static final SafeImplicitOutputsFunction ANDROID_JAVA_SOURCE_JAR =
@@ -84,6 +81,7 @@ public final class AndroidRuleClasses {
*/
public static final SafeImplicitOutputsFunction ANDROID_LIBRARY_CLASS_JAR =
JavaSemantics.JAVA_LIBRARY_CLASS_JAR;
+
public static final SafeImplicitOutputsFunction ANDROID_LIBRARY_AAR =
fromTemplates("%{name}.aar");
// TODO(b/30307842): Remove this once it is no longer needed for resources migration.
@@ -91,14 +89,15 @@ public final class AndroidRuleClasses {
fromTemplates("%{name}_files/library.ap_");
/**
- * Source Jar for {@link #ANDROID_RESOURCES_CLASS_JAR}, which should be the same as
- * {@link #ANDROID_JAVA_SOURCE_JAR}.
+ * Source Jar for {@link #ANDROID_RESOURCES_CLASS_JAR}, which should be the same as {@link
+ * #ANDROID_JAVA_SOURCE_JAR}.
*/
public static final SafeImplicitOutputsFunction ANDROID_RESOURCES_SOURCE_JAR =
fromTemplates("%{name}_resources-src.jar");
/** Compiled {@link #ANDROID_JAVA_SOURCE_JAR}. */
public static final SafeImplicitOutputsFunction ANDROID_RESOURCES_CLASS_JAR =
fromTemplates("%{name}_resources.jar");
+
public static final SafeImplicitOutputsFunction ANDROID_RESOURCES_APK =
fromTemplates("%{name}.ap_");
public static final SafeImplicitOutputsFunction ANDROID_RESOURCES_AAPT2_LIBRARY_APK =
@@ -117,8 +116,7 @@ public final class AndroidRuleClasses {
fromTemplates("%{name}_files/resource_shrinker.log");
public static final SafeImplicitOutputsFunction ANDROID_INCREMENTAL_RESOURCES_APK =
fromTemplates("%{name}_files/incremental.ap_");
- public static final SafeImplicitOutputsFunction ANDROID_BINARY_APK =
- fromTemplates("%{name}.apk");
+ public static final SafeImplicitOutputsFunction ANDROID_BINARY_APK = fromTemplates("%{name}.apk");
public static final SafeImplicitOutputsFunction ANDROID_BINARY_INCREMENTAL_APK =
fromTemplates("%{name}_incremental.apk");
public static final SafeImplicitOutputsFunction ANDROID_BINARY_UNSIGNED_APK =
@@ -141,7 +139,7 @@ public final class AndroidRuleClasses {
fromTemplates("%{name}_symbols/symbols.zip");
public static final SafeImplicitOutputsFunction ANDROID_SYMLINKED_MANIFEST =
fromTemplates("%{name}_symlinked_manifest/AndroidManifest.xml");
- public static final ImplicitOutputsFunction ANDROID_PROCESSED_MANIFEST =
+ public static final SafeImplicitOutputsFunction ANDROID_PROCESSED_MANIFEST =
fromTemplates("%{name}_processed_manifest/AndroidManifest.xml");
public static final SafeImplicitOutputsFunction MOBILE_INSTALL_STUB_APPLICATION_MANIFEST =
fromTemplates("%{name}_files/mobile_install/AndroidManifest.xml");
@@ -205,8 +203,8 @@ public final class AndroidRuleClasses {
public static final SplitTransition<BuildOptions> ANDROID_SPLIT_TRANSITION =
new AndroidSplitTransition();
- private static final class AndroidSplitTransition implements
- SplitTransition<BuildOptions>, SkylarkValue {
+ private static final class AndroidSplitTransition
+ implements SplitTransition<BuildOptions>, SkylarkValue {
private static void setCrosstoolToAndroid(BuildOptions output, BuildOptions input) {
AndroidConfiguration.Options inputAndroidOptions =
input.get(AndroidConfiguration.Options.class);
@@ -308,12 +306,12 @@ public final class AndroidRuleClasses {
public static final FileType ANDROID_IDL = FileType.of(".aidl");
public static final String[] ALLOWED_DEPENDENCIES = {
- "aar_import",
- "android_library",
- "cc_library",
- "java_import",
- "java_library",
- "java_lite_proto_library",
+ "aar_import",
+ "android_library",
+ "cc_library",
+ "java_import",
+ "java_library",
+ "java_lite_proto_library",
};
public static boolean hasProguardSpecs(AttributeMap rule) {
@@ -380,9 +378,7 @@ public final class AndroidRuleClasses {
}
};
- /**
- * Definition of the {@code android_sdk} rule.
- */
+ /** Definition of the {@code android_sdk} rule. */
public static final class AndroidSdkRule implements RuleDefinition {
@Override
public RuleClass build(Builder builder, RuleDefinitionEnvironment environment) {
@@ -429,17 +425,15 @@ public final class AndroidRuleClasses {
@Override
public Metadata getMetadata() {
- return RuleDefinition.Metadata.builder()
- .name("android_sdk")
- .ancestors(BaseRuleClasses.BaseRule.class)
- .factoryClass(AndroidSdk.class)
- .build();
+ return RuleDefinition.Metadata.builder()
+ .name("android_sdk")
+ .ancestors(BaseRuleClasses.BaseRule.class)
+ .factoryClass(AndroidSdk.class)
+ .build();
}
}
- /**
- * Base class for rule definitions that support resource declarations.
- */
+ /** Base class for rule definitions that support resource declarations. */
public static final class AndroidResourceSupportRule implements RuleDefinition {
@Override
public RuleClass build(RuleClass.Builder builder, final RuleDefinitionEnvironment env) {
@@ -512,10 +506,10 @@ public final class AndroidRuleClasses {
.add(attr("enable_data_binding", Type.BOOLEAN))
// The javac annotation processor from Android's data binding library that turns
// processed XML expressions into Java code.
- .add(attr(DataBinding.DATABINDING_ANNOTATION_PROCESSOR_ATTR, BuildType.LABEL)
- .cfg(HOST)
- .value(env.getToolsLabel("//tools/android:databinding_annotation_processor")))
-
+ .add(
+ attr(DataBinding.DATABINDING_ANNOTATION_PROCESSOR_ATTR, BuildType.LABEL)
+ .cfg(HOST)
+ .value(env.getToolsLabel("//tools/android:databinding_annotation_processor")))
.build();
}
@@ -529,9 +523,7 @@ public final class AndroidRuleClasses {
}
}
- /**
- * Base class for Android rule definitions.
- */
+ /** Base class for Android rule definitions. */
public static final class AndroidBaseRule implements RuleDefinition {
@Override
public RuleClass build(RuleClass.Builder builder, RuleDefinitionEnvironment env) {
@@ -599,9 +591,7 @@ public final class AndroidRuleClasses {
}
}
- /**
- * Base class for Android rule definitions that produce binaries.
- */
+ /** Base class for Android rule definitions that produce binaries. */
public static final class AndroidBinaryBaseRule implements RuleDefinition {
private final AndroidNeverlinkAspect androidNeverlinkAspect;
@@ -945,21 +935,19 @@ public final class AndroidRuleClasses {
.value(env.getToolsLabel("//tools/android:zip_filter")))
.advertiseSkylarkProvider(SkylarkProviderIdentifier.forKey(JavaInfo.PROVIDER.getKey()))
.build();
- }
+ }
- @Override
- public Metadata getMetadata() {
+ @Override
+ public Metadata getMetadata() {
return RuleDefinition.Metadata.builder()
.name("$android_binary_base")
.type(RuleClassType.ABSTRACT)
.ancestors(AndroidRuleClasses.AndroidBaseRule.class, AndroidResourceSupportRule.class)
.build();
- }
+ }
}
- /**
- * Semantic options for the dexer's multidex behavior.
- */
+ /** Semantic options for the dexer's multidex behavior. */
public enum MultidexMode {
// Build dexes with multidex, assuming native platform support for multidex.
NATIVE,
@@ -970,24 +958,20 @@ public final class AndroidRuleClasses {
// Build all dex code into a single classes.dex file.
OFF;
- /**
- * Returns the attribute value that specifies this mode.
- */
+ /** Returns the attribute value that specifies this mode. */
public String getAttributeValue() {
return toString().toLowerCase();
}
/**
- * Returns the name of the output dex classes file. In multidex mode, this is an archive
- * of (possibly) multiple files.
+ * Returns the name of the output dex classes file. In multidex mode, this is an archive of
+ * (possibly) multiple files.
*/
public String getOutputDexFilename() {
return this == OFF ? "classes.dex" : "classes.dex.zip";
}
- /**
- * Converts an attribute value to a corresponding mode. Returns null on no match.
- */
+ /** Converts an attribute value to a corresponding mode. Returns null on no match. */
public static MultidexMode fromValue(String value) {
for (MultidexMode mode : values()) {
if (mode.getAttributeValue().equals(value)) {
@@ -997,9 +981,7 @@ public final class AndroidRuleClasses {
return null;
}
- /**
- * Enumerates valid values for the "multidex" attribute.
- */
+ /** Enumerates valid values for the "multidex" attribute. */
public static List<String> getValidValues() {
List<String> ans = Lists.newArrayList();
for (MultidexMode mode : MultidexMode.values()) {
@@ -1009,4 +991,3 @@ public final class AndroidRuleClasses {
}
}
}
-
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/RobolectricResourceSymbolsActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/RobolectricResourceSymbolsActionBuilder.java
index 4a32cabbeb..ea84eeede7 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/RobolectricResourceSymbolsActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/RobolectricResourceSymbolsActionBuilder.java
@@ -24,7 +24,9 @@ import com.google.devtools.build.lib.analysis.actions.SpawnAction;
import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
+import com.google.devtools.build.lib.rules.android.AndroidConfiguration.AndroidAaptVersion;
import com.google.devtools.build.lib.rules.android.ResourceContainerConverter.Builder.SeparatorType;
+import com.google.devtools.build.lib.rules.android.ResourceContainerConverter.ToArg;
import com.google.devtools.build.lib.util.OS;
/**
@@ -44,9 +46,19 @@ public class RobolectricResourceSymbolsActionBuilder {
.withSeparator(SeparatorType.COLON_COMMA)
.toArgConverter();
+ private static final ResourceContainerConverter.ToArg RESOURCE_CONTAINER_TO_AAPT2_ARG =
+ ResourceContainerConverter.builder()
+ .includeResourceRoots()
+ .includeManifest()
+ .includeAapt2RTxt()
+ .includeSymbolsBin()
+ .withSeparator(SeparatorType.COLON_COMMA)
+ .toArgConverter();
+
private Artifact classJarOut;
private final ResourceDependencies dependencies;
private AndroidSdkProvider sdk;
+ private AndroidAaptVersion androidAaptVersion;
private RobolectricResourceSymbolsActionBuilder(ResourceDependencies dependencies) {
this.dependencies = dependencies;
@@ -66,6 +78,12 @@ public class RobolectricResourceSymbolsActionBuilder {
return this;
}
+ public RobolectricResourceSymbolsActionBuilder targetAaptVersion(
+ AndroidAaptVersion androidAaptVersion) {
+ this.androidAaptVersion = androidAaptVersion;
+ return this;
+ }
+
public NestedSet<Artifact> buildAsClassPathEntry(RuleContext ruleContext) {
CustomCommandLine.Builder builder = new CustomCommandLine.Builder();
// Set the busybox tool.
@@ -76,19 +94,27 @@ public class RobolectricResourceSymbolsActionBuilder {
builder.addExecPath("--androidJar", sdk.getAndroidJar());
inputs.add(sdk.getAndroidJar());
+ ToArg resourceContainerToArg;
+
+ if (androidAaptVersion == AndroidAaptVersion.AAPT2) {
+ inputs.addTransitive(dependencies.getTransitiveAapt2RTxt());
+ resourceContainerToArg = RESOURCE_CONTAINER_TO_AAPT2_ARG;
+ } else {
+ inputs.addTransitive(dependencies.getTransitiveRTxt());
+ resourceContainerToArg = RESOURCE_CONTAINER_TO_ARG;
+ }
if (!Iterables.isEmpty(dependencies.getResourceContainers())) {
builder.addAll(
"--data",
- VectorArg.join(RESOURCE_CONTAINER_TO_ARG.listSeparator())
+ VectorArg.join(resourceContainerToArg.listSeparator())
.each(dependencies.getResourceContainers())
- .mapped(RESOURCE_CONTAINER_TO_ARG));
+ .mapped(resourceContainerToArg));
}
inputs
.addTransitive(dependencies.getTransitiveResources())
.addTransitive(dependencies.getTransitiveAssets())
.addTransitive(dependencies.getTransitiveManifests())
- .addTransitive(dependencies.getTransitiveRTxt())
.addTransitive(dependencies.getTransitiveSymbolsBin());
builder.addExecPath("--classJarOutput", classJarOut);