Android进阶之使用multidex(产生多个dex)解决Dex超出方法数65535的限制

1 概述

1.1 为什么要拆包

随着应用不断迭代,业务线的扩展,应用越来越大(比如集成了各种第三方sdk或者公共支持的jar包,项目耦合性高,重复作用的类越来越多),出现了一个 dex 包装不下的情况,出现65536问题。

1.2 为什么方法数不能超过65535

在Dalvik指令集里,调用方法的invoke-kind指令中,method reference index只给了16bits,最多能调用65535个方法,所以在生成dex文件的过程中,当方法数超过65535就会报错。细看指令集,除了method,field和class的index也是16bits,所以也存在65535的问题。

1.3 MultiDex实现原理

Apk在运行的时候,有一个dexpathlist,而Multidex的源码中,会根据你的系统版本号对dexpathlist做修改,将所有的dex都添加到dexpathlist中。

1.4 dex拆分步骤分为:

(1)自动扫描整个工程代码得到main-dex-list;
(2)根据main-dex-list对整个工程编译后的所有class进行拆分,将主、从dex的class文件分开;
(3)用dx工具对主、从dex的class文件分别打包成 .dex文件,并放在apk的合适目录。

这里写图片描述

2 具体集成

2.1 将如下配置加入工程 build.gradle中

这里写图片描述

2.2 配置

这里写图片描述

否则:

这里写图片描述

3 其他包冲突问题

3.1 问题描述

Gradle build error, Error:Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'

这里写图片描述

3.2 解决

This is what worked for me, added it into build.gradle:

android {
        packagingOptions {
            exclude 'META-INF/DEPENDENCIES.txt'
            exclude 'META-INF/NOTICE'
            exclude 'META-INF/NOTICE.txt'
            exclude 'META-INF/LICENSE'
            exclude 'META-INF/LICENSE.txt'
        }
    }

4 参考链接

Android中的dex分包

Android为什么方法数不能超过65535

Android Dex分包之旅

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值