android multidex异步加载

本文探讨了Android应用因方法数超过65536限制而引入的Multidex问题,以及由此带来的挑战,如安装时的ANR风险。作者分析了官方Multidex解决方案的限制,并提出异步加载Multidex的概念,以减少启动时的ANR风险。通过研究Gradle构建过程,作者解析了Multidex的生成步骤,并提供了基于Gradle构建的异步加载实现思路,涉及关键任务如collectReleaseMultiDexComponents、packageAllReleaseClassesForMultiDex等。文章还提到了依赖分析的关键作用,以及如何通过自定义dx.jar实现按需生成main dex。最后,作者分享了代码实现链接,并提醒注意一些实施异步加载时需考虑的问题。
摘要由CSDN通过智能技术生成

文章写了很久很久,今天再次看到一个相关的项目的Android-Easy-MultiDex,那么我也把自己的方案分享一下,代码地址在文末

技术交流可加 QQ : 1831594078


Multidex背景

官方文档已经对这个做了比较详述的说明。
简单总结就是:早期dex执行文件的方法数限制在65536范围之内,如果超出这个限制,构建就会失败

然而,为什么会构建失败,这个65536限制究竟是在哪里?既然dex文件构建失败,首先想到肯定就是去dx.jar找原因。
构建失败一般会有以下的日志:

UNEXPECTED TOP-LEVEL EXCEPTION: java.lang.IllegalArgumentException: method ID not in [0, 0xffff]: 65536 
    at com.android.dx.merge.DexMerger$6.updateIndex(DexMerger.java:501) 
    at com.android.dx.merge.DexMerger$IdMerger.mergeSorted(DexMerger.java:276) 
    at com.android.dx.merge.DexMerger.mergeMethodIds(DexMerger.java:490) 
    at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:167) 
    at com.android.dx.merge.DexMerger.merge(DexMerger.java:188) 
    at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:439) 
    at com.android.dx.command.dexer.Main.runMonoDex(Main.java:287) 
    at com.android.dx.command.dexer.Main.run(Main.java:230) 
    at com.android.dx.command.dexer.Main.main(Main.java:199) 
    at com.android.dx.command.Main.main(Main.java:103):Derp:dexDerpDebug FAILED

那么就去搜索“method ID not in”和根据错误信息提示的堆栈,果然在DexMerger的方法:
mergeMethodIds

中搜索到这段。然后顺藤摸瓜,找到调用栈:

调用栈

最后红框的就是dx.jar的入口main函数,而且也和错误日志是一致的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值