安卓报错“无法将请求的类放入单个dex文件中”

95

今天早上我不知道为什么无法在手机上启动我的应用程序。我收到以下错误消息:

无法将请求的类适配到单个dex文件中,请尝试提供主dex列表。

# 方法数:68061 > 65536 Message{kind=ERROR, text=无法将请求的类适配到单个dex文件中,请尝试提供主dex列表。

# 方法数:68061 > 65536,来源=[未知源文件],工具

我对Android很陌生,不明白问题出在哪里以及我需要做什么?为什么我现在才遇到这个问题而之前没有遇到呢?

8个回答

280

12
有人想知道要更新哪个build.gradle文件,请更新以下文件android/app/build.gradle - Joel Jerushan
一个重要的细节。在我的应用的“build.gradle”中将com.google.android.gms: play-services-ads从19.3.0版本更新到19.4.0版本后,出现了这个错误。我的应用有两个口味,PRO和FREE。由于com.google.android.gms: play-services-ads仅适用于FREE版本,因此您必须在“build.gradle”的“productFlavors”区域中添加“multiDexEnabled true”,而不是在gradle的“defaultConfig”中添加它。 - nnyerges
3
我加上了它但没有进行实现,结果居然可以运行! - F.Mysir
这让我想知道如果没有像StackOverflow这样的网站,我们应该怎么办?当我使用游戏攻略通关后,开始探索“为什么我不知道那个”,然后发现真的没有办法知道... 这里也是这样吗? - Dan Chase
这对我们起作用了。 - Trophy Developers

33

我使用的是RN 0.62版本,这种方法在成功构建时对我有效。

更新build.gradle文件 enter image description here

classpath('com.android.support:multidex:1.0.3')

更新defaultConfig

enter image description here

multiDexEnabled true

在进行这两个更改后,请重新启动gradle构建。


1
谢谢您,但这仅在 multiDexEnabled 为 true 时对我有效。 - anshuman burmman
1
完美的答案。没有什么比看到确切的位置需要添加的视觉效果更好了。 - ADL

16

多 dex 并不总是解决问题的方案,虽然它会生成更多的 dex 文件以适应您的方法计数,但一定要确保不要导入比所需更多的方法,因为在长期内这将使您的构建速度比以前更慢。

例如,如果您只需要使用 play 服务中的位置库,则有两个选项

第一种是实现包含位置库的整个 play-services 库

implementation 'com.google.android.gms:play-services:11.8.0'

整个库可能有超过40,000种方法(仅是估计,我不知道实际总数),接近达到65536个方法的限制。

相反,你应该只针对你将要使用的库而非整个库包进行目标定位。

在这种情况下

implementation 'com.google.android.gms:play-services-location:11.8.0'

若只有50-100个可用的方法,将会比从整个库中加载大量你永远不会使用的方法更好,特别是在构建时。

这只是一个提示,以避免出现

无法将请求的类适配至单个dex文件。

对于minSdkVersion大于Android 5.0 API 20+

Android 5.0及以上版本使用称为ART的运行时,本地支持从应用程序APK文件中加载多个dex文件。 ART在应用安装时执行预编译,扫描classes(... N).dex文件并将其编译为Android设备执行的单个.oat文件。有关Android 5.0运行时的更多信息,请参见介绍ART。

如果您的目标设备为较低版本(Android 4.1 API 16)或Android 5之前(API 20)

在Android 5.0之前的平台版本中,使用Dalvik运行时来执行应用程序代码。默认情况下,Dalvik每个APK限制为一个classes.dex字节码文件。为了绕过此限制,您可以使用multidex支持库,该库成为应用程序主DEX文件的一部分,然后管理对附加DEX文件及其包含的代码的访问。

在最后一种情况下,您需要使用multidex。


10

更新2021年Android-X和Android Studio 4.XX:

在应用程序级Build.Gradle的默认配置中添加multiDexEnabled即可。

multiDexEnabled true

参考图片如下:

enter image description here


10
在build.gradle(app)文件中: 在依赖项中添加以下内容:
 implementation 'com.android.support:multidex:1.0.3'

在defaultConfig中添加以下内容:

multiDexEnabled true

希望您能找到解决方案。


1

您可以按照以下步骤解决此问题。

步骤1:迁移到AndroidX

重构 > 迁移到AndroidX

步骤2:在build.gradle文件中添加此依赖项:

implementation 'androidx.multidex:multidex:2.0.1'

第三步:在 build.gradle 的 defaultConfig 部分添加以下内容:
multiDexEnabled true

1

Android X的推荐解决方案

为什么会出现错误?

当您的应用程序及其引用的库超过65,536个方法时,您会遇到一个构建错误,指示您的应用程序已达到Android构建架构的限制更多信息在此处

解决方案

只需在buid.gradle(Module:app)文件中添加多Dex支持库到您的依赖项即可。

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

-1

当您同时使用已弃用的npm正确的npm来达到相同的目的时,就会出现此错误。


从 package.json 中删除 - Raghuvansh mani mishra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接