diff options
Diffstat (limited to 'src/main')
8 files changed, 147 insertions, 58 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 c8ba00d1c8..3eff2e482b 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 @@ -55,6 +55,7 @@ import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.packages.BuildType; import com.google.devtools.build.lib.packages.TriState; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; +import com.google.devtools.build.lib.rules.android.AndroidConfiguration.AndroidAaptVersion; import com.google.devtools.build.lib.rules.android.AndroidConfiguration.AndroidBinaryType; import com.google.devtools.build.lib.rules.android.AndroidRuleClasses.MultidexMode; import com.google.devtools.build.lib.rules.cpp.CcToolchainProvider; @@ -235,6 +236,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_RESOURCES_APK), resourceDeps, ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_R_TXT), + ResourceFilter.fromRuleContext(ruleContext), ruleContext.getTokenizedStringListAttr("nocompress_extensions"), ruleContext.attributes().get("crunch_png", Type.BOOLEAN), ProguardHelper.getProguardConfigArtifact(ruleContext, ""), @@ -1141,7 +1143,14 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { } /** Returns {@code true} if resource shrinking should be performed. */ - private static boolean shouldShrinkResources(RuleContext ruleContext) { + private static boolean shouldShrinkResources(RuleContext ruleContext) throws RuleErrorException { + + if (AndroidAaptVersion.chooseTargetAaptVersion(ruleContext) == AndroidAaptVersion.AAPT2) { + ruleContext.attributeWarning( + "shrink_resources", "aapt2 enabled builds do not yet support resource shrinking."); + return false; + } + TriState state = ruleContext.attributes().get("shrink_resources", BuildType.TRISTATE); if (state == TriState.AUTO) { boolean globalShrinkResources = @@ -1157,7 +1166,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { ResourceApk resourceApk, ImmutableList<Artifact> proguardSpecs, ProguardOutput proguardOutput, - NestedSetBuilder<Artifact> filesBuilder) throws InterruptedException { + NestedSetBuilder<Artifact> filesBuilder) throws InterruptedException, RuleErrorException { if (LocalResourceContainer.definesAndroidResources(ruleContext.attributes()) && !proguardSpecs.isEmpty()) { diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java index cbbc59904f..2a5248951d 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java @@ -40,8 +40,10 @@ import com.google.devtools.build.lib.packages.AttributeMap; import com.google.devtools.build.lib.packages.BuildType; import com.google.devtools.build.lib.packages.NativeClassObjectConstructor; import com.google.devtools.build.lib.packages.Rule; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.packages.SkylarkClassObject; import com.google.devtools.build.lib.packages.TriState; +import com.google.devtools.build.lib.rules.android.AndroidConfiguration.AndroidAaptVersion; import com.google.devtools.build.lib.rules.android.ResourceContainer.ResourceType; import com.google.devtools.build.lib.rules.cpp.CcLinkParams; import com.google.devtools.build.lib.rules.cpp.CcLinkParamsProvider; @@ -403,7 +405,7 @@ public class AndroidCommon { JavaTargetAttributes.Builder attributes, NestedSetBuilder<Artifact> filesBuilder, boolean useRClassGenerator) - throws InterruptedException { + throws InterruptedException, RuleErrorException { compileResourceJar(javaSemantics, resourceApk, resourcesJar, useRClassGenerator); // Add the compiled resource jar to the classpath of the main compilation. attributes.addDirectJars(NestedSetBuilder.create(Order.STABLE_ORDER, resourceClassJar)); @@ -421,7 +423,7 @@ public class AndroidCommon { private void compileResourceJar( JavaSemantics javaSemantics, ResourceApk resourceApk, Artifact resourcesJar, boolean useRClassGenerator) - throws InterruptedException { + throws InterruptedException, RuleErrorException { resourceSourceJar = ruleContext.getImplicitOutputArtifact( AndroidRuleClasses.ANDROID_RESOURCES_SOURCE_JAR); resourceClassJar = ruleContext.getImplicitOutputArtifact( @@ -435,12 +437,12 @@ public class AndroidCommon { // Only build the class jar if it's not already generated internally by resource processing. if (resourceApk.getResourceJavaClassJar() == null) { if (useRClassGenerator) { - RClassGeneratorActionBuilder actionBuilder = - new RClassGeneratorActionBuilder(ruleContext) - .withPrimary(resourceApk.getPrimaryResource()) - .withDependencies(resourceApk.getResourceDependencies()) - .setClassJarOut(resourceClassJar); - actionBuilder.build(); + new RClassGeneratorActionBuilder(ruleContext) + .targetAaptVersion(AndroidAaptVersion.chooseTargetAaptVersion(ruleContext)) + .withPrimary(resourceApk.getPrimaryResource()) + .withDependencies(resourceApk.getResourceDependencies()) + .setClassJarOut(resourceClassJar) + .build(); } else { Artifact outputDepsProto = javacHelper.createOutputDepsProtoArtifact(resourceClassJar, javaArtifactsBuilder); @@ -526,7 +528,7 @@ public class AndroidCommon { boolean collectJavaCompilationArgs, boolean isBinary, boolean includeLibraryResourceJars) - throws InterruptedException { + throws InterruptedException, RuleErrorException { classJar = ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_LIBRARY_CLASS_JAR); idlHelper = new AndroidIdlHelper(ruleContext, classJar); 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 4cfa897bcf..86b850ca7b 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 @@ -13,10 +13,13 @@ // limitations under the License. package com.google.devtools.build.lib.rules.android; +import static com.google.devtools.build.lib.syntax.Type.STRING; + import com.google.common.base.Splitter; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; +import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.config.BuildConfiguration; import com.google.devtools.build.lib.analysis.config.BuildConfiguration.EmptyToNullLabelConverter; import com.google.devtools.build.lib.analysis.config.BuildConfiguration.Fragment; @@ -29,6 +32,7 @@ import com.google.devtools.build.lib.analysis.config.InvalidConfigurationExcepti import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.packages.Attribute.SplitTransition; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.cpp.CppConfiguration.DynamicMode; import com.google.devtools.build.lib.rules.cpp.CppOptions.DynamicModeConverter; import com.google.devtools.build.lib.rules.cpp.CppOptions.LibcTopLabelConverter; @@ -42,6 +46,7 @@ import com.google.devtools.common.options.OptionMetadataTag; import com.google.devtools.common.options.OptionsParsingException; import java.util.List; import java.util.Set; +import javax.annotation.Nullable; /** * Configuration fragment for Android rules. @@ -222,6 +227,37 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment { } return null; } + + // TODO(corysmith): Move to ApplicationManifest when no longer needed as a public function. + @Nullable + public static AndroidAaptVersion chooseTargetAaptVersion(RuleContext ruleContext) + throws RuleErrorException { + if (ruleContext.isLegalFragment(AndroidConfiguration.class)) { + boolean hasAapt2 = AndroidSdkProvider.fromRuleContext(ruleContext).getAapt2() != null; + AndroidAaptVersion flag = + ruleContext.getFragment(AndroidConfiguration.class).getAndroidAaptVersion(); + + if (ruleContext.getRule().isAttrDefined("aapt_version", STRING)) { + // On rules that can choose a version, test attribute then flag choose the aapt version + // target. + AndroidAaptVersion version = + fromString(ruleContext.attributes().get("aapt_version", STRING)); + // version is null if the value is "auto" + version = version == AndroidAaptVersion.AUTO ? flag : version; + + if (version == AAPT2 && !hasAapt2) { + ruleContext.throwWithRuleError( + "aapt2 processing requested but not available on the android_sdk"); + return null; + } + return version == AndroidAaptVersion.AUTO ? AAPT : version; + } else { + // On rules can't choose, assume aapt2 if aapt2 is present in the sdk. + return hasAapt2 ? AAPT2 : AAPT; + } + } + return null; + } } /** Android configuration options. */ @@ -637,6 +673,7 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment { ) public boolean exportsManifestDefault; + @Option( name = "experimental_android_generate_robolectric_r_class", defaultValue = "false", @@ -737,6 +774,7 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment { private final boolean throwOnResourceConflict; private final boolean useParallelDex2Oat; + AndroidConfiguration(Options options) throws InvalidConfigurationException { this.sdk = options.sdk; this.incrementalNativeLibs = options.incrementalNativeLibs; diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceValidatorActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceValidatorActionBuilder.java index 77740fa993..9a061a7ff0 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceValidatorActionBuilder.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceValidatorActionBuilder.java @@ -116,12 +116,14 @@ public class AndroidResourceValidatorActionBuilder { } public ResourceContainer build(ActionConstructionContext context) { - ResourceContainer container = createValidateAction(context); - if (compiledSymbols == null) { - return container; - } else { - return createLinkStaticLibraryAction(container, context); + ResourceContainer container = primary; + if (rTxtOut != null) { + container = createValidateAction(container, context); } + if (compiledSymbols != null) { + container = createLinkStaticLibraryAction(container, context); + } + return container; } public AndroidResourceValidatorActionBuilder setCompiledSymbols(Artifact compiledSymbols) { @@ -152,13 +154,12 @@ public class AndroidResourceValidatorActionBuilder { builder.addExecPath("--aapt2", sdk.getAapt2().getExecutable()); FluentIterable<Artifact> libraries = - FluentIterable.from(resourceDeps.getResources()) - .transform(ResourceContainer::getStaticLibrary) - .append(ImmutableList.of(sdk.getAndroidJar())); // the android jar is a static library. + FluentIterable.from(resourceDeps.getResources()).transform( + ResourceContainer::getStaticLibrary); builder .add("--libraries") - .add(libraries.join(Joiner.on(':'))); + .add(libraries.join(Joiner.on(context.getConfiguration().getHostPathSeparator()))); inputs.addAll(libraries); builder.addExecPath("--compiled", compiledSymbols); @@ -204,7 +205,8 @@ public class AndroidResourceValidatorActionBuilder { .build(); } - private ResourceContainer createValidateAction(ActionConstructionContext context) { + private ResourceContainer createValidateAction( + ResourceContainer primary, ActionConstructionContext context) { CustomCommandLine.Builder builder = new CustomCommandLine.Builder(); // Set the busybox tool. 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 597224db86..8bca6ba996 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 @@ -37,18 +37,20 @@ public class AndroidResourcesProcessorBuilder { private static final ResourceContainerConverter.ToArtifacts AAPT2_RESOURCE_DEP_TO_ARTIFACTS = ResourceContainerConverter.builder() - .includeStaticLibrary() + .includeResourceRoots() .includeManifest() .includeAapt2RTxt() .includeSymbolsBin() + .includeStaticLibrary() .toArtifactConverter(); private static final ResourceContainerConverter.ToArg AAPT2_RESOURCE_DEP_TO_ARG = ResourceContainerConverter.builder() - .includeStaticLibrary() + .includeResourceRoots() .includeManifest() .includeAapt2RTxt() .includeSymbolsBin() + .includeStaticLibrary() .withSeparator(SeparatorType.COLON_COMMA) .toArgConverter(); @@ -326,9 +328,7 @@ public class AndroidResourcesProcessorBuilder { ResourceContainerConverter.convertDependencies( dependencies, builder, inputs, RESOURCE_DEP_TO_ARG, RESOURCE_DEP_TO_ARTIFACTS); - builder.addExecPath("--aapt", sdk.getAapt().getExecutable()); - configureCommonFlags(outs, inputs, builder); // Create the spawn action. 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 36ef672877..0fea1e2567 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 @@ -46,13 +46,15 @@ import javax.annotation.Nullable; /** Represents a AndroidManifest, that may have been merged from dependencies. */ public final class ApplicationManifest { - public static ApplicationManifest fromResourcesRule(RuleContext ruleContext) { + + public static ApplicationManifest fromResourcesRule(RuleContext ruleContext) + throws RuleErrorException { final AndroidResourcesProvider resources = AndroidCommon.getAndroidResources(ruleContext); if (resources == null) { ruleContext.attributeError("manifest", "a resources or manifest attribute is mandatory."); return null; } - return new ApplicationManifest( + return fromExplicitManifest( ruleContext, Iterables.getOnlyElement(resources.getDirectAndroidResources()).getManifest()); } @@ -82,7 +84,7 @@ public final class ApplicationManifest { } ruleContext.registerAction(builder.build(ruleContext)); - return new ApplicationManifest(ruleContext, result); + return new ApplicationManifest(ruleContext, result, targetAaptVersion); } public ApplicationManifest addMobileInstallStubApplication(RuleContext ruleContext) @@ -112,7 +114,7 @@ public final class ApplicationManifest { ruleContext.registerAction(builder.build(ruleContext)); - return new ApplicationManifest(ruleContext, stubManifest); + return new ApplicationManifest(ruleContext, stubManifest, targetAaptVersion); } public ApplicationManifest addInstantRunStubApplication(RuleContext ruleContext) @@ -133,28 +135,30 @@ public final class ApplicationManifest { ruleContext.registerAction(builder.build(ruleContext)); - return new ApplicationManifest(ruleContext, stubManifest); + return new ApplicationManifest(ruleContext, stubManifest, targetAaptVersion); } - public static ApplicationManifest fromRule(RuleContext ruleContext) { - return new ApplicationManifest( + public static ApplicationManifest fromRule(RuleContext ruleContext) throws RuleErrorException { + return fromExplicitManifest( ruleContext, ruleContext.getPrerequisiteArtifact("manifest", Mode.TARGET)); } - public static ApplicationManifest fromExplicitManifest( - RuleContext ruleContext, Artifact manifest) { - return new ApplicationManifest(ruleContext, manifest); + public static ApplicationManifest fromExplicitManifest(RuleContext ruleContext, Artifact manifest) + throws RuleErrorException { + return new ApplicationManifest( + ruleContext, manifest, AndroidAaptVersion.chooseTargetAaptVersion(ruleContext)); } /** * Generates an empty manifest for a rule that does not directly specify resources. * - * <p><strong>Note:</strong> This generated manifest can then be used as the primary manifest - * when merging with dependencies. + * <p><strong>Note:</strong> This generated manifest can then be used as the primary manifest when + * merging with dependencies. * * @return the generated ApplicationManifest */ - public static ApplicationManifest generatedManifest(RuleContext ruleContext) { + public static ApplicationManifest generatedManifest(RuleContext ruleContext) + throws RuleErrorException { Artifact generatedManifest = ruleContext.getUniqueDirectoryArtifact( ruleContext.getRule().getName() + "_generated", PathFragment.create("AndroidManifest.xml"), ruleContext.getBinOrGenfilesDirectory()); @@ -172,7 +176,7 @@ public final class ApplicationManifest { .registerAction( FileWriteAction.create( ruleContext, generatedManifest, contents, /*makeExecutable=*/ false)); - return new ApplicationManifest(ruleContext, generatedManifest); + return fromExplicitManifest(ruleContext, generatedManifest); } private static ImmutableMap<String, String> getManifestValues(RuleContext context) { @@ -200,10 +204,13 @@ public final class ApplicationManifest { private final Artifact manifest; private final ImmutableMap<String, String> manifestValues; + private final AndroidAaptVersion targetAaptVersion; - private ApplicationManifest(RuleContext ruleContext, Artifact manifest) { + private ApplicationManifest( + RuleContext ruleContext, Artifact manifest, AndroidAaptVersion targetAaptVersion) { this.manifest = manifest; this.manifestValues = getManifestValues(ruleContext); + this.targetAaptVersion = targetAaptVersion; } public ApplicationManifest mergeWith(RuleContext ruleContext, ResourceDependencies resourceDeps) { @@ -222,7 +229,7 @@ public final class ApplicationManifest { ruleContext.getBinOrGenfilesDirectory()); AndroidManifestMergeHelper.createMergeManifestAction(ruleContext, getManifest(), mergeeManifests.keySet(), ImmutableList.of("all"), outputManifest); - return new ApplicationManifest(ruleContext, outputManifest); + return new ApplicationManifest(ruleContext, outputManifest, targetAaptVersion); } } else { if (!mergeeManifests.isEmpty() || !manifestValues.isEmpty()) { @@ -241,7 +248,7 @@ public final class ApplicationManifest { .setManifestOutput(outputManifest) .setLogOut(mergeLog) .build(ruleContext); - return new ApplicationManifest(ruleContext, outputManifest); + return new ApplicationManifest(ruleContext, outputManifest, targetAaptVersion); } } return this; @@ -292,7 +299,7 @@ public final class ApplicationManifest { .setCustomPackage(customPackage) .setManifestOutput(outputManifest) .build(ruleContext); - return new ApplicationManifest(ruleContext, outputManifest); + return new ApplicationManifest(ruleContext, outputManifest, targetAaptVersion); } /** Packages up the manifest with assets from the rule and dependent resources. */ @@ -345,14 +352,15 @@ public final class ApplicationManifest { if (ruleContext.hasErrors()) { return null; } - ResourceContainer.Builder resourceContainer = + ResourceContainer.Builder builder = ResourceContainer.builderFromRule(ruleContext) .setRTxt(rTxt) .setSymbols(symbols) .setJavaPackageFrom(JavaPackageSource.MANIFEST); if (alwaysExportManifest) { - resourceContainer.setManifestExported(true); + builder.setManifestExported(true); } + return createApk( ruleContext, true, /* isLibrary */ @@ -360,7 +368,7 @@ public final class ApplicationManifest { ImmutableList.<String>of(), /* List<String> uncompressedExtensions */ false, /* crunchPng */ false, /* incremental */ - resourceContainer, + builder, data, null, /* Artifact proguardCfg */ null, /* Artifact mainDexProguardCfg */ @@ -418,7 +426,8 @@ public final class ApplicationManifest { RuleContext ruleContext, Artifact resourceApk, ResourceDependencies resourceDeps, - Artifact rTxt, + @Nullable Artifact rTxt, + ResourceFilter resourceFilter, List<String> uncompressedExtensions, boolean crunchPng, Artifact proguardCfg, @@ -442,6 +451,13 @@ public final class ApplicationManifest { "resource_files", Mode.TARGET, FileProvider.class)).build(); + ResourceContainer.Builder builder = + ResourceContainer.builderFromRule(ruleContext) + .setAssetsAndResourcesFrom(data) + .setManifest(getManifest()) + .setRTxt(rTxt) + .setApk(resourceApk); + if (ruleContext.hasErrors()) { return null; } @@ -452,9 +468,7 @@ public final class ApplicationManifest { uncompressedExtensions, crunchPng, false /* incremental */, - ResourceContainer.builderFromRule(ruleContext) - .setRTxt(rTxt) - .setApk(resourceApk), + builder, data, proguardCfg, mainDexProguardCfg, @@ -488,6 +502,28 @@ public final class ApplicationManifest { if (ruleContext.hasErrors()) { return null; } + ResourceContainer.Builder builder = + ResourceContainer.builderFromRule(ruleContext) + .setAssetsAndResourcesFrom(data) + .setManifest(getManifest()) + .setSymbols(symbols) + .setRTxt(rTxt); + + if (targetAaptVersion == AndroidAaptVersion.AAPT2) { + + builder + .setAapt2JavaSourceJar( + ruleContext.getImplicitOutputArtifact( + AndroidRuleClasses.ANDROID_RESOURCES_AAPT2_SOURCE_JAR)) + .setAapt2RTxt( + ruleContext.getImplicitOutputArtifact( + AndroidRuleClasses.ANDROID_RESOURCES_AAPT2_R_TXT)) + .setCompiledSymbols( + ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_COMPILED_SYMBOLS)) + .setStaticLibrary( + ruleContext.getImplicitOutputArtifact( + AndroidRuleClasses.ANDROID_RESOURCES_AAPT2_LIBRARY_APK)); + } return createApk( ruleContext, true /* isLibrary */, @@ -495,10 +531,7 @@ public final class ApplicationManifest { ImmutableList.<String>of() /* uncompressedExtensions */, false /* crunchPng */, false /* incremental */, - ResourceContainer.builderFromRule(ruleContext) - .setRTxt(rTxt) - .setSymbols(symbols) - .setApk(null), + builder, data, null /* proguardCfg */, null /* mainDexProguardCfg */, @@ -634,7 +667,7 @@ public final class ApplicationManifest { .getFragment(AndroidConfiguration.class).throwOnResourceConflict()); if (!incremental) { builder - .targetAaptVersion(AndroidAaptVersion.AAPT) + .targetAaptVersion(targetAaptVersion) .setRTxtOut(resourceContainer.getRTxt()) .setSymbols(resourceContainer.getSymbols()) .setSourceJarOut(resourceContainer.getJavaSourceJar()); diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/RClassGeneratorActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/RClassGeneratorActionBuilder.java index 12215da639..4b9ed82e96 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/RClassGeneratorActionBuilder.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/RClassGeneratorActionBuilder.java @@ -129,8 +129,8 @@ public class RClassGeneratorActionBuilder { .build(ruleContext)); } - private static Artifact chooseRTxt(ResourceContainer primary, AndroidAaptVersion version) { - return version == AndroidAaptVersion.AAPT2 ? primary.getAapt2RTxt() : primary.getRTxt(); + private static Artifact chooseRTxt(ResourceContainer container, AndroidAaptVersion version) { + return version == AndroidAaptVersion.AAPT2 ? container.getAapt2RTxt() : container.getRTxt(); } private static Function<ResourceContainer, NestedSet<Artifact>> chooseDepsToArtifacts( diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceShrinkerActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceShrinkerActionBuilder.java index 9a997bffb9..e39b1e98a2 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceShrinkerActionBuilder.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceShrinkerActionBuilder.java @@ -22,6 +22,8 @@ import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.actions.CustomCommandLine; import com.google.devtools.build.lib.analysis.actions.SpawnAction; import com.google.devtools.build.lib.analysis.config.CompilationMode; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; +import com.google.devtools.build.lib.rules.android.AndroidConfiguration.AndroidAaptVersion; import java.util.Collections; import java.util.List; @@ -141,7 +143,10 @@ public class ResourceShrinkerActionBuilder { return this; } - public Artifact build() { + public Artifact build() throws RuleErrorException { + if (AndroidAaptVersion.chooseTargetAaptVersion(ruleContext) == AndroidAaptVersion.AAPT2) { + ruleContext.throwWithRuleError("aapt2 enabled builds do not yet support resource shrinking."); + } ImmutableList.Builder<Artifact> inputs = ImmutableList.builder(); ImmutableList.Builder<Artifact> outputs = ImmutableList.builder(); |