Android 打包 65535是什么

本文讲述了Android应用中的65535方法限制,介绍了如何通过启用MultiDex、优化代码和依赖、以及处理兼容性问题来避免这一限制。同时讨论了MultiDex启用后带来的影响,如构建时间增加、运行时性能和安装时间的变化。
摘要由CSDN通过智能技术生成

在 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.

为了解决这个问题,您可以使用如下方法:

  1. 启用 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}
  2. 优化您的代码和依赖项: 为了避免方法数过多,您可以仔细查看并移除不必要的库依赖项,或使用 ProGuard(或 R8,它是 ProGuard 的继任者)来压缩和优化您的代码,移除未使用的方法和类。
  3. 使用库的某些模块: 如果您使用的是大型库,很多库都支持按需添加模块。这样做可以减少您的应用中不必要的方法数,因为您只添加了实际需要的模块。
    当您的应用超过了 65K 方法限制时,这些步骤可以帮助您绕过这个问题,允许您的应用正常构建和运行。

使用multiDexEnabled带来的问题

启用 multiDexEnabled 以允许应用程序使用多个 DEX 文件会带来一些影响,这些影响主要关乎应用程序的构建时间、运行时性能以及兼容性问题。

  1. 构建时间增加: 使用 MultiDex 会使构建过程更复杂,因为构建工具需要确定如何将方法分配到主 DEX 文件和附加 DEX 文件中。这可能导致增加构建时间。
  2. 运行时启动时间增加: 在运行时,如果你的 minSdkVersion 小于 21 (Android 5.0 Lollipop),应用程序在首次启动时需要额外时间来加载多个 DEX 文件。加载多个 DEX 文件可能会导致应用的启动时间变长,尤其是在旧设备上。
  3. 运行时性能: 由于应用程序需要管理更多的 DEX 文件,这可能对运行时性能有轻微影响,尽管在现代设备上这通常是可以忽略不计的。在 Android 5.0 及更高版本的 ART (Android Runtime) 中,由于对 MultiDex 的原生支持,这种性能影响通常可以忽略。
  4. 应用体积可能增加: 多个 DEX 文件可能会使 APK 体积稍微增大,因为 DEX 文件中可能会有一些重复的元数据信息。
  5. 兼容性: 对于旧版本的 Android (低于 5.0),需要使用 MultiDex 支持库来确保多个 DEX 文件可以被正确加载。这需要在你的应用中正确设置 MultiDex,并确保在应用的 Application 类中正确处理。
  6. 测试复杂性增加: 由于应用程序包含多个 DEX 文件,测试时需要确保所有类和资源在运行时都能够正确加载。
  7. 运行时的依赖加载问题: 在某些情况下,如果类加载顺序不当,可能会导致 java.lang.NoClassDefFoundError 或 ClassNotFoundException。为了避免这些问题,应该确保运行时必须的类都位于主 DEX 文件中。
  8. 应用程序安装时间: 在 Android 5.0 之前的版本中,由于设备上需要进行更多的处理来优化和编译 DEX 文件,因此应用程序的安装时间可能会更长。
    在 Android 5.0 及以上版本,多 DEX 文件是被原生支持的,因此除了构建时间和 APK 体积外,MultiDex 的影响应该相对较小。不过,在低于 Android 5.0 的版本中,由于需要 MultiDex 支持库和额外的启动时间,可能会对应用性能产生一些影响。在目前,鉴于 Android 5.0 以下版本的市场份额已经相当低,多数情况下,这些影响不会成为主要问题。
  • 14
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值