diff options
Diffstat (limited to 'src/tools/android')
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(); |