aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java
diff options
context:
space:
mode:
authorGravatar ajmichael <ajmichael@google.com>2018-01-16 14:18:01 -0800
committerGravatar Copybara-Service <copybara-piper@google.com>2018-01-16 14:25:11 -0800
commit19044cfd268dff2321bd624315912bdbda2e4576 (patch)
tree6ee77511129c835cc00155abf55e4bf25a2196dc /src/main/java
parent8b0934795036154dd4d835ea30770bc0b86243a9 (diff)
Add assets support to aar_import.
Fixes https://github.com/bazelbuild/bazel/issues/4439. Empty assets are handled by writing out an empty file named "assets/empty_asset_generated_by_bazel~", which will silently be ignored by AAPT. RELNOTES: aar_import now supports assets. PiperOrigin-RevId: 182110400
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java21
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/LocalResourceContainer.java27
2 files changed, 22 insertions, 26 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java b/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java
index 2d696d28e4..9617d95063 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java
@@ -17,7 +17,6 @@ import com.google.common.collect.ImmutableList;
import com.google.devtools.build.lib.actions.Action;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
-import com.google.devtools.build.lib.analysis.FileProvider;
import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder;
import com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory;
import com.google.devtools.build.lib.analysis.RuleContext;
@@ -27,7 +26,6 @@ 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.configuredtargets.RuleConfiguredTarget.Mode;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
-import com.google.devtools.build.lib.collect.nestedset.Order;
import com.google.devtools.build.lib.rules.java.JavaCommon;
import com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvider;
import com.google.devtools.build.lib.rules.java.JavaCompilationArtifacts;
@@ -83,23 +81,20 @@ public class AarImport implements RuleConfiguredTargetFactory {
ruleContext, aar, ANDROID_MANIFEST, androidManifestArtifact));
Artifact resources = createAarTreeArtifact(ruleContext, "resources");
- ruleContext.registerAction(createAarResourcesExtractorActions(ruleContext, aar, resources));
+ Artifact assets = createAarTreeArtifact(ruleContext, "assets");
+ ruleContext.registerAction(
+ createAarResourcesExtractorActions(ruleContext, aar, resources, assets));
ApplicationManifest androidManifest =
ApplicationManifest.fromExplicitManifest(ruleContext, androidManifestArtifact);
- FileProvider resourcesProvider =
- new FileProvider(
- new NestedSetBuilder<Artifact>(Order.NAIVE_LINK_ORDER).add(resources).build());
-
Artifact resourcesZip =
ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_RESOURCES_ZIP);
ResourceApk resourceApk =
androidManifest.packAarWithDataAndResources(
ruleContext,
- LocalResourceContainer.forResourceFileProvider(
- ruleContext, resourcesProvider, "resources"),
+ LocalResourceContainer.forAssetsAndResourcesDirectories(assets, resources),
ResourceDependencies.fromRuleDeps(ruleContext, JavaCommon.isNeverLink(ruleContext)),
ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_R_TXT),
ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_LOCAL_SYMBOLS),
@@ -195,7 +190,7 @@ public class AarImport implements RuleConfiguredTargetFactory {
}
private static Action[] createAarResourcesExtractorActions(
- RuleContext ruleContext, Artifact aar, Artifact outputTree) {
+ RuleContext ruleContext, Artifact aar, Artifact resourcesDir, Artifact assetsDir) {
return new SpawnAction.Builder()
.useDefaultShellEnvironment()
.setExecutable(
@@ -203,11 +198,13 @@ public class AarImport implements RuleConfiguredTargetFactory {
AarImportBaseRule.AAR_RESOURCES_EXTRACTOR, Mode.HOST))
.setMnemonic("AarResourcesExtractor")
.addInput(aar)
- .addOutput(outputTree)
+ .addOutput(resourcesDir)
+ .addOutput(assetsDir)
.addCommandLine(
CustomCommandLine.builder()
.addExecPath("--input_aar", aar)
- .addExecPath("--output_res_dir", outputTree)
+ .addExecPath("--output_res_dir", resourcesDir)
+ .addExecPath("--output_assets_dir", assetsDir)
.build())
.build(ruleContext);
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/LocalResourceContainer.java b/src/main/java/com/google/devtools/build/lib/rules/android/LocalResourceContainer.java
index d0da13d2bb..f11cd1835a 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/LocalResourceContainer.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/LocalResourceContainer.java
@@ -16,6 +16,7 @@ package com.google.devtools.build.lib.rules.android;
import com.android.resources.ResourceFolderType;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Joiner;
+import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.devtools.build.lib.actions.Artifact;
@@ -165,27 +166,25 @@ public final class LocalResourceContainer {
}
/**
- * Creates a {@link LocalResourceContainer} containing the resources included in a {@link
- * FileProvider}.
+ * Creates a {@link LocalResourceContainer} containing all the resources and assets in directory
+ * artifacts.
*
* <p>In general, {@link #forAssetsAndResources(RuleContext, String, PathFragment, String)} should
* be used instead. No assets or transitive resources will be included in the container produced
* by this method.
*
- * @param ruleContext the current context
- * @param resourceFileProvider the provider containing resources
- * @param resourcesAttr the attribute used to refer to resource files in this target.
+ * @param assetsDir the tree artifact containing a {@code assets/} directory
+ * @param resourcesDir the tree artifact containing a {@code res/} directory
*/
- public static LocalResourceContainer forResourceFileProvider(
- RuleContext ruleContext, FileProvider resourceFileProvider, String resourcesAttr)
- throws RuleErrorException {
- ImmutableList<Artifact> resources = getResources(ImmutableList.of(resourceFileProvider));
-
+ static LocalResourceContainer forAssetsAndResourcesDirectories(
+ Artifact assetsDir, Artifact resourcesDir) {
+ Preconditions.checkArgument(resourcesDir.isTreeArtifact());
+ Preconditions.checkArgument(assetsDir.isTreeArtifact());
return new LocalResourceContainer(
- resources,
- getResourceRoots(ruleContext, resources, resourcesAttr),
- ImmutableList.of(),
- ImmutableList.of());
+ ImmutableList.of(resourcesDir),
+ ImmutableList.of(resourcesDir.getExecPath().getChild("res")),
+ ImmutableList.of(assetsDir),
+ ImmutableList.of(assetsDir.getExecPath().getChild("assets")));
}
private static ImmutableList<Artifact> getResources(Iterable<FileProvider> targets) {