"编写输出时出现问题:字段引用太多:70185;最大值为65536.您可以尝试使用--multi-dex选项." 在构建Android项目时

bla*_*lah 7 android apk dex android-library apklib

我发现了这个错误并且没有找到错误消息的命中,所以我想我会分享我想出的解决方案来解决其他任何面临重复工作问题的人.

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

写输出有问题:字段引用太多:70185; max是65536.
您可以尝试使用--multi-dex选项.
按包引用:
<...包含字段数的包的长列表...>

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

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 ...>
Run Code Online (Sandbox Code Playgroud)

使用--multi-dex错误消息的建议可能是一个解决方案,但我不是应用程序项目的所有者,它已经有一个大型复杂的构建过程,我会毫不犹豫地改变.

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

这个问题类似于Facebook着名的"太多方法"问题.FB解决方案看起来很疯狂,我发现的唯一其他解决方案(例如,这个Android错误票,或者这个,这个SO答案,这个其他SO答案)都涉及更改主应用程序的代码,这远远超出了我想做的事.

还有其他解决方案吗?

bla*_*lah 2

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

像这样的清单:

<manifest package="com.example.testlibrary" ...
Run Code Online (Sandbox Code Playgroud)

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

<manifest package="com.example.mainapplication" ...
Run Code Online (Sandbox Code Playgroud)

从而使项目建设顺利进行。

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

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

我还(后来,grr)发现了这篇博客文章,其中详细介绍了相同的问题和最终相同的解决方案。