From 5a03ba3eb0b76a31ce36593b31f6c70946d79797 Mon Sep 17 00:00:00 2001 From: corysmith Date: Tue, 3 Oct 2017 20:30:45 +0200 Subject: Fix the R.txt to generate a transitive closure instead of the current resources. RELNOTES: None PiperOrigin-RevId: 170886429 --- .../build/android/aapt2/ResourceLinker.java | 68 +++++++++++++++++----- 1 file changed, 54 insertions(+), 14 deletions(-) (limited to 'src') diff --git a/src/tools/android/java/com/google/devtools/build/android/aapt2/ResourceLinker.java b/src/tools/android/java/com/google/devtools/build/android/aapt2/ResourceLinker.java index b1b625e993..7f653d7808 100644 --- a/src/tools/android/java/com/google/devtools/build/android/aapt2/ResourceLinker.java +++ b/src/tools/android/java/com/google/devtools/build/android/aapt2/ResourceLinker.java @@ -13,6 +13,8 @@ // limitations under the License. package com.google.devtools.build.android.aapt2; +import static java.util.stream.Collectors.toList; + import com.android.builder.core.VariantType; import com.android.repository.Revision; import com.google.common.base.Joiner; @@ -25,6 +27,7 @@ import com.google.devtools.build.android.Profiler; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.util.Collection; import java.util.List; import java.util.Objects; import java.util.logging.Level; @@ -86,6 +89,7 @@ public class ResourceLinker { this.include = include; return this; } + public ResourceLinker withAssets(List assetDirs) { this.assetDirs = assetDirs; return this; @@ -113,13 +117,19 @@ public class ResourceLinker { * @throws IOException */ public StaticLibrary linkStatically(CompiledResources resources) { - final Path outPath = workingDirectory.resolve("lib.ap_"); + final Path outPath = workingDirectory.resolve("lib.apk"); final Path rTxt = workingDirectory.resolve("R.txt"); final Path sourceJar = workingDirectory.resolve("r.srcjar"); Path javaSourceDirectory = workingDirectory.resolve("java"); try { profiler.startTask("linkstatic"); + final List compiledResourcePaths = + include + .stream() + .map(compiledResources -> compiledResources.getZip().toString()) + .collect(toList()); + final Collection pathsToLinkAgainst = StaticLibrary.toPathStrings(linkAgainst); logger.fine( new AaptCommandBuilder(aapt2) .forBuildToolsVersion(buildToolsVersion) @@ -131,17 +141,46 @@ public class ResourceLinker { .whenVersionIsAtLeast(new Revision(23)) .thenAdd("--no-version-vectors") .add("-R", resources.getZip()) - .addRepeated("-R", - include.stream() - .map(compiledResources -> compiledResources.getZip().toString()) - .collect(Collectors.toList())) - .addRepeated("-I", StaticLibrary.toPathStrings(linkAgainst)) + .addRepeated("-R", compiledResourcePaths) + .addRepeated("-I", pathsToLinkAgainst) .add("--auto-add-overlay") .add("-o", outPath) - .add("--java", javaSourceDirectory) - .add("--output-text-symbols", rTxt) + .when(linkAgainst.size() == 1) // If using all compiled resources, generates sources + .thenAdd("--java", javaSourceDirectory) + .when(linkAgainst.size() == 1) // If using all compiled resources, generates R.txt + .thenAdd("--output-text-symbols", rTxt) .execute(String.format("Statically linking %s", resources))); - profiler.recordEndOf("linkstatic").startTask("sourcejar"); + profiler.recordEndOf("linkstatic"); + // working around aapt2 not producing transitive R.txt and R.java + if (linkAgainst.size() > 1) { + profiler.startTask("rfix"); + logger.fine( + new AaptCommandBuilder(aapt2) + .forBuildToolsVersion(buildToolsVersion) + .forVariantType(VariantType.LIBRARY) + .add("link") + .add("--manifest", resources.getManifest()) + .add("--no-static-lib-packages") + .whenVersionIsAtLeast(new Revision(23)) + .thenAdd("--no-version-vectors") + // only link against jars + .addRepeated( + "-I", + pathsToLinkAgainst.stream().filter(s -> s.endsWith(".jar")).collect(toList())) + .add("-R", outPath) + // only include non-jars + .addRepeated( + "-R", + pathsToLinkAgainst.stream().filter(s -> !s.endsWith(".jar")).collect(toList())) + .add("--auto-add-overlay") + .add("-o", outPath.resolveSibling("transitive.apk")) + .add("--java", javaSourceDirectory) + .add("--output-text-symbols", rTxt) + .execute(String.format("Generating R files %s", resources))); + profiler.recordEndOf("rfix"); + } + + profiler.startTask("sourcejar"); AndroidResourceOutputs.createSrcJar(javaSourceDirectory, sourceJar, true /* staticIds */); profiler.recordEndOf("sourcejar"); return StaticLibrary.from(outPath, rTxt, ImmutableList.of(), sourceJar); @@ -177,13 +216,14 @@ public class ResourceLinker { .when(densities.size() == 1) .thenAddRepeated("--preferred-density", densities) .add("--stable-ids", compiled.getStableIds()) - .addRepeated("-A", - assetDirs.stream().map(Path::toString).collect(Collectors.toList())) + .addRepeated("-A", assetDirs.stream().map(Path::toString).collect(toList())) .addRepeated("-I", StaticLibrary.toPathStrings(linkAgainst)) - .addRepeated("-R", - include.stream() + .addRepeated( + "-R", + include + .stream() .map(compiledResources -> compiledResources.getZip().toString()) - .collect(Collectors.toList())) + .collect(toList())) .add("-R", compiled.getZip()) // Never compress apks. .add("-0", "apk") -- cgit v1.2.3