使用 Proguard 剥离未使用的 Support lib 类

Posted

技术标签:

【中文标题】使用 Proguard 剥离未使用的 Support lib 类【英文标题】:Use Proguard for stripping unused Support lib classes 【发布时间】:2012-12-26 15:52:10 【问题描述】:

我正在将 android 支持库添加到我的项目中,并且我注意到生成的 APK 文件的大小膨胀了很多。

我想要做的是使用 Proguard 删除库中我不使用的类,例如与 backword 兼容的 Notification builder 类(事实上,我甚至没有使用 Support lib 中的任何东西就对此进行了测试,我只是将它放在了我的 /libs 文件夹中)。

我的 proguard.cfg 正是 <sdktools>\tools\proguard\proguard-android.txt 中的内容,我自己添加了 -dontobfuscate(因为我真的不需要混淆),但是,我没有看到我的 .APK 文件变得更小。我的 proguard.cfg 如下:

# 这是 ProGuard 的配置文件。 # http://proguard.sourceforge.net/index.html#manual/usage.html -不要混淆 -dontusemixedcase类名 -dontskipnonpubliclibraryclasses -详细 # 优化默认关闭。 Dex 不喜欢代码运行 # 通过 ProGuard 优化和预验证步骤(并执行一些 # 这些优化本身)。 -不要优化 -dontpreverify # 注意,如果你想启用优化,你不能只 # 在您自己的项目配置文件中包含优化标志; # 相反,您需要指向 # "proguard-android-optimize.txt" 文件而不是你的这个文件 # project.properties 文件。 -keepattributes *注解* -保持公共类 com.google.vending.licensing.ILicensingService -保持公共类 com.android.vending.licensing.ILicensingService # 原生方法见 http://proguard.sourceforge.net/manual/examples.html#native -keepclasseswithmembernames 类 * 本国的 ; # 在 Views 中保留 setter 以便动画仍然可以工作。 # 见 http://proguard.sourceforge.net/manual/examples.html#beans -keepclassmembers 公共类 * 扩展 android.view.View 无效集*(***); *** 得到*(); # 我们希望在 Activity 中保留可以在 XML 属性 onClick 中使用的方法 -keepclassmembers 类 * 扩展 android.app.Activity 公共无效*(android.view.View); # 枚举类见http://proguard.sourceforge.net/manual/examples.html#enumerations -keepclassmembers 枚举 * 公共静态 **[] 值(); 公共静态 ** valueOf(java.lang.String); -keep 类 * 实现 android.os.Parcelable 公共静态最终 android.os.Parcelable$Creator *; -keepclassmembers 类 **.R$* 公共静态; # 支持库包含对较新平台版本的引用。 # 不要警告那些如果这个应用程序链接到旧版本 # 平台版本。我们知道他们,他们是安全的。 -不要警告 android.support.**

【问题讨论】:

【参考方案1】:

Android SDK 仅在发布版本中应用 ProGuard,而不是在调试版本中。

此外,Android SDK(r20 或更高版本)通常会在您的项目中查找 proguard-project.txt 而不是 proguard.txt。该文件一般可以为空,因为构建过程还会读取全局文件 proguard-android.txt。您可能想要更新您的项目

android update project -p MyProjectDirectory

最后,Android SDK(r20 或更高版本)默认禁用 ProGuard 的优化步骤(可以改进其缩小步骤)。您可以通过指向 proguard-android-optimize.txt 而不是 project.properties 中的 proguard-android.txt 来启用它。

【讨论】:

谢谢!刚刚检查过,通过发布版本,我的 classes.dex 大小显着下降!

以上是关于使用 Proguard 剥离未使用的 Support lib 类的主要内容,如果未能解决你的问题,请参考以下文章

使用 proguard 保留特定注释

启用 proguard 的 Android 单元测试

Facebook 的 Android ProGuard 设置

使用 Proguard 时未生成 mapping.txt 文件

未创建 Proguard 文件

Proguard:如何避免缩小(和混淆)整个包以避免删除(和混淆)“未使用的方法”?