有啥方法可以指导 Proguard(在 Android 上)保存中间 jars?

Posted

技术标签:

【中文标题】有啥方法可以指导 Proguard(在 Android 上)保存中间 jars?【英文标题】:Is there any way to direct Proguard (on Android) to save intermediate jars?有什么方法可以指导 Proguard(在 Android 上)保存中间 jars? 【发布时间】:2015-01-05 12:48:10 【问题描述】:

虽然遇到了可怕的 dex 方法限制错误,但我一直在尝试找到解决该问题的快速解决方案。使用 proguard 后,我的 apk 被 13k 方法缩小,其中大部分来自我使用的库。这是构建过程的(稍加修改的)相关输出。

    -obfuscate:
        [mkdir] Created dir: /bin/proguard
          [jar] Building jar: /bin/proguard/original.jar
     [proguard] ProGuard, version 5.0
     [proguard] Reading input...

     [proguard] Reading program jar [/libs/kryo-2.24.0.jar]
     [proguard] Reading program jar [/libs/jackson-databind-2.1.1.jar]
     [proguard] Reading program jar [libs/okhttp-1.1.0.jar]
     [proguard] Reading program jar [/libs/realm-0.72.0.jar]
     [proguard] Reading program jar [/libs/tape-1.1.0.jar]
     [proguard] Reading program jar [/libs/google-play-services.jar]
     [proguard] Reading program jar [/libs/AudienceNetwork.jar]

 [proguard] Initializing...
 [proguard] Ignoring unused library classes...
 [proguard]   Original number of library classes: 7170
 [proguard]   Final number of library classes:    1712
 [proguard] Printing kept classes, fields, and methods...
 [proguard] Shrinking...

有什么方法可以让 Proguard for android 保存中间 jars,(这些库的缩小版本,符合我的代码需求,具有使用的功能集,仅此而已),就在缩小之后,但在它们得到之前由 aapt 打包成一个巨大的 blob?

【问题讨论】:

【参考方案1】:

您可以创建自定义的缩小版 Google Play 服务,这可能足以避免 65K 方法 ID 限制。我来自 Droidcon London 2014 的 presentation on creating smaller apps 包含一些可能的 ProGuard 配置来创建这样一个缩小的库。

【讨论】:

埃里克,感谢您的回复。我已经完成了缩小 GMS 的过程。在其他库上做同样的事情需要了解包层次结构和手动 proguard 配置。从您的回答中,我了解到无法从收缩过程中获得中间罐。 ProGuard 将程序代码和库视为要缩小/优化/混淆的一大块代码,因此确实没有中间 jar。考虑到应用程序的大量输入类和相对较少的输出类,应该可以将最大的库缩小到可管理的大小。使用演示文稿中的简短配置,这真的不是那么难。请注意,示例配置仅保留 GPS 库中与特定应用相关的部分。

以上是关于有啥方法可以指导 Proguard(在 Android 上)保存中间 jars?的主要内容,如果未能解决你的问题,请参考以下文章

ProGuard 中的 -keep 和 -keepclassmembers 有啥区别?

android里proguard.cfg文件有啥用?

使用 Proguard 删除日志记录

Android中的consumer-rules.pro和proguard-rules.pro有啥区别?

Android Gradle Plugin 2.2.0 ProGuard 开始保留内部类

v7 支持库 ActionBar 的 Android Proguard 配置