在 Android 打包过程中提到的 “65535” 是指 Dex 文件中单个方法引用的上限,这通常被称为 “65K 方法限制”。在 Android 应用程序中,所有 Java/Kotlin 代码在编译后都会转换成 DEX (Dalvik Executable) 文件,这是一种特别为 Android 优化的字节码格式。Dex 文件格式具有一个限制,即它只能引用最多 65535 个方法。
方法引用包括您的应用代码以及所有依赖库中的方法。一旦您的应用(包括其所有库依赖项)超过了这个限制,您会遇到构建错误,因为 Dex 文件不能包含超过 65535 个方法。
错误通常会显示为:
com.android.dex.DexIndexOverflowException: Cannot merge new index 65799 into a non-jumbo instruction!
或者:
The number of method references in a .dex file cannot exceed 64K.
为了解决这个问题,您可以使用如下方法:
- 启用 MultiDex: 从 Android 5.0 (API 21) 开始,Android 支持在应用中使用多个 Dex 文件,这允许您突破 65K 方法限制。在 build.gradle 文件的 defaultConfig 部分启用 MultiDex:
1android {
2 defaultConfig {
3 …
4 multiDexEnabled true
5 }
6}
并在您的应用的 dependencies 块中添加 MultiDex 支持库(如果您的 minSdkVersion 小于 21):
1dependencies {
2 implementation ‘androidx.multidex:multidex:2.0.1’
3}
然后,在您的 Application 类中,需要继承 MultiDexApplication 类,或者如果您有自定义的 Application类,则需要调用 MultiDex.install(this):
1@Override
2protected void attachBaseContext(Context base) {
3 super.attachBaseContext(base);
4 MultiDex.install(this);
5} - 优化您的代码和依赖项: 为了避免方法数过多,您可以仔细查看并移除不必要的库依赖项,或使用 ProGuard(或 R8,它是 ProGuard 的继任者)来压缩和优化您的代码,移除未使用的方法和类。
- 使用库的某些模块: 如果您使用的是大型库,很多库都支持按需添加模块。这样做可以减少您的应用中不必要的方法数,因为您只添加了实际需要的模块。
当您的应用超过了 65K 方法限制时,这些步骤可以帮助您绕过这个问题,允许您的应用正常构建和运行。
使用multiDexEnabled带来的问题
启用 multiDexEnabled 以允许应用程序使用多个 DEX 文件会带来一些影响,这些影响主要关乎应用程序的构建时间、运行时性能以及兼容性问题。
- 构建时间增加: 使用 MultiDex 会使构建过程更复杂,因为构建工具需要确定如何将方法分配到主 DEX 文件和附加 DEX 文件中。这可能导致增加构建时间。
- 运行时启动时间增加: 在运行时,如果你的 minSdkVersion 小于 21 (Android 5.0 Lollipop),应用程序在首次启动时需要额外时间来加载多个 DEX 文件。加载多个 DEX 文件可能会导致应用的启动时间变长,尤其是在旧设备上。
- 运行时性能: 由于应用程序需要管理更多的 DEX 文件,这可能对运行时性能有轻微影响,尽管在现代设备上这通常是可以忽略不计的。在 Android 5.0 及更高版本的 ART (Android Runtime) 中,由于对 MultiDex 的原生支持,这种性能影响通常可以忽略。
- 应用体积可能增加: 多个 DEX 文件可能会使 APK 体积稍微增大,因为 DEX 文件中可能会有一些重复的元数据信息。
- 兼容性: 对于旧版本的 Android (低于 5.0),需要使用 MultiDex 支持库来确保多个 DEX 文件可以被正确加载。这需要在你的应用中正确设置 MultiDex,并确保在应用的 Application 类中正确处理。
- 测试复杂性增加: 由于应用程序包含多个 DEX 文件,测试时需要确保所有类和资源在运行时都能够正确加载。
- 运行时的依赖加载问题: 在某些情况下,如果类加载顺序不当,可能会导致 java.lang.NoClassDefFoundError 或 ClassNotFoundException。为了避免这些问题,应该确保运行时必须的类都位于主 DEX 文件中。
- 应用程序安装时间: 在 Android 5.0 之前的版本中,由于设备上需要进行更多的处理来优化和编译 DEX 文件,因此应用程序的安装时间可能会更长。
在 Android 5.0 及以上版本,多 DEX 文件是被原生支持的,因此除了构建时间和 APK 体积外,MultiDex 的影响应该相对较小。不过,在低于 Android 5.0 的版本中,由于需要 MultiDex 支持库和额外的启动时间,可能会对应用性能产生一些影响。在目前,鉴于 Android 5.0 以下版本的市场份额已经相当低,多数情况下,这些影响不会成为主要问题。