diff options
author | Ivan Gavrilovic <gavra@google.com> | 2017-07-14 09:25:44 +0100 |
---|---|---|
committer | Ivan Gavrilovic <gavra@google.com> | 2017-07-14 09:51:24 +0100 |
commit | 02cc4ebce7deb01a5509624f70e7d667d5f4e2c8 (patch) | |
tree | 12138df73467b1f4d8f1a7ab98e9994e21f525bc | |
parent | 6c2225731a2b111cb48de651edda6bd3ece0f053 (diff) | |
download | r8-02cc4ebce7deb01a5509624f70e7d667d5f4e2c8.tar.gz |
Fix max number of entries in single dex
Maximum allowed number of entries is 64k,
so any index from 0 to 0xFFFF is allowed.
Test: CompatDxTests
Change-Id: If851db78416ed8caccfdf3eedae4427a861b7e67
3 files changed, 15 insertions, 3 deletions
diff --git a/src/main/java/com/android/tools/r8/dex/VirtualFile.java b/src/main/java/com/android/tools/r8/dex/VirtualFile.java index 0e89d4a10..f336a3d2d 100644 --- a/src/main/java/com/android/tools/r8/dex/VirtualFile.java +++ b/src/main/java/com/android/tools/r8/dex/VirtualFile.java @@ -67,7 +67,7 @@ public class VirtualFile { // TODO(sgjesse): Does "minimal main dex" combined with "leave space for growth" make sense? } - private static final int MAX_ENTRIES = (Short.MAX_VALUE << 1) + 1; + private static final int MAX_ENTRIES = Constants.U16BIT_MAX + 1; /** * When distributing classes across files we aim to leave some space. The amount of space left is * driven by this constant. diff --git a/src/main/java/com/android/tools/r8/graph/ObjectToOffsetMapping.java b/src/main/java/com/android/tools/r8/graph/ObjectToOffsetMapping.java index 7dab70aff..74a08003e 100644 --- a/src/main/java/com/android/tools/r8/graph/ObjectToOffsetMapping.java +++ b/src/main/java/com/android/tools/r8/graph/ObjectToOffsetMapping.java @@ -88,7 +88,7 @@ public class ObjectToOffsetMapping { private void setIndexes(IndexedDexItem[] items) { int index = 0; for (IndexedDexItem item : items) { - item.assignVirtualFileIndex(virtualFileId, index++); + item.assignVirtualFileIndex(virtualFileId, index); // For strings collect the first jumbo string (if any). if (index > Constants.MAX_NON_JUMBO_INDEX) { assert item instanceof DexString; @@ -96,6 +96,7 @@ public class ObjectToOffsetMapping { firstJumboString = (DexString) item; } } + index++; } } diff --git a/src/test/java/com/android/tools/r8/compatdx/CompatDxTests.java b/src/test/java/com/android/tools/r8/compatdx/CompatDxTests.java index b3d31c54c..5af5c0c1d 100644 --- a/src/test/java/com/android/tools/r8/compatdx/CompatDxTests.java +++ b/src/test/java/com/android/tools/r8/compatdx/CompatDxTests.java @@ -100,10 +100,21 @@ public class CompatDxTests { } @Test + public void singleDexProgramFull() throws IOException, ExecutionException { + // Generate an application that fills the whole dex file. + AndroidApp generated = + MainDexListTests.generateApplication( + ImmutableList.of("A"), Constants.ANDROID_L_API, Constants.U16BIT_MAX + 1); + Path applicationJar = temp.newFile("application.jar").toPath(); + generated.write(applicationJar, OutputMode.Indexed); + runDexer(applicationJar.toString()); + } + + @Test public void singleDexProgramIsTooLarge() throws IOException, ExecutionException { // Generate an application that will not fit into a single dex file. AndroidApp generated = MainDexListTests.generateApplication( - ImmutableList.of("A", "B"), Constants.ANDROID_L_API, Constants.U16BIT_MAX / 2 + 1); + ImmutableList.of("A", "B"), Constants.ANDROID_L_API, Constants.U16BIT_MAX / 2 + 2); Path applicationJar = temp.newFile("application.jar").toPath(); generated.write(applicationJar, OutputMode.Indexed); thrown.expect(CompilationError.class); |