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的合适目录。

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

2 具体集成

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

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

2.2 配置

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

否则:

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

3 其他包冲突问题

3.1 问题描述

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

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

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分包之旅

你可能感兴趣的:(Android进阶)