2

下面解释的项目是使用 Eclipse Juno(4.2) 创建和构建的。

在为我们的 Android 应用程序执行运行配置时,我们收到以下错误:Dx Trouble writing output: Too many fields: 65757; 最大值为 65536。按包装:

2857 com.android.foo.bar
12 com.android.foo.bar.util
236 com.blah.yo.io
6 com.blah.yo.util
2 com.hmm
82 com.hmm.android.app
2761 com.hmm .android.common
2761 com.hmm.android.map
2761 com.hmm.android.map.common
。. .

命名空间列表后面有类似的数字

转换为 Dalvik 格式失败,错误 2

这是我们项目结构的示例:

概念结构:A - 主/非库模块

  • B - A 的库模块/Android 依赖项
    • C - 作为库模块 B 的 Android 依赖项引入的库模块
  • D - A 的库模块/Android 依赖项
  • E - A 的库模块/Android 依赖项
    • F - E 的库模块/Android 依赖项
    • G - E、B、D 的库模块/Android 依赖项(跨不同模块使用的通用 IO 模块)

文件夹结构:

/项目A/

       B/*Android module structure*
       C/*Android module structure*
       D/*Android module structure*
       E/*Android module structure*
       F/*Android module structure*
       G/*Android module structure*

起初我们认为“哇,我们已经达到了最大 fields_ids_size ,所以我们的应用程序必须变得那么大”,这是一个相当大的应用程序功能。

在对该问题进行了一些清理/发现尝试后,我们怀疑这是否是原因。在分析了 fields_ids_size 的 classes.dex 文件并尝试了不同的方法后,我们发现如果我们删除库模块并将它们包含到主项目中,我们可以减少 fields_ids 的数量。跨项目重用代码/模块的情况很糟糕,但是将上述错误消息中的数字从 65757 减少到近 24,000。同样,如果 jar'ing 一个库模块并将其包含到依赖实体的类路径中(无论是它的主要非库模块还是库模块),如果您删除该库模块的 Android 依赖项,该数字也会缩小,并且只需使用jar文件。

看到这一点,我从上面的示例中提取了 D,并将其作为自己的独立应用程序,与其他模块没有依赖关系/绑定,并为它创建了 classes.dex 文件。对于这个示例,我们假设 D 具有命名空间 com.android.foo.bar。从上面的示例错误来看,这个命名空间在用作 A 的库模块时占用了 2857 个字段 id。当编译为它自己的应用程序并分析 classes.dex 文件时,我看到这个数字下降到大约 120 个字段 id。

这对我们的应用程序来说是一个相当大的问题,因为我们正在达到这个上限。我们确实有某种解决方法,但它相当笨重且耗时。我希望有一个解决方案可以让我们拥有这些库引用,而不会出现库模块的 fields_ids 数量似乎被夸大导致此问题的问题。

4

1 回答 1

3

我最近遇到了您完全相同的问题。我的主项目引用了很多库项目,因此我可以轻松地重用我的代码。

假设我的 3 个库项目都依赖于常用的库 actionBarSherlock。在所有 3 个包中,它将自动生成 R.java 并将所有来自 actionbarsherlock 的 id 放入新的 R.java。所以现在你有 4 个 R.java 文件(ActionBarSherlock、lib1、lib2、lib3),其中使用了许多相同的 id。

解决这个问题的诀窍是在所有库项目 AndroidManifest.xml 中声明相同的包名称,这样您就没有那么多相同的 id。

其他选择是:

1)用ant构建你的项目来创建和加载超过1个dex文件(可怕的解决方案)http://android-developers.blogspot.com/2011/07/custom-class-loading-in-dalvik.html

2)合并简化代码

我希望这有帮助

于 2012-08-20T22:19:38.950 回答