我如何教 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 文件更新规则,或向库的开发人员发送建议。
我有一个 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 文件更新规则,或向库的开发人员发送建议。