10

我有一个非常大的 Android 项目,其中包含多个大型 3rd 方 jar(作为 Android 库)。
我相信我已经达到了 Dex 的最大方法数限制(通过 eclipse 编译):

[2012-11-18 02:28:45 - 在文件中查找] Dx 处理 classes.dex ...
[2012-11-18 02:28:48 - Dex Loader] 无法执行 dex:无法将新索引 66774 合并到非巨型指令!
[2012-11-18 02:28:48 - 在文件中查找] 转换为 Dalvik 格式失败:无法执行 dex:无法将新索引 66774 合并到非巨型指令中!

因此,我利用 SDK 工具 21(平台工具 16)将我的主项目 project.properties 编辑为 set dex.force.jumbo=true
该标志允许我生成 APK。但我无法正确安装它(在物理和模拟器上)。似乎有一个 dex 优化器故障:

11-18 20:11:05.338: I/PackageManager(103): 运行 dexopt: com.mypackage.myapp
11-18 20:11:08.577: E/dalvikvm(868): 无序 method_idx: 0x2ae0 然后0x1
11-18 20:11:08.577: E/dalvikvm(868): 项目 1544 出现问题@偏移量 0xf7ae24
11-18 20:11:08.577: E/dalvikvm(868): 部分类型 2006 的交换失败
11-18 20 :11:08.577:E / dalvikvm(868):错误:字节交换+验证失败
11-18 20:11:08.597:E / dalvikvm(868):优化失败
11-18 20:11:08.597:W / installd( 39): DexInv: --- END '/data/app/com.mypackage.myapp-1.apk' --- status=0xff00, 进程失败
11-18 20:11:08.597: E/installd(39): dexopt 在“/data/dalvik-cache/data@app@com.mypackage.myapp-1.apk@classes.dex”上失败 res = 65280
11-18 20:11:08.697: W/PackageManager(103): 包无法安装在 /data/app/com.mypackage.myapp-1.apk
11-18 20:11:09.018: D/dalvikvm( 103): GC_EXPLICIT 释放 1698K, 13% 释放 17034K/19463K, 暂停 7ms+135ms
11-18 20:11:09.068: D/AndroidRuntime(780): 关闭 VM

我是否试图将dex.force.jumbo标志用于它不打算用于的目的,或者这个错误是不可预测的?
如果是这样,是否有更好的策略来生成包含大量类/方法的项目?

4

2 回答 2

8

64K 方法限制是 Dex 格式限制(它使用 2 个字节来查找方法)。
Nandeesh 评论指出 jumbo 只解决字符串,而不是方法。

我尝试/考虑过的替代方案(振作起来,它们都很烂):
1.自己动手- 扔掉最胖的 3rd 方库,自己编写其功能的确切部分。这是我最终采用的方法,因为我意识到我为一个小功能包含了很多代码。
2. Dalvik 中的自定义类加载- 编译一个单独的 Dex 并在运行时加载它。缺点:麻烦,需要反思。
3.代码修剪- 打开详细的类加载,运行应用程序并尝试删除第 3 方库,或未真正使用的库部分。缺点:由于类是动态加载的,因此耗时且容易出错。
4.分歧和同意- 在单独的进程(服务)中打包 3rd 方库。该服务将提供第 3 方库功能。从您的主程序执行此服务的调用。

我相信对于任何人来说,640k 的外壳应该足够了,否则Dalvik 的早期设计团队 不可能在地球上的每一部第二部手机上都有这个。

如果您想阅读更多内容或只是向 Google 大声喊叫,我已经创建了这个缺陷:http ://code.google.com/p/android/issues/detail?id=40409

于 2013-01-27T21:13:02.930 回答
0

我遇到了同样的问题。最后我发现它可能是由同名的多个方法引起的,例如doSomething(List list); 和doSomething(列表列表);编译器说没有错误,但它无法安装到我的设备上。所以请检查你的同名方法。

于 2013-05-25T12:39:58.947 回答