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

前端之家收集整理的这篇文章主要介绍了“编写输出的麻烦:太多的字段引用:70185;最大值为65536.您可以尝试使用–multi-dex选项.“在构建Android项目时前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我发现了这个错误并且没有找到错误消息的命中,所以我想我会分享我想出的解决方案来解决其他任何面临重复工作问题的人.

在编写用于(大型)应用程序的新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 ticket,or this one,this SO answer,this other SO answer)都涉及更改主应用程序的代码,即远远超出我想做的范围.

还有其他解决方案吗?

解决方法

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

像这样的清单:

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

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

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

导致项目建设成功.

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

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

我也(后来,grr),发现this blog post详细说明了同样的问题和最终相同的解决方案.

猜你在找的Android相关文章