首页 > 其他分享 >Flutter导入第三方包后报错The number of method references in a .dex file cannot exceed 64K

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

时间:2023-05-31 18:32:21浏览次数:49  
标签:dex DEX 代码 cannot 报错 应用 Android 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

标签:dex,DEX,代码,cannot,报错,应用,Android,64K
From: https://blog.51cto.com/u_15777557/6388888

相关文章

  • java.lang.ClassCastException: com.alibaba.fastjson2.JSONArray cannot be cast to
    是这样的,今天跟着写springboot项目的时候,前端登录的时候报403错误。检查了半天,是后端的问题报错代码: 第二句报错提示如下 说是JSONArray不能转String,但我这也不是JSONArry转String而是Object转String啊。网上搜了半天,用了好多种方法也没什么用最后索性死马当活马医,让它......
  • QA|外部调用类方法总报错missing 1 required positional argument:'self'|UI自动化
    外部调用类方法总报错missing1requiredpositionalargument:'self' 原因:实例化这个类实例化错了,少了括号()解决:改成如下就可以了 参考学习:调用类方法时报错:missing1requiredpositionalargument:'self'-hehehe_wy7-博客园(cnblogs.com) ......
  • kibana智能检索发送多次_msearch —— 配置index pattern,同时设置时间段,就知道到底是
    kibanasite/elasticsearch/log-*/_field_stats?level=indices   返回:{"_shards":{"total":600,"successful":600,"failed":0},"indices":{"log-2017.11.22-19-192.168.2.3-93004":{"fields":{"Rec......
  • [Slide] 解决Slidev export导出pdf报错
    解决Slidevexport导出pdf报错问题按照Slidev的官方文档使用导出为pdf需要安装playwright-chromium官网安装方法如下:npmi-Dplaywright-chromium在我电脑上执行安装后直接执行导出命令sudoslidevexport,显示报错如下:Slidevv0.42.1(global)theme@slidev/......
  • bitsandbytes通过源码安装后调用报错AttributeError: module 'bitsandbytes.nn' has n
    通过github下载的源码使用pipinstall-e.方式安装的时候会出现题目中的问题。这个时候先卸载掉bitsandbytes,然后重新使用pipinstallbitsandbytes安装,这种方式直接从仓库中安装,问题就解决了。目前尚不清楚问题出现原因,虽然两种方式的安装版本都是0.38.1......
  • QA|selenium在send_keys时报错dict object has no attribute ''|UI自动化测试
    Q:selenium在send_keys时报错dictobjecthasnoattribute'send_keys',如下图 增加了print(type(e1))发现确实是字典类型,怪了,按道理e1的type应该是selenium.webdriver.remote.webelement.WebElement才对,怎么会变成dict字典呢?我网上查了,按照(115条消息)Python运行selenium时......
  • 报错问题谷粒商城 Oss endpoint can‘t be empty
    报错信息:Causedby:java.lang.IllegalArgumentException:Ossendpointcan’tbeempty.网上查了一下说有两种可能第一种是springboot和springcloud版本不对应第二种错误说的是oss.yml格式错误 建议优先检查yml格式我的因为那天改配置的时候被家里猫按到了,然后没有发现,检......
  • python的peft包导入PeftModel时报importerror-cannot-import-name-unknown-location
    一般出现这种问题的原因是该版本的peft包中没有PeftModel,这种情况都需要降级。我验证了以下,我实在alpaca-lora项目中使用peft,alpaca-lora的项目大概在2个月以前更新,而peft包实在最近更新的4.0版本,而2个月以前peft还是2.0版本,所以我果断把peft降到2.0版本,然后问题就解决了。......
  • uniapp报错集合
    1、swiper组件明明按照方法写了,却不起效果?排查发现,swiper组件宽度为0,设置swiper宽度即可2、报错Cannotreadproperty'forceUpdate'ofundefined原因为未配置小程序appid3、引用组件,明明目录里面有组件却报找不到?排查发现,引用地址正常,经过编译后在小程序中锁定的地址不正常......
  • 在 Net Core 开发中如何解决 Cannot access a disposed object 这个问题
    一、简介NetCore跨平台项目开发多了,总会遇到各种各样的问题,我就遇到了一个这样的问题,不能访问Cannotaccessadisposedobject错误,经过自己多方努力,查阅资料,终于找到了解决办法,引发这个问题的原因大多数是多次读取请求Body流造成的,需要换一种获取请求Body流方法,不能使......