Android DEX 65k例外 - Gradle模块 - 任何其他想法?

时间:2015-09-04 16:58:31

标签: java android git gradle dex

针对重复问题的更新:
我不想使用multidex。应该有一个没有它的解决方案,因为“:app”使用的类不需要这个庞大的库包。

我目前正在开发一个网络项目:应用服务器和Android客户端应用程序。我已经完成了服务器的预alpha版本,现在我想开始编写Android客户端应用程序。

我的想法:我想在我的android项目文件夹中包含服务器git存储库作为git子模块,因此gradle可以将它用作我的':app'项目的依赖项。
但是:服务器repo使用泽西休息类。因此,如果我将服务器gradle项目作为依赖项包含,则android构建将失败,流行的“无法执行dex:方法ID不在[0,0xffff]中:65536”错误:DEX 65k问题。

好吧,我的android客户端项目不使用任何需要jersey依赖的类。只有少数类包括服务器给出的数据的解析和处理方法。我已将它们包含在服务器仓库中,因此您始终拥有实际服务器结构的正确客户端类。如果我为客户端类创建第二个repo,它们可能不会每次都同步。

我该如何解决这个问题?我想在两个gradle模块中拆分服务器repo但是使用相同的git repo。

任何想法??

PS:65k问题:我总是在android客户端项目中包含只有java自己的依赖项的类。 65k是指“可用”还是“使用”方法?

1 个答案:

答案 0 :(得分:1)

使用两个Gradle模块听起来像是最好的解决方案,如果您使用的是服务器提供的一些类,而不是大多数服务器代码。 Java在组装类路径时非常自由,使所有可能使用的类都可用;但是,这意味着如果你不小心你的类路径,那么dexer将假设所有这些类和方法都应该在你的dex中提供,并且转换得比实际需要的多得多。

您还可以考虑启用Proguard,它可以减少未使用的类和方法以及内联简短方法。尽管有一些额外的处理成本和一些额外的配置,但这两个都使类减少了。如果你使用反射或本机代码,你尤其需要小心,因为Proguard可能不够聪明,无法检测未通过普通Java调用语义调用的方法。

有关限制的进一步说明(65,536总方法和字段参考),我肯定赞同评论中的Anubian Noob链接(How to shrink code - 65k method limit in dex)。在绝对必要之前,不应该切换到Multidex:所有代码仍然需要下载到设备上(并在Lollipop设备上转换成OAT格式,以后),如果严格不需要代码,这将浪费时间和数据。相反,将最小的输入jar输入到dexer,这意味着拆分模块或使用Proguard。