当dex.force.jumbo = true时,Dexopt在一个非常大的APK(乱序的method_idx)上失败了

时间:2012-11-25 22:44:44

标签: android adt dex dexopt

我有一个非常大的Android项目,包含多个大型第三方罐子(如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合并到非jumbo指令中!

利用SDK工具21(平台工具16),我编辑了我的主项目project.properties以设置dex.force.jumbo=true
允许我生成APK的标志。但我无法正确安装(在物理和模拟器上)。似乎有一个dex优化器失败:

  

11-18 20:11:05.338:I / PackageManager(103):运行dexopt on: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标志用于其不适用的目的,或者此错误是否无法预测?
如果是这样,是否有更好的策略来生成包含大量类/方法的项目?

2 个答案:

答案 0 :(得分:8)

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

替代品我试过/考虑过(支撑自己,他们都很糟糕):
 1. 自己动手 - 扔掉最胖的第三方库并自己编写其功能的确切部分。这是我最终采用的方法,因为我意识到我已经包含了许多用于小功能的代码  2. Custom class loading in Dalvik - 编译一个单独的Dex并在运行时加载它。缺点:繁琐,需要反思  3. 代码修剪 - 打开详细类加载,运行应用程序并尝试删除第三方库或库中未真正使用的部分库。缺点:因动态加载类而耗费时间,容易出错  4. 划分并同意 - 在单独的流程(服务)中打包第三方库。此服务将提供第三方库功能。从主程序对此服务执行调用。

我相信这是一个 640k足以让任何人的情况<或em 在Dalvik的早期,这个星球上的每一部手机都不会有这个设计团队。

如果您想阅读更多内容或只是向Google发送负载,我已经创建了此缺陷:http://code.google.com/p/android/issues/detail?id=40409

答案 1 :(得分:0)

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