27

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

问题是生成的包含所有必需 .proto 文件的 .jar 文件创建了另外几个 35000 个方法,即 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

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

有什么建议么?

4

7 回答 7

12

您可以使用另一个 DEX 文件。这就是你的做法:

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

于 2013-03-16T01:15:34.660 回答
7

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

微协议缓冲区 ( https://code.google.com/p/micro-protobuf/ ) 也可能有用。

于 2013-03-15T22:39:10.283 回答
4

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

于 2013-11-01T16:57:53.523 回答
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'

更多参考,您可以点击这里

于 2015-02-27T08:32:23.607 回答
1

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

第三方插件中还列出了其他内容。如果没有使用它们中的任何一个,但它们似乎更小并且没有标准协议缓冲区创建的所有方法。

于 2013-03-15T23:38:59.147 回答
1

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

于 2013-07-18T03:32:25.343 回答
0

如果您使用的是 Eclipse,这是最简单的解决方法,请单击此处!

于 2016-07-11T06:29:48.600 回答