安卓APP完整开发流程(7/12)多Dex支持

牛客高级系列专栏:

安卓

嵌入式

本人是2020年毕业于广东工业大学研究生:许乔丹,有国内大厂CVTE和世界500强企业安卓开发经验,网上安卓资料千千万,笔者将继续维护专栏,一杯奶茶价格不止提供答案解析,承诺提供专栏内容免费技术答疑,直接咨询即可。助您快速掌握安卓App完整开发流程!

正文开始⬇

首先,先说明结论。如果所支持的minSdkVersion大于21(Android5.0版本),那么只要在build.gradle里加多一句:

defaultConfig {
        multiDexEnabled true
    }

就可以支持Dex了。甚至在比较新的grable编译版本,都不需要手动开启multiDexEnabled 选项,而是默认就是开启的。然而,为了让自己研发的APP能有更多的受众,minSdkVersion目前几年还会设置到21以下(设置越低,代表市面上更多手机可以使用你的APP,当然再过几年估计就很少见到21以下的了),所以还是介绍一下前因后果吧。

1、Dex文件

Android DEX(Dalvik EXecutable)文件是 Android 平台上的一种可执行文件格式,可以理解为Windows系统中的exe文件。用于存储 Android 应用程序的字节码。在开发 Android 应用时,Java 代码和Kotlin代码都会被编译成字节码,再打包成 APK 文件时,字节码文件会被转换成 DEX 文件,并在 Android 设备上运行,以达到优化存储和执行效率的目的。如下图所示:

alt

2、单Dex报错及其原理

在minSdkVersion 小于21,也就是Android5.0版本,原生编译流程默认只会生成一个Dex文件,可能会遇到如下报错:

Cannot fit requested classes in a single dex file

翻译过来就是:"无法把指定的类放到一个dex文件中:方法数量超过65536"。这是因为一个Dex可以包含多个类,多个方法,这些方法包括工程所依赖的第三方库的方法和我们自己写的方法,所有的方法会使用一个方法ID,这个方法ID是c语言里的无符号 short 类型,其最大值是 2^16 - 1,即 65535。这是因为 short 类型占用 2 个字节,一共有 16 个比特位,最大值即为所有比特位均为 1 时的值,即 1111111111111111(二进制),转为十进制即为 65535。这就限制了一个Dex文件里面最多有65535个方法。

alt

3、如何避免65535错误

为了减少方法都数量,我们可以尝试删除多余代码,将功能相近的方法合并,使用混淆机制会自动优化删除一部分代码。但是这些都治根不治本。需要强调,这65535个方法的限制是包括工程中引用的第三方库的方法数,而不是想着自己一定写不到65535个方法。

为了处理这个问题,Google官方推出了多Dex文件支持库:MultiDex,支持在应用程序中使用多个Dex。

3.1 minSdkVersion < 21的用法

首先在build.gradle文件添加:

android {
    defaultConfig {
        ...
        minSdkVersion 14
        targetSdkVersion 28
        multiDexEnabled true
    } 
}
dependencies {
    implementation 'androidx.multidex:multidex:2.0.0'
}

这里做了两件事:

  • 开启 multiDexEnabled 选项
  • 添加相应的依赖库 'androidx.multidex:multidex:2.0.0'

需要说明一下,上述2个设置如果是在根 build.gradle 文件中设置,则适用于所有项目和所有模块;如果只在 app 模块的 build.gradle 文件中设置,则只对该 app 模块有效:

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

安卓APP完整开发流程 文章被收录于专栏

要成为一名高级安卓APP开发工程师,只有对安卓APP完整开发流程有全面性的了解,才能在技术、产品、市场这三大模块,帮助团队找到更优的解决方案。 本专栏详细介绍安卓APP完整开发流程:配置环境--》创建工程--》工程配置--》编写代码--》引用第三方库--》多项目构建--》多Dex支持--》代码混淆--》签名/打包--》构建定制--》多渠道打包--》线上运维。 安卓系统工程师也可以参考~

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务