使用 Guava 达到极限的 Android 项目

Posted

技术标签:

【中文标题】使用 Guava 达到极限的 Android 项目【英文标题】:Android project with Guava hitting the limit 【发布时间】:2015-05-12 16:37:33 【问题描述】:

我在一个 android 项目中使用 Guava。我达到了 65k 方法限制,导致 gradle 构建失败。我发现这可以通过使用proguard来解决。我在发布版本上运行 Proguard,它工作正常。我不想在调试版本上运行 proguard,因为它使调试变得困难。我想知道是否有办法解决这个问题?我正在考虑的一个选择是构建一个本地 guava.jar 并将其定义为依赖项,而不是从 maven Central 中提取它。有没有更好的方法来做到这一点?

【问题讨论】:

在调试版本上运行 ProGuard 并不可怕 - 它可以帮助您及早发现任何 ProGuard 配置错误,而不是试图在您的发布版本中跟踪它们。 每次在调试版本中运行 proguard 会浪费很多时间。你能检查你正在使用的所有库的方法计数吗?您是否使用精简版的 google play 服务? 谢谢@Gaurav,我正在使用剥离版本的谷歌播放服务,现在番石榴是最大的罪犯,仅使用 14K+ 方法。 你能从 guava lib 中排除一些包吗,通过在 gradle 依赖项中使用 'exclude 我检查了依赖项,发现他们主要使用“common.collect.”,包,但那里的东西有其他人的引用。现在我可以使用 jarjar 来构建一个包含该包中的类的 jar。 【参考方案1】:

最新的 Android 构建工具支持 MultiDex 选项。这允许使用超过 65k 方法构建应用程序。只需关注official guide。

您还可以与 ProGuard 一起启用自动资源缩减:

android 
    buildTypes 
        release 
            minifyEnabled true
            shrinkResources true
        
    


【讨论】:

我应该更清楚。此问题适用于非 proguarded 调试版本。如果我运行 proguard 我会达到极限但是我不想在调试变量上运行 proguard 抱歉,错过了。也许您只能在调试版本中使用 MultiDex。 天真地包括巨大的库使得下载、安装和启动时间更长。【参考方案2】:

根据official doc of Guava,可以使用如下:

-injars path/to/myapplication.jar
-injars lib/guava-r07.jar
-libraryjars lib/jsr305.jar
-outjars myapplication-dist.jar

-dontoptimize
-dontobfuscate
-dontwarn sun.misc.Unsafe
-dontwarn com.google.common.collect.MinMaxPriorityQueue

-keepclasseswithmembers public class * 
    public static void main(java.lang.String[]);

这将使您的方法保持相同的名称而不会混淆。这意味着您仍然可以使用按原样编写的所有适当名称进行正确调试。

【讨论】:

那么您将如何为您的调试版本设置它,使其仅适用于 guava jar?我已经在使用 proguard 进行发布构建并且可以正常工作。 我确实找到了***.com/questions/16559723/…,但这仍然很难调试

以上是关于使用 Guava 达到极限的 Android 项目的主要内容,如果未能解决你的问题,请参考以下文章

如何增加 HID 轴的范围? (几度后方向盘达到极限)

为啥从 Realm DB 加载图像时 SwiftUI List 会崩溃? RAM 达到极限

深度学习已经达到极限了吗?

如何创建最紧凑的映射 n → isprime(n) 达到极限 N?

如何使用Guava的缓存管理

Android 中 Ktor 服务器身份验证的几个问题