aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar corysmith <corysmith@google.com>2017-10-03 20:30:45 +0200
committerGravatar Klaus Aehlig <aehlig@google.com>2017-10-06 19:43:17 +0200
commit5a03ba3eb0b76a31ce36593b31f6c70946d79797 (patch)
treeff154d1c774f96ad3d1a4136124bb9c822f1321f /src
parent014408ead21d07bfa41af88b0dba251182e56aff (diff)
Fix the R.txt to generate a transitive closure instead of the current resources.
RELNOTES: None PiperOrigin-RevId: 170886429
Diffstat (limited to 'src')
-rw-r--r--src/tools/android/java/com/google/devtools/build/android/aapt2/ResourceLinker.java68
1 files changed, 54 insertions, 14 deletions
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<Path> 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<String> compiledResourcePaths =
+ include
+ .stream()
+ .map(compiledResources -> compiledResources.getZip().toString())
+ .collect(toList());
+ final Collection<String> 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")