gpt4 book ai didi

Android:具有多个库模块时达到 FIELDS_IDS_SIZE Dalvik dex 文件最大值

转载 作者:搜寻专家 更新时间:2023-11-01 09:05:45 24 4
gpt4 key购买 nike

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

在为我们的 Android 应用程序执行运行配置时,我们收到以下错误:Dx编写输出时遇到问题:字段太多:65757;最大值为 65536。按包:

2857 com.android.foo.bar
12 com.android.foo.bar.util
第236话 6 com.blah.yo.util
2 com.hmm
82 com.hmm.android.app
第2761章 第2761章 第2761章...

namespace 列表后跟类似的编号

转换为 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,所以我们的应用程序一定已经变得那么大了”,这是一个相当大的应用程序功能。

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

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

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

最佳答案

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

假设我的 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)合并并简化代码

希望对你有帮助

关于Android:具有多个库模块时达到 FIELDS_IDS_SIZE Dalvik dex 文件最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11955978/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com