Do not resolve file names against output directory twice.
Bug:
Change-Id: Ic4abf7c53a0b0e2860685a715bafe73ef0a0ee38
diff --git a/src/main/java/com/android/tools/r8/D8.java b/src/main/java/com/android/tools/r8/D8.java
index 876f685..4806485 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 @@
.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 0ed71b8..3d5f7d7 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 @@
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 adedfde..56e0ea1 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 @@
@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 @@
@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 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 e7cfc28..e007147 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 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 @@
}
}
- 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 @@
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 a292423..809a6d4 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 @@
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 0feb485..d290b56 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 @@
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 546d9eb..c8ca57e 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 @@
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 e2cb5d6..5ad82de 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 @@
}
@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("."),