aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java13
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java20
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java38
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceValidatorActionBuilder.java22
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesProcessorBuilder.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java93
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/RClassGeneratorActionBuilder.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ResourceShrinkerActionBuilder.java7
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();