我如何教 ProGuard 摆脱它保留的我不使用的东西?

How Do I Teach ProGuard to Get Rid of Something It Is Keeping That I Am Not Using?

我有一个 Android 项目,其中 app 模块的 proguard-rules.pro 文件仅包含以下内容:

# ProGuard rules
-dontobfuscate
-dontwarn android.arch.util.paging.CountedDataSource
-dontwarn android.arch.persistence.room.paging.LimitOffsetDataSource

我自己没有保留任何东西。所有 -keep 规则都来自其他东西,无论是 getDefaultProguardFile('proguard-android-optimize.txt') 提供的规则还是来自库中打包的规则。

但是,我没有使用的东西被保留了下来。如果我在我的 release 构建中使用 Android Studio APK 分析器,虽然很多东西 ProGuard 删除了,但还有很多其他东西我没有引用。

例如:通过传递依赖项,我在应用程序的依赖项树中有包含 ViewPager 的支持库模块。但是,我(目前)没有在此应用程序中使用 ViewPager。尽管如此,某些原因导致它被保留,因为 APK 分析器显示 android.support.v4.view.ViewPager 的 107 个已定义方法,包括其构造函数。

我可以使用各种 ProGuard 选项来查明为什么要保留它。但是,它不是来自我的规则。我自己没有 -keep 需要修复 — -keep 来自其他人,大概是 Google 工程师。

那么,我该如何摆脱 ViewPager?有没有一种方法可以覆盖导致它被保留的 -keep 规则(例如,使用 allowshrinking)?如果是这样,Android Studio 调用的 ProGuard 如何确定谁的 -keep 规则获胜?

ViewPager class 没有保存在我刚刚检查的一个小应用程序中,所以它确实是您项目中的其他代码或其他规则。

您可以先让 ProGuard 打印出触发 ViewPager 的链:

-whyareyoukeeping class android.support.v4.view.ViewPager

您可能需要针对各种 classes 和方法重复此操作多次才能找到根本原因。 ProGuard 不会打印出具体负责的规则——诚然,这将是一个有用的功能。

然后您可以在 build/intermediates/exploded-aar 中查找包含匹配规则的 proguard.txt 文件。

至于当时的解决方案:

  • 无法覆盖 -keep 规则;他们只会积累。
  • 据我所知,Android Gradle 插件也不支持禁用库中过于保守的 proguard.txt 文件,因此您需要创建自定义 . aar 文件更新规则,或向库的开发人员发送建议。