有啥方法可以指导 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中的consumer-rules.pro和proguard-rules.pro有啥区别?