【问题标题】:Android project with Guava hitting the limit使用 Guava 达到极限的 Android 项目
【发布时间】: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。

标签: android proguard guava android-gradle-plugin android-guava


【解决方案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 进行发布构建并且可以正常工作。
  • 我确实找到了stackoverflow.com/questions/16559723/…,但这仍然很难调试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-24
相关资源
最近更新 更多