java Android:巨型模式与 Multidex

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/30495212/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-02 17:13:05  来源:igfitidea点击:

Android: Jumbo Mode vs Multidex

javaandroidgradledex

提问by Ivan Thai

I'm not totally sure what the difference is between setting dex option "jumbomode" to true vs adding multidex support.

我不完全确定将 dex 选项“jumbomode”设置为 true 与添加 multidex 支持之间有什么区别。

Setting jumbo mode to true or multidex to true seems to fix the problem below

将巨型模式设置为 true 或 multidex 设置为 true 似乎可以解决以下问题

AGPBI: {"kind":"SIMPLE","text":"UNEXPECTED TOP-LEVEL EXCEPTION:","position":{},"original":"UNEXPECTED TOP-LEVEL EXCEPTION:"}
AGPBI: {"kind":"SIMPLE","text":"com.android.dex.DexIndexOverflowException: Cannot merge new index 65772 into a non-jumbo instruction!","position":{},"original":"com.android.dex.DexIndexOverflowException: Cannot merge new index 65772 into a non-jumbo instruction!"}
AGPBI: {"kind":"SIMPLE","text":"\tat com.android.dx.merge.InstructionTransformer.jumboCheck(InstructionTransformer.java:109)","position":{},"original":"\tat com.android.dx.merge.InstructionTransformer.jumboCheck(InstructionTransformer.java:109)"}
AGPBI: {"kind":"SIMPLE","text":"\tat com.android.dx.merge.InstructionTransformer.access0(InstructionTransformer.java:26)","position":{},"original":"\tat com.android.dx.merge.InstructionTransformer.access0(InstructionTransformer.java:26)"}
AGPBI: {"kind":"SIMPLE","text":"\tat com.android.dx.merge.InstructionTransformer$StringVisitor.visit(InstructionTransformer.java:72)","position":{},"original":"\tat com.android.dx.merge.InstructionTransformer$StringVisitor.visit(InstructionTransformer.java:72)"}
AGPBI: {"kind":"SIMPLE","text":"\tat com.android.dx.io.CodeReader.callVisit(CodeReader.java:114)","position":{},"original":"\tat com.android.dx.io.CodeReader.callVisit(CodeReader.java:114)"}
AGPBI: {"kind":"SIMPLE","text":"\tat com.android.dx.io.CodeReader.visitAll(CodeReader.java:89)","position":{},"original":"\tat com.android.dx.io.CodeReader.visitAll(CodeReader.java:89)"}
AGPBI: {"kind":"SIMPLE","text":"\tat com.android.dx.merge.InstructionTransformer.transform(InstructionTransformer.java:49)","position":{},"original":"\tat com.android.dx.merge.InstructionTransformer.transform(InstructionTransformer.java:49)"}
...

回答by phdfong - Kenneth Fong

Jumbo Mode, when reading https://source.android.com/devices/tech/dalvik/dalvik-bytecode.html, the const-string/jumbo is the jumbo mode for string. It is about the opcode such that "op vAA, string@BBBBBBBB" versus "op vAA, string@BBBB", 32 bits versus 16 bit.

Jumbo Mode,在阅读 https://source.android.com/devices/tech/dalvik/dalvik-bytecode.html 时,const-string/jumbo 是字符串的 Jumbo 模式。它是关于操作码,例如“op vAA,string@BBBBBBBB”与“op vAA,string@BBBB”,32 位与 16 位。

Multi Dexis to allow to load classes from more than one dex file. The primary classes.dex must contain the classes necessary for calling this class methods. Secondary dex files found in the application apk will be added to the classloader after first call to MultiDex.install(Context) see https://developer.android.com/reference/android/support/multidex/MultiDex.html

Multi Dex是允许从多个 dex 文件加载类。主 classes.dex 必须包含调用此类方法所需的类。在首次调用 MultiDex.install(Context) 后,应用程序 apk 中找到的辅助 dex 文件将被添加到类加载器中,请参见https://developer.android.com/reference/android/support/multidex/MultiDex.html

回答by Sahar Weissman

take a look into this (search for jumbo):

看看这个(搜索巨型):

https://developers.soundcloud.com/blog/congratulations-you-have-a-lot-of-code-remedying-androids-method-limit-part-1

https://developers.soundcloud.com/blog/congratulations-you-have-a-lot-of-code-remedying-androids-method-limit-part-1

in short: - similar to Android Method count limit (64K) - there's a limit on string count (64K) - to overcome this limit - jumbo mode enables referencing more than 2^16 strings by using special opCode that enables encoding up to 2^32 strings.

简而言之: - 类似于 Android 方法计数限制 (64K) - 字符串计数有限制 (64K) - 为了克服这个限制 - 巨型模式可以通过使用特殊的 opCode 来引用超过 2^16 个字符串,该操作码可以编码高达 2^ 32 弦。

in practice: - from my experience both (MultiDex & JumboMode) have major impact on apk installation time (much slower).

在实践中: - 根据我的经验(MultiDex 和 JumboMode)对 apk 安装时间有重大影响(慢得多)。

hope this helps:)

希望这可以帮助:)