diff options
Diffstat (limited to 'src/main/java/com/google')
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); |