0
点赞
收藏
分享

微信扫一扫

Flutter导入第三方包后报错The number of method references in a .dex file cannot exceed 64K

报错

导入just_audio: ^0.9.34 后编译报错。报错内容如下:

ERROR:D8: Cannot fit requested classes in a single dex file (# methods: 71340 > 65536)
com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives: 
The number of method references in a .dex file cannot exceed 64K.

image.png

报错原因

这个错误提示意味着您的应用程序已经超过了 Android 操作系统中每个 Dex 文件的方法引用数限制(也称为 64K 方法限制)。这是由于您的应用程序中使用的库和依赖项可能包含大量的方法引用,这会导致 Dex 文件大小超过限制。

关于 64K 引用限制

Android 应用 (APK) 文件包含 Dalvik Executable (DEX) 文件形式的可执行字节码文件,这些文件包含用来运行应用的已编译代码。Dalvik Executable 规范将可在单个 DEX 文件内引用的方法总数限制为 65,536,其中包括 Android 框架方法、库方法以及您自己的代码中的方法。

规避 64K 限制

在将您的应用配置为支持使用 64K 或更多方法引用之前,请采取措施以减少应用代码调用的引用总数,包括由您的应用代码或包含的库定义的方法。

以下策略可帮助您避免达到 DEX 引用限制:

查看应用的直接和传递依赖项

考虑您在应用中包含任何庞大的库依赖项所带来的价值是否多于为应用添加大量代码所带来的弊端。一种常见的问题模式是,仅仅为了使用几个实用方法就在应用中加入非常庞大的库。减少应用代码依赖项往往能够帮助您规避 DEX 引用限制。

通过 R8 移除未使用的代码

启用代码缩减以针对发布 build 运行 R8。启用缩减有助于确保您交付的 APK 不含未使用的代码。如果代码缩减配置正确,它还可以从您的依赖项中移除未使用的代码和资源。 使用这些技巧可助您减小 APK 的总体大小并使您无需在应用中启用 MultiDex。

解决方法

Android 5.0 之前版本的 MultiDex 支持

Android 5.0(API 级别 21)之前的平台版本使用 Dalvik 运行时执行应用代码。默认情况下,Dalvik 将应用限制为每个 APK 只能使用一个 classes.dex 字节码文件。为了绕过这一限制,请向模块级 build.gradle 或 build.gradle.kts 文件中添加 MultiDex 库:

dependencies {
    def multidex_version = "2.0.1"
    implementation "androidx.multidex:multidex:$multidex_version"
}

此库会成为应用的主要 DEX 文件的一部分,然后管理对其他 DEX 文件及其所包含代码的访问。 、

  • 直到我遇到这个问题时,MultiDex 的最新版本为2.0.1*

Android 5.0 之后版本

如果您的 minSdkVersion 设为 21 或更高版本,系统会默认启用 MultiDex,并且您不需要 MultiDex 库。 所以另外一种修改方式是直接把minSdkVersion 设为 21 image.png

修改后编译,报错消失,如图 image.png

举报

相关推荐

0 条评论