aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephan Herhut <herhut@google.com>2017-10-19 10:56:14 +0200
committerStephan Herhut <herhut@google.com>2017-10-19 10:56:14 +0200
commit5563b3268b3988fff2f7dd4b612c814c1e6ae170 (patch)
treefc7dea96814d3c02c25990d99b063b654db2a1dd
parent80e57e9645a94900263ab8a53a482aa46ba03d08 (diff)
downloadr8-5563b3268b3988fff2f7dd4b612c814c1e6ae170.tar.gz
Do not resolve file names against output directory twice.
Bug: Change-Id: Ic4abf7c53a0b0e2860685a715bafe73ef0a0ee38
-rw-r--r--src/main/java/com/android/tools/r8/D8.java3
-rw-r--r--src/main/java/com/android/tools/r8/R8.java2
-rw-r--r--src/main/java/com/android/tools/r8/utils/DirectoryOutputSink.java17
-rw-r--r--src/main/java/com/android/tools/r8/utils/FileSystemOutputSink.java17
-rw-r--r--src/main/java/com/android/tools/r8/utils/FileUtils.java4
-rw-r--r--src/main/java/com/android/tools/r8/utils/ZipFileOutputSink.java4
-rw-r--r--src/test/java/com/android/tools/r8/D8IncrementalRunExamplesAndroidOTest.java1
-rw-r--r--src/test/java/com/android/tools/r8/R8EntryPointTests.java19
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("."),