diff options
author | Stephan Herhut <herhut@google.com> | 2017-10-19 10:56:14 +0200 |
---|---|---|
committer | Stephan Herhut <herhut@google.com> | 2017-10-19 10:56:14 +0200 |
commit | 5563b3268b3988fff2f7dd4b612c814c1e6ae170 (patch) | |
tree | fc7dea96814d3c02c25990d99b063b654db2a1dd | |
parent | 80e57e9645a94900263ab8a53a482aa46ba03d08 (diff) | |
download | r8-5563b3268b3988fff2f7dd4b612c814c1e6ae170.tar.gz |
Do not resolve file names against output directory twice.
Bug:
Change-Id: Ic4abf7c53a0b0e2860685a715bafe73ef0a0ee38
8 files changed, 37 insertions, 30 deletions
diff --git a/src/main/java/com/android/tools/r8/D8.java b/src/main/java/com/android/tools/r8/D8.java index 876f68561..4806485b2 100644 --- a/src/main/java/com/android/tools/r8/D8.java +++ b/src/main/java/com/android/tools/r8/D8.java @@ -184,11 +184,12 @@ public final class D8 { .write(outputSink, executor); CompilationResult output = new CompilationResult(outputSink, app, appInfo); options.printWarnings(); - outputSink.close(); return output; } catch (ExecutionException e) { R8.unwrapExecutionException(e); throw new AssertionError(e); // unwrapping method should have thrown + } finally { + outputSink.close(); } } diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java index 0ed71b859..3d5f7d7de 100644 --- a/src/main/java/com/android/tools/r8/R8.java +++ b/src/main/java/com/android/tools/r8/R8.java @@ -350,11 +350,11 @@ public class R8 { options); options.printWarnings(); - outputSink.close(); } catch (ExecutionException e) { unwrapExecutionException(e); throw new AssertionError(e); // unwrapping method should have thrown } finally { + outputSink.close(); // Dump timings. if (options.printTimes) { timing.report(); diff --git a/src/main/java/com/android/tools/r8/utils/DirectoryOutputSink.java b/src/main/java/com/android/tools/r8/utils/DirectoryOutputSink.java index adedfde80..56e0ea149 100644 --- a/src/main/java/com/android/tools/r8/utils/DirectoryOutputSink.java +++ b/src/main/java/com/android/tools/r8/utils/DirectoryOutputSink.java @@ -35,7 +35,7 @@ public class DirectoryOutputSink extends FileSystemOutputSink { @Override public void writeDexFile(byte[] contents, Set<String> classDescriptors, int fileId) throws IOException { - Path target = outputDirectory.resolve(getOutputPath(fileId)); + Path target = outputDirectory.resolve(getOutputFileName(fileId)); Files.createDirectories(target.getParent()); writeToFile(target, null, contents); } @@ -43,7 +43,7 @@ public class DirectoryOutputSink extends FileSystemOutputSink { @Override public void writeDexFile(byte[] contents, Set<String> classDescriptors, String primaryClassName) throws IOException { - Path target = outputDirectory.resolve(getOutputPath(primaryClassName)); + Path target = outputDirectory.resolve(getOutputFileName(primaryClassName)); Files.createDirectories(target.getParent()); writeToFile(target, null, contents); } @@ -52,17 +52,4 @@ public class DirectoryOutputSink extends FileSystemOutputSink { public void close() throws IOException { // Intentionally left empty. } - - private Path getOutputPath(int index) { - String file = index == 0 ? "classes.dex" : ("classes" + (index + 1) + ".dex"); - return outputDirectory.resolve(file); - } - - private Path getOutputPath(String classDescriptor) throws IOException { - assert classDescriptor != null && DescriptorUtils.isClassDescriptor(classDescriptor); - Path result = outputDirectory - .resolve(classDescriptor.substring(1, classDescriptor.length() - 1) + ".dex"); - Files.createDirectories(result.getParent()); - return result; - } } diff --git a/src/main/java/com/android/tools/r8/utils/FileSystemOutputSink.java b/src/main/java/com/android/tools/r8/utils/FileSystemOutputSink.java index e7cfc28d7..e007147d2 100644 --- a/src/main/java/com/android/tools/r8/utils/FileSystemOutputSink.java +++ b/src/main/java/com/android/tools/r8/utils/FileSystemOutputSink.java @@ -8,7 +8,6 @@ import com.google.common.io.Closer; import java.io.IOException; import java.io.OutputStream; import java.nio.file.Path; -import java.nio.file.Paths; import java.nio.file.StandardOpenOption; public abstract class FileSystemOutputSink implements OutputSink { @@ -28,17 +27,17 @@ public abstract class FileSystemOutputSink implements OutputSink { } } - protected Path getOutputFileName(int index) { - String file = index == 0 ? "classes.dex" : ("classes" + (index + 1) + ".dex"); - return Paths.get(file); + String getOutputFileName(int index) { + return index == 0 ? "classes.dex" : ("classes" + (index + 1) + FileUtils.DEX_EXTENSION); } - protected Path getOutputFileName(String classDescriptor) throws IOException { + String getOutputFileName(String classDescriptor) throws IOException { assert classDescriptor != null && DescriptorUtils.isClassDescriptor(classDescriptor); - Path result = Paths.get(classDescriptor.substring(1, classDescriptor.length() - 1) + ".dex"); - return result; + return DescriptorUtils.getClassBinaryNameFromDescriptor(classDescriptor) + + FileUtils.DEX_EXTENSION; } + @Override public void writePrintUsedInformation(byte[] contents) throws IOException { writeToFile(options.proguardConfiguration.getPrintUsageFile(), System.out, contents); @@ -67,7 +66,9 @@ public abstract class FileSystemOutputSink implements OutputSink { closer, output, defValue, - StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING); + StandardOpenOption.CREATE, + StandardOpenOption.TRUNCATE_EXISTING, + StandardOpenOption.WRITE); outputStream.write(contents); } } diff --git a/src/main/java/com/android/tools/r8/utils/FileUtils.java b/src/main/java/com/android/tools/r8/utils/FileUtils.java index a29242311..809a6d49c 100644 --- a/src/main/java/com/android/tools/r8/utils/FileUtils.java +++ b/src/main/java/com/android/tools/r8/utils/FileUtils.java @@ -118,10 +118,10 @@ public class FileUtils { static boolean isClassesDexFile(Path file) { String name = file.getFileName().toString().toLowerCase(); - if (!name.startsWith("classes") || !name.endsWith(".dex")) { + if (!name.startsWith("classes") || !name.endsWith(DEX_EXTENSION)) { return false; } - String numeral = name.substring("classes".length(), name.length() - ".dex".length()); + String numeral = name.substring("classes".length(), name.length() - DEX_EXTENSION.length()); if (numeral.isEmpty()) { return true; } diff --git a/src/main/java/com/android/tools/r8/utils/ZipFileOutputSink.java b/src/main/java/com/android/tools/r8/utils/ZipFileOutputSink.java index 0feb485f9..d290b564f 100644 --- a/src/main/java/com/android/tools/r8/utils/ZipFileOutputSink.java +++ b/src/main/java/com/android/tools/r8/utils/ZipFileOutputSink.java @@ -39,8 +39,8 @@ public class ZipFileOutputSink extends FileSystemOutputSink { outputStream.close(); } - private synchronized void writeToZipFile(Path outputPath, byte[] content) throws IOException { - ZipEntry zipEntry = new ZipEntry(outputPath.toString()); + private synchronized void writeToZipFile(String outputPath, byte[] content) throws IOException { + ZipEntry zipEntry = new ZipEntry(outputPath); zipEntry.setSize(content.length); outputStream.putNextEntry(zipEntry); outputStream.write(content); diff --git a/src/test/java/com/android/tools/r8/D8IncrementalRunExamplesAndroidOTest.java b/src/test/java/com/android/tools/r8/D8IncrementalRunExamplesAndroidOTest.java index 546d9eb48..c8ca57e91 100644 --- a/src/test/java/com/android/tools/r8/D8IncrementalRunExamplesAndroidOTest.java +++ b/src/test/java/com/android/tools/r8/D8IncrementalRunExamplesAndroidOTest.java @@ -274,7 +274,6 @@ public abstract class D8IncrementalRunExamplesAndroidOTest D8IncrementalTestRunner test = test(testName, testPackage, mainClass); test.compileClassesTogether(inputJarFile, out); - String[] topLevelDir = out.toFile().list(); assert topLevelDir != null; assertEquals(1, topLevelDir.length); diff --git a/src/test/java/com/android/tools/r8/R8EntryPointTests.java b/src/test/java/com/android/tools/r8/R8EntryPointTests.java index e2cb5d679..5ad82de9a 100644 --- a/src/test/java/com/android/tools/r8/R8EntryPointTests.java +++ b/src/test/java/com/android/tools/r8/R8EntryPointTests.java @@ -98,6 +98,25 @@ public class R8EntryPointTests extends TestBase { } @Test + public void testMainRelativeDir() throws IOException, InterruptedException { + temp.newFolder("outdex"); + Path out = Paths.get("outdex"); + Path workingDir = temp.getRoot().toPath(); + ProcessResult r8 = ToolHelper.forkR8(workingDir, + "--lib", Paths.get(ToolHelper.getDefaultAndroidJar()).toAbsolutePath().toString(), + "--output", out.toString(), + "--pg-conf", PROGUARD_FLAGS.toAbsolutePath().toString(), + "--pg-conf", testFlags.toAbsolutePath().toString(), + INPUT_JAR.toAbsolutePath().toString()); + Assert.assertEquals(0, r8.exitCode); + Assert.assertTrue( + Files.isRegularFile(workingDir.resolve(out).resolve(ToolHelper.DEFAULT_DEX_FILENAME))); + Assert.assertTrue(Files.isRegularFile(testFlags.getParent().resolve(MAPPING))); + Assert.assertTrue(Files.isRegularFile(testFlags.getParent().resolve(SEEDS))); + } + + + @Test public void testMainZip() throws IOException, InterruptedException { Path out = temp.newFolder("outdex").toPath().resolve("dex.zip"); ProcessResult r8 = ToolHelper.forkR8(Paths.get("."), |