我的团队和我继承了另一个团队的大型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
是的,应用程序架构可能应该进行重组,但这需要时间。目前我们正试图找出解决方案来暂时解决这个问题。
有什么建议吗?
答案 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!
的最简单的工作