安卓:Jumbo模式 vs Multidex

25

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

将jumbo模式设置为true或启用multidex似乎可以解决下面的问题。

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.access$800(InstructionTransformer.java:26)","position":{},"original":"\tat com.android.dx.merge.InstructionTransformer.access$800(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)"}
...

2
可能是[DexIndexOverflowException: Cannot merge new index 65772 into a non-jumbo instruction!: Jumbo Mode? and/or Multi-Dex? What is behind the scene?]的重复问题(https://dev59.com/ZV0a5IYBdhLWcg3wRW6V)。 - gak
2个回答

30

Jumbo Mode,在阅读https://source.android.com/devices/tech/dalvik/dalvik-bytecode.html时,const-string/jumbo是针对字符串的巨型模式。指令操作码为"op vAA, string@BBBBBBBB"和"op vAA, string@BBBB",分别使用32位和16位。

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


8

看一下这个(搜索jumbo):

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

简而言之: - 类似于 Android 方法计数限制(64K)- 字符串计数也有限制(64K) - 为了克服这个限制 - jumbo 模式通过使用特殊的操作码,使编码多达 2^32 个字符串,从而能够引用超过 2^16 个字符串。
在实践中: - 根据我的经验,MultiDex 和 JumboMode 都会对 apk 安装时间产生重大影响(更慢)。
希望这可以帮到你 :)

你所说的“string count”是指一个字符串变量中的字符数还是所有字符串变量的总数? - Yousha Aleayoub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接