如何解决Dalvik编译器限制64K方法的问题?

时间:2013-03-15 16:03:41

标签: android protocol-buffers dalvik dex

我的团队和我继承了另一个团队的大型Android项目。据报道,包含所有包含库的整个应用程序有大约35000种方法。我们现在的任务是在应用程序中实现我们需要使用Protocol Buffers的新服务。

问题是生成的.jar文件包含所有必需的.proto文件,会创建另外35个方法,即70000个方法。如果您不知道,Android编译器每个.dex文件的限制为65536个方法。我们显然超过了这个限制,我们在尝试编译应用程序时遇到以下错误:

Unable to execute dex: method ID not in [0, 0xffff]: 65536
Conversion to Dalvik format failed: Unable to execute dex: method ID not in [0, 0xffff]: 65536

是的,应用程序架构可能应该进行重组,但这需要时间。目前我们正试图找出解决方案来暂时解决这个问题。

有什么建议吗?

7 个答案:

答案 0 :(得分:12)

您可以使用其他DEX文件。你就是这样做的:

http://android-developers.blogspot.co.il/2011/07/custom-class-loading-in-dalvik.html

答案 1 :(得分:7)

启用Proguard(http://developer.android.com/tools/help/proguard.html)以删除未使用的方法。 protobuf生成器创建了数千种从未实际使用过的方法。

微型原型(https://code.google.com/p/micro-protobuf/)也可能有用。

答案 2 :(得分:4)

Square有类似的问题,他们建立Wire来处理由protobufs引起的方法爆炸。他们声称杀死了10,000种方法。

答案 3 :(得分:4)

在6.5之前的Google Play服务版本中,您必须将整个API包编译到您的应用中。在某些情况下,这样做会使您的应用程序中的方法数量(包括框架API,库方法和您自己的代码)更难以保持65,536的限制。

从版本6.5开始,您可以选择性地将Google Play服务API编译到您的应用中。例如,要仅包含Google Fit和Android Wear API,请替换build.gradle文件中的以下行:

compile 'com.google.android.gms:play-services:6.5.87'

这些行:

compile 'com.google.android.gms:play-services-fitness:6.5.87'
compile 'com.google.android.gms:play-services-wearable:6.5.87'

如需更多参考,请点击here

答案 4 :(得分:1)

如果这是第一次使用协议缓冲区,您可以查看备用JavaME 实施,即

Third party add ons中列出了其他内容。如果没有使用它们,但它们似乎更小,并且没有标准协议缓冲区创建的所有方法。

答案 5 :(得分:1)

我们最近向Android添加了Nano Protobufs,这大大减少了生成的方法数量。

答案 6 :(得分:0)

如果你正在使用eclipse,这是围绕Click Here!

的最简单的工作