aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Gavrilovic <gavra@google.com>2017-07-13 15:09:42 +0100
committerIvan Gavrilovic <gavra@google.com>2017-07-14 08:44:01 +0100
commit6c2225731a2b111cb48de651edda6bd3ece0f053 (patch)
treeb32902e69e5d49332a54c2c97da630960ff58980
parentd6868d33a233569769fda3d8e18db42281a9528e (diff)
downloadr8-6c2225731a2b111cb48de651edda6bd3ece0f053.tar.gz
Output dex to directory structure instead of flat one
Test: OutputModeTest, updated D8IncrementalRunExamplesAndroidOTest Change-Id: I7ba5c4d4b69c8097e19082728ce4d723aa98b710
-rw-r--r--src/main/java/com/android/tools/r8/utils/AndroidApp.java9
-rw-r--r--src/main/java/com/android/tools/r8/utils/OutputMode.java10
-rw-r--r--src/test/java/com/android/tools/r8/D8IncrementalRunExamplesAndroidOTest.java22
-rw-r--r--src/test/java/com/android/tools/r8/utils/OutputModeTest.java34
4 files changed, 60 insertions, 15 deletions
diff --git a/src/main/java/com/android/tools/r8/utils/AndroidApp.java b/src/main/java/com/android/tools/r8/utils/AndroidApp.java
index 434545f55..7d8badabe 100644
--- a/src/main/java/com/android/tools/r8/utils/AndroidApp.java
+++ b/src/main/java/com/android/tools/r8/utils/AndroidApp.java
@@ -278,8 +278,11 @@ public class AndroidApp {
try (Closer closer = Closer.create()) {
List<Resource> dexProgramSources = getDexProgramResources();
for (int i = 0; i < dexProgramSources.size(); i++) {
- Path fileName = directory.resolve(outputMode.getFileName(dexProgramSources.get(i), i));
- Files.copy(dexProgramSources.get(i).getStream(closer), fileName, options);
+ Path filePath = directory.resolve(outputMode.getOutputPath(dexProgramSources.get(i), i));
+ if (!Files.exists(filePath.getParent())) {
+ Files.createDirectories(filePath.getParent());
+ }
+ Files.copy(dexProgramSources.get(i).getStream(closer), filePath, options);
}
}
}
@@ -333,7 +336,7 @@ public class AndroidApp {
try (ZipOutputStream out = new ZipOutputStream(Files.newOutputStream(archive, options))) {
List<Resource> dexProgramSources = getDexProgramResources();
for (int i = 0; i < dexProgramSources.size(); i++) {
- ZipEntry zipEntry = new ZipEntry(outputMode.getFileName(dexProgramSources.get(i), i));
+ ZipEntry zipEntry = new ZipEntry(outputMode.getOutputPath(dexProgramSources.get(i), i));
byte[] bytes = ByteStreams.toByteArray(dexProgramSources.get(i).getStream(closer));
zipEntry.setSize(bytes.length);
out.putNextEntry(zipEntry);
diff --git a/src/main/java/com/android/tools/r8/utils/OutputMode.java b/src/main/java/com/android/tools/r8/utils/OutputMode.java
index ce743e82e..1bdf50174 100644
--- a/src/main/java/com/android/tools/r8/utils/OutputMode.java
+++ b/src/main/java/com/android/tools/r8/utils/OutputMode.java
@@ -10,21 +10,21 @@ import java.util.Set;
public enum OutputMode {
Indexed {
@Override
- String getFileName(Resource resource, int index) {
+ String getOutputPath(Resource resource, int index) {
return index == 0 ? "classes.dex" : ("classes" + (index + 1) + ".dex");
}
},
FilePerClass {
@Override
- String getFileName(Resource resource, int index) {
+ String getOutputPath(Resource resource, int index) {
Set<String> classDescriptors = resource.getClassDescriptors();
assert classDescriptors != null;
assert classDescriptors.size() == 1;
String classDescriptor = classDescriptors.iterator().next();
- assert !classDescriptor.contains(".");
- return DescriptorUtils.descriptorToJavaType(classDescriptor) + ".dex";
+ assert DescriptorUtils.isClassDescriptor(classDescriptor);
+ return classDescriptor.substring(1, classDescriptor.length() - 1) + ".dex";
}
};
- abstract String getFileName(Resource resource, int index);
+ abstract String getOutputPath(Resource resource, int index);
}
diff --git a/src/test/java/com/android/tools/r8/D8IncrementalRunExamplesAndroidOTest.java b/src/test/java/com/android/tools/r8/D8IncrementalRunExamplesAndroidOTest.java
index db81f17a1..d8b9bbc07 100644
--- a/src/test/java/com/android/tools/r8/D8IncrementalRunExamplesAndroidOTest.java
+++ b/src/test/java/com/android/tools/r8/D8IncrementalRunExamplesAndroidOTest.java
@@ -5,6 +5,7 @@
package com.android.tools.r8;
import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
+import static org.junit.Assert.assertEquals;
import com.android.tools.r8.errors.CompilationError;
import com.android.tools.r8.errors.InternalCompilerError;
@@ -264,18 +265,25 @@ public abstract class D8IncrementalRunExamplesAndroidOTest
D8IncrementalTestRunner test = test(testName, testPackage, mainClass);
test.compileClassesTogether(inputJarFile, out);
- String[] dexFiles = out.toFile().list();
+
+ String[] topLevelDir = out.toFile().list();
+ assert topLevelDir != null;
+ assertEquals(1, topLevelDir.length);
+ assertEquals("incremental", topLevelDir[0]);
+
+ String[] dexFiles = out.resolve(topLevelDir[0]).toFile().list();
assert dexFiles != null;
Arrays.sort(dexFiles);
String[] expectedFileNames = {
- "incremental.IncrementallyCompiled$A$AB.dex",
- "incremental.IncrementallyCompiled$A.dex",
- "incremental.IncrementallyCompiled$B$BA.dex",
- "incremental.IncrementallyCompiled$B.dex",
- "incremental.IncrementallyCompiled$C.dex",
- "incremental.IncrementallyCompiled.dex"
+ "IncrementallyCompiled$A$AB.dex",
+ "IncrementallyCompiled$A.dex",
+ "IncrementallyCompiled$B$BA.dex",
+ "IncrementallyCompiled$B.dex",
+ "IncrementallyCompiled$C.dex",
+ "IncrementallyCompiled.dex"
};
+ Arrays.sort(expectedFileNames);
Assert.assertArrayEquals(expectedFileNames, dexFiles);
}
diff --git a/src/test/java/com/android/tools/r8/utils/OutputModeTest.java b/src/test/java/com/android/tools/r8/utils/OutputModeTest.java
new file mode 100644
index 000000000..5929b6073
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/utils/OutputModeTest.java
@@ -0,0 +1,34 @@
+// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8.utils;
+
+import static org.junit.Assert.assertEquals;
+
+import com.android.tools.r8.Resource;
+import java.util.Collections;
+import org.junit.Test;
+
+public class OutputModeTest {
+ @Test
+ public void testIndexedFileName() {
+ assertEquals("classes.dex", OutputMode.Indexed.getOutputPath(null, 0));
+ assertEquals("classes2.dex", OutputMode.Indexed.getOutputPath(null, 1));
+ }
+
+ @Test
+ public void testFilePerClass() {
+ Resource test =
+ Resource.fromBytes(Resource.Kind.CLASSFILE, new byte[]{}, Collections.singleton("LTest;"));
+ assertEquals("Test.dex", OutputMode.FilePerClass.getOutputPath(test, 0));
+ Resource comTest =
+ Resource.fromBytes(
+ Resource.Kind.CLASSFILE, new byte[]{}, Collections.singleton("Lcom/Test;"));
+ assertEquals("com/Test.dex", OutputMode.FilePerClass.getOutputPath(comTest, 0));
+ Resource comExampleTest =
+ Resource.fromBytes(
+ Resource.Kind.CLASSFILE, new byte[]{}, Collections.singleton("Lcom/example/Test;"));
+ assertEquals("com/example/Test.dex", OutputMode.FilePerClass.getOutputPath(comExampleTest, 0));
+ assertEquals("com/example/Test.dex", OutputMode.FilePerClass.getOutputPath(comExampleTest, 1));
+ }
+}