diff options
author | Ivan Gavrilovic <gavra@google.com> | 2017-07-13 15:09:42 +0100 |
---|---|---|
committer | Ivan Gavrilovic <gavra@google.com> | 2017-07-14 08:44:01 +0100 |
commit | 6c2225731a2b111cb48de651edda6bd3ece0f053 (patch) | |
tree | b32902e69e5d49332a54c2c97da630960ff58980 | |
parent | d6868d33a233569769fda3d8e18db42281a9528e (diff) | |
download | r8-6c2225731a2b111cb48de651edda6bd3ece0f053.tar.gz |
Output dex to directory structure instead of flat one
Test: OutputModeTest, updated D8IncrementalRunExamplesAndroidOTest
Change-Id: I7ba5c4d4b69c8097e19082728ce4d723aa98b710
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)); + } +} |