diff options
author | Yohann Roussel <yroussel@google.com> | 2015-05-12 09:42:10 +0200 |
---|---|---|
committer | Yohann Roussel <yroussel@google.com> | 2015-05-18 14:02:10 +0200 |
commit | beab6998369a309f8f078f6d1c2a27565bb67cfa (patch) | |
tree | 77fb25a7fc6571a4a55a7a033dc900933ba521ea /jack/src | |
parent | a18689e31b6c26e62a457f9976de4d72a6ba197c (diff) | |
download | toolchain_jack-beab6998369a309f8f078f6d1c2a27565bb67cfa.zip toolchain_jack-beab6998369a309f8f078f6d1c2a27565bb67cfa.tar.gz toolchain_jack-beab6998369a309f8f078f6d1c2a27565bb67cfa.tar.bz2 |
Make multidex type partition determinist
By sorting types by name before filling the output dex files.
Bug: 19505195
Change-Id: Ib7c11bc2b072c422e40188cfce7502e7f23679c8
Diffstat (limited to 'jack/src')
-rw-r--r-- | jack/src/com/android/jack/backend/dex/DexWritingTool.java | 33 |
1 files changed, 27 insertions, 6 deletions
diff --git a/jack/src/com/android/jack/backend/dex/DexWritingTool.java b/jack/src/com/android/jack/backend/dex/DexWritingTool.java index 366ae3a..aa08a73 100644 --- a/jack/src/com/android/jack/backend/dex/DexWritingTool.java +++ b/jack/src/com/android/jack/backend/dex/DexWritingTool.java @@ -23,6 +23,7 @@ import com.android.jack.dx.dex.file.DexFile; import com.android.jack.dx.io.DexBuffer; import com.android.jack.ir.ast.JDefinedClassOrInterface; import com.android.jack.ir.formatter.BinaryQualifiedNameFormatter; +import com.android.jack.ir.formatter.TypePackageAndMethodFormatter; import com.android.jack.ir.formatter.UserFriendlyFormatter; import com.android.jack.library.FileType; import com.android.jack.library.FileTypeDoesNotExistException; @@ -45,6 +46,10 @@ import com.android.sched.vfs.VPath; import java.io.BufferedOutputStream; import java.io.IOException; import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; import java.util.List; import java.util.logging.Logger; @@ -57,6 +62,9 @@ import javax.annotation.Nonnull; public abstract class DexWritingTool { @Nonnull + private static final TypePackageAndMethodFormatter FORMATTER = Jack.getLookupFormatter(); + + @Nonnull private static Logger logger = LoggerFactory.getLogger(); @Nonnull @@ -117,13 +125,26 @@ public abstract class DexWritingTool { protected void fillDexLists(@Nonnull List<InputVFile> mainDexList, @Nonnull List<InputVFile> anyDexList) { final OutputJackLibrary jackOutputLibrary = Jack.getSession().getJackOutputLibrary(); + Collection<JDefinedClassOrInterface> typesToEmit = Jack.getSession().getTypesToEmit(); - for (JDefinedClassOrInterface type : Jack.getSession().getTypesToEmit()) { - if (type.containsMarker(MainDexMarker.class)) { - mainDexList.add(getDexInputVFileOfType(jackOutputLibrary, type)); - } else { - anyDexList.add(getDexInputVFileOfType(jackOutputLibrary, type)); - } + List<JDefinedClassOrInterface> anyTypeList = new ArrayList<JDefinedClassOrInterface>( + typesToEmit.size()); + + for (JDefinedClassOrInterface type : typesToEmit) { + if (type.containsMarker(MainDexMarker.class)) { + mainDexList.add(getDexInputVFileOfType(jackOutputLibrary, type)); + } else { + anyTypeList.add(type); + } + } + Collections.sort(anyTypeList, new Comparator<JDefinedClassOrInterface>() { + @Override + public int compare(@Nonnull JDefinedClassOrInterface first, + @Nonnull JDefinedClassOrInterface second) { + return FORMATTER.getName(first).compareTo(FORMATTER.getName(second)); + }}); + for (JDefinedClassOrInterface type : anyTypeList) { + anyDexList.add(getDexInputVFileOfType(jackOutputLibrary, type)); } } |