android - 构建Android项目时"trouble writing output: Too many field references: 70185; max is 65536. You may try using --multi-dex option."

标签 android apk android-library dex apklib

我遇到了这个错误,但没有发现错误消息,所以我想我应该分享我想出的解决方案,以免遇到问题的其他人重复我的工作。

在编写用于(大型)应用程序的新 Android 库 (apklib) 时,当我将新项目添加为依赖项时,在 dexing 期间出现以下错误:

trouble writing output: Too many field references: 70185; max is 65536.
You may try using --multi-dex option.
References by package:
<...long list of packages with field counts elided...>

它失败的特定构建步骤是:

java -jar $ANDROID_SDK/build-tools/19.0.3/lib/dx.jar --dex \
--output=$PROJECT_HOME/target/classes.dex \
<... long list of apklib and jar dependencies elided ...>

按照错误消息的建议使用 --multi-dex 可能是一个解决方案,但我不是应用程序项目的所有者,它已经有一个大型复杂的构建过程,我会无论如何都犹豫不决。

我可以使用实际上没有字段的空操作测试库项目重现此问题,但在错误输出中它被列为具有 6000 多个字段。在错误输出中列出的包中,有少数具有类似的 6k+ 字段计数,但绝大多数具有更合理的 <1k 字段计数。

这个问题类似于Facebook famously hacked their way around 的“方法太多”问题。 . FB 解决方案似乎很疯狂,我发现的唯一其他解决方案(例如 this Android bug ticketor this onethis SO answerthis other SO answer)都涉及更改主应用程序的代码,这远远超出了我的范围想做。

还有其他解决办法吗?

最佳答案

解决方案是更改 package在 AndroidManifest 中匹配主应用程序的包。

像这样的 list :

<manifest package="com.example.testlibrary" ...

导致 6k+ 字段和构建失败。更改它以匹配主应用程序的包

<manifest package="com.example.mainapplication" ...

导致项目搭建成功。

请注意,只有 list 中的包发生了变化,我没有对库的 Java 源代码或其布局进行任何更改(Java 包仍然是 com.example.teSTLibrary,目录结构与之匹配)。

我假设不同的包名称导致所有 Android 字段再次包含在该包下。包含 6k+ 字段的错误列表中的所有包的包名都与主应用程序不同。

我也(后来,grr),找到了this blog post其中详细说明了相同的问题和最终相同的解决方案。

关于android - 构建Android项目时"trouble writing output: Too many field references: 70185; max is 65536. You may try using --multi-dex option.",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23749654/

相关文章:

android - LeakCanary 不会捕获我故意添加的泄漏。我错过了什么?

android - 为 Android Studio 项目中的不同模块依赖项添加单独的 jniLibs 引用

java - 从字符串读取直到 Android 中的特定字符

android - 为什么Android允许安装证书过期的APK?

android - 如何使用 Python 代码安装 Android .APK?

java - fragment 未按预期显示/隐藏

android - 以编程方式查找 Android .apk 文件的来源?

android - 如何检测在库上暂停的 android 应用程序?

android - 重用代码 Android NDK

android - 如何获取所有设备的图像路径Uri和Crop