【问题标题】:Android: Jumbo Mode vs MultidexAndroid:巨型模式与 Multidex
【发布时间】:2015-05-28 00:17:15
【问题描述】:

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

将 jumbo 模式设置为 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.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)"}
...

【问题讨论】:

标签: java android gradle dex


【解决方案1】:

巨型模式,阅读时 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 必须包含调用此类方法所需的类。在第一次调用 MultiDex.install(Context) 后,在应用程序 apk 中找到的辅助 dex 文件将被添加到类加载器中 见https://developer.android.com/reference/android/support/multidex/MultiDex.html

【讨论】:

    【解决方案2】:

    看看这个(搜索 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 是指一个字符串变量中的字符数还是字符串变量的总数?
    猜你喜欢
    • 2018-03-25
    • 1970-01-01
    • 2017-11-12
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多