diff options
author | 2018-01-16 14:18:01 -0800 | |
---|---|---|
committer | 2018-01-16 14:25:11 -0800 | |
commit | 19044cfd268dff2321bd624315912bdbda2e4576 (patch) | |
tree | 6ee77511129c835cc00155abf55e4bf25a2196dc /src/main/java | |
parent | 8b0934795036154dd4d835ea30770bc0b86243a9 (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.java | 21 | ||||
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/android/LocalResourceContainer.java | 27 |
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) { |