aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/tools/android
diff options
context:
space:
mode:
authorGravatar dannark <dannark@google.com>2017-10-18 12:58:15 -0400
committerGravatar John Cater <jcater@google.com>2017-10-18 13:34:50 -0400
commitb34bd075d6dcb1f0b6bab27778fa40471a25247f (patch)
tree41324fbaabc955d870736e354fb80eb3f6b12465 /src/tools/android
parent02605ddd85daa451a5d43b4b1b0da18ed7433f39 (diff)
Add directory entries to the resource_files.zip because robolectric relies on this to properly index the merged resources and assets.
RELNOTES:None PiperOrigin-RevId: 172615228
Diffstat (limited to 'src/tools/android')
-rw-r--r--src/tools/android/java/com/google/devtools/build/android/AndroidResourceOutputs.java41
-rw-r--r--src/tools/android/java/com/google/devtools/build/android/AndroidResourceValidatorAction.java5
-rw-r--r--src/tools/android/java/com/google/devtools/build/android/ResourcesZip.java8
3 files changed, 44 insertions, 10 deletions
diff --git a/src/tools/android/java/com/google/devtools/build/android/AndroidResourceOutputs.java b/src/tools/android/java/com/google/devtools/build/android/AndroidResourceOutputs.java
index d6558ed437..82001c6065 100644
--- a/src/tools/android/java/com/google/devtools/build/android/AndroidResourceOutputs.java
+++ b/src/tools/android/java/com/google/devtools/build/android/AndroidResourceOutputs.java
@@ -132,7 +132,7 @@ public class AndroidResourceOutputs {
}
@Override
- protected void writeFileEntry(Path file) throws IOException {
+ protected void writeEntry(Path file) throws IOException {
Path filename = file.getFileName();
String name = filename.toString();
if (name.endsWith(".class")) {
@@ -192,7 +192,7 @@ public class AndroidResourceOutputs {
}
@Override
- protected void writeFileEntry(Path file) throws IOException {
+ protected void writeEntry(Path file) throws IOException {
if (file.getFileName().endsWith("R.java")) {
byte[] content = Files.readAllBytes(file);
if (staticIds) {
@@ -205,11 +205,25 @@ public class AndroidResourceOutputs {
}
}
+ /** A FileVisitor that will add all files and dirents to be stored in a zip archive. */
+ static final class ZipBuilderVisitorWithDirectories extends ZipBuilderVisitor {
+ ZipBuilderVisitorWithDirectories(ZipBuilder zipBuilder, Path root, String directory) {
+ super(zipBuilder, root, directory);
+ }
+
+ @Override
+ public FileVisitResult postVisitDirectory(Path dir, IOException exc) {
+ paths.add(dir);
+ return FileVisitResult.CONTINUE;
+ }
+
+ }
+
/** A FileVisitor that will add all files to be stored in a zip archive. */
static class ZipBuilderVisitor extends SimpleFileVisitor<Path> {
protected final String directoryPrefix;
- private final Collection<Path> paths = new ArrayList<>();
+ protected final Collection<Path> paths = new ArrayList<>();
protected final Path root;
private int storageMethod = ZipEntry.STORED;
private ZipBuilder zipBuilder;
@@ -225,6 +239,15 @@ public class AndroidResourceOutputs {
zipBuilder.addEntry(directoryPrefix + root.relativize(file), content, storageMethod);
}
+ protected void addDirEntry(Path file) throws IOException {
+ Preconditions.checkArgument(file.startsWith(root), "%s does not start with %s", file, root);
+ String entryName = directoryPrefix + root.relativize(file);
+ if (!entryName.endsWith("/")) {
+ entryName += "/";
+ }
+ zipBuilder.addEntry(entryName, new byte[0], storageMethod);
+ }
+
public void setCompress(boolean compress) {
storageMethod = compress ? ZipEntry.DEFLATED : ZipEntry.STORED;
}
@@ -242,13 +265,17 @@ public class AndroidResourceOutputs {
*/
void writeEntries() throws IOException {
for (Path path : Ordering.natural().immutableSortedCopy(paths)) {
- writeFileEntry(path);
+ writeEntry(path);
}
}
- protected void writeFileEntry(Path file) throws IOException {
- byte[] content = Files.readAllBytes(file);
- addEntry(file, content);
+ protected void writeEntry(Path file) throws IOException {
+ if (Files.isDirectory(file)) {
+ addDirEntry(file);
+ } else {
+ byte[] content = Files.readAllBytes(file);
+ addEntry(file, content);
+ }
}
}
diff --git a/src/tools/android/java/com/google/devtools/build/android/AndroidResourceValidatorAction.java b/src/tools/android/java/com/google/devtools/build/android/AndroidResourceValidatorAction.java
index 93a940a562..d23b7b6c63 100644
--- a/src/tools/android/java/com/google/devtools/build/android/AndroidResourceValidatorAction.java
+++ b/src/tools/android/java/com/google/devtools/build/android/AndroidResourceValidatorAction.java
@@ -193,6 +193,11 @@ public class AndroidResourceValidatorAction {
ZipEntry z = zis.getNextEntry();
while (z != null) {
String entryName = z.getName();
+ // Skip directory entries
+ if (entryName.endsWith("/")) {
+ z = zis.getNextEntry();
+ continue;
+ }
Path outputPath = expandedOut.resolve(entryName);
Files.createDirectories(outputPath.getParent());
try (OutputStream out = new BufferedOutputStream(Files.newOutputStream(outputPath))) {
diff --git a/src/tools/android/java/com/google/devtools/build/android/ResourcesZip.java b/src/tools/android/java/com/google/devtools/build/android/ResourcesZip.java
index e5436ad388..edb254434c 100644
--- a/src/tools/android/java/com/google/devtools/build/android/ResourcesZip.java
+++ b/src/tools/android/java/com/google/devtools/build/android/ResourcesZip.java
@@ -19,7 +19,7 @@ import com.android.build.gradle.tasks.ResourceUsageAnalyzer;
import com.google.common.collect.ImmutableList;
import com.google.common.io.ByteStreams;
import com.google.devtools.build.android.AndroidResourceOutputs.ZipBuilder;
-import com.google.devtools.build.android.AndroidResourceOutputs.ZipBuilderVisitor;
+import com.google.devtools.build.android.AndroidResourceOutputs.ZipBuilderVisitorWithDirectories;
import com.google.devtools.build.android.aapt2.CompiledResources;
import com.google.devtools.build.android.aapt2.ResourceCompiler;
import java.io.FileOutputStream;
@@ -104,7 +104,8 @@ public class ResourcesZip {
public void writeTo(Path output, boolean compress) throws IOException {
try (final ZipBuilder zip = ZipBuilder.createFor(output)) {
if (Files.exists(resourcesRoot)) {
- ZipBuilderVisitor visitor = new ZipBuilderVisitor(zip, resourcesRoot, "res");
+ ZipBuilderVisitorWithDirectories visitor =
+ new ZipBuilderVisitorWithDirectories(zip, resourcesRoot, "res");
visitor.setCompress(compress);
Files.walkFileTree(resourcesRoot, visitor);
if (!Files.exists(resourcesRoot.resolve("values/public.xml"))) {
@@ -116,7 +117,8 @@ public class ResourcesZip {
visitor.writeEntries();
}
if (Files.exists(assetsRoot)) {
- ZipBuilderVisitor visitor = new ZipBuilderVisitor(zip, assetsRoot, "assets");
+ ZipBuilderVisitorWithDirectories visitor =
+ new ZipBuilderVisitorWithDirectories(zip, assetsRoot, "assets");
visitor.setCompress(compress);
Files.walkFileTree(assetsRoot, visitor);
visitor.writeEntries();