下面解释的项目是使用 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 数量似乎被夸大导致此问题的问题。