Proguard忽略了库的配置文件

我现在面临一个非常奇怪的问题……

我有一个Gradle应用程序,有两个模块,一个主模块和一个库模块。

  • 在这两个模块中,我已经声明了一个正确的proguard-rules.pro文件路径
  • 在两个.gradle文件中,我有minifyEnabled为true

这是第一个问题:即使minifyEnabled在库中为false,它也会被混淆。 它完全没有效果,似乎取决于主模块的设置。 我现在使用proguard一段时间了,我从来没有经历过这样的行为。

此外,库的proguard-rules.pro似乎完全被忽略了。 我在那里声明的并不重要,它没有被使用,结果总是相同的(总是反编译为查看结果)。 它使用默认设置进行模糊处理。

我使用了一个无效的proguard文件名来查看该文件是否被触摸,确实有错误的名称错误,它还抱怨proguard文件中的语法错误…

我不知道它是否与Android Studio的更新有关,因为它还建议我使用“minifyEnabled”而不是“runProguard”。

如何管理proguard以使用库的proguard-rules.pro?

编辑:

我做了一个示例项目来澄清我的问题

在此处输入图像描述

我的库的proguard配置

在此处输入图像描述

我的图书馆的gradle:

在此处输入图像描述

最后我得到的结果 。 我在proguard配置中排除/包含的内容并不重要

在此处输入图像描述

如您所见,proguard规则在主模块上运行良好。 它做到了它应该做的事情。 但它总是完全混淆我的图书馆…

它还完全删除了图书馆的活动,这根本不应该发生

Solutions Collecting From Web of "Proguard忽略了库的配置文件"

您通常不应在库项目中启用ProGuard。 ProGuard在应用程序项目中将应用程序和库一起处理,这是最有效的方法。

在库项目中,您可以在build.gradle中指定任何特定于库的ProGuard配置,例如:

defaultConfig { consumerProguardFiles 'proguard-rules.txt' } 

然后将该文件打包到库中,作为proguard.txt并自动应用于应用程序项目中。

如果您确实在库项目中启用ProGuard(可能是因为您要分发库),那么您还必须添加适当的配置来处理库。 Android Gradle构建似乎不会自动执行此操作。 您可以:

  1. android-sdk/tools/proguard/examples/library.pro复制到库项目中的proguard-project.txt
  2. 从文件中删除样本输入/输出行-injars-outjars-libraryjars-printmapping 。 Gradle构建过程自动提供这些选项。
  3. 从库项目的build.gradle引用配置。

为库项目和应用程序项目单独启用/禁用ProGuard对我来说很好。

令人惊讶的是,Eric的答案实际上也适合我!

当然埃里克知道他在说什么,但是我已经[开启和关闭]一直试图find一种干净的方式在Gradle中自动完成这一过程一年多没有运气直到我今天刚发现这篇文章。

我结合了一些其他的SO线程,并提出了这个有效的解决方案,也可以简化。 步骤1-4是可选的,但到目前为止它似乎没有受到伤害。

  1. 从http://sourceforge.net/projects/proguard/files/proguard/5.2/下载Proguard 5.2
  2. 解压缩到… /android-sdk/tools/proguard5.2
  3. 重命名… /android-sdk/tools/proguard to … /android-sdk/tools/proguard4.7
  4. ln -s .../android-sdk/tools/proguard5.2 .../android-sdk/tools/proguard
  5. android-sdk/tools/proguard/examples/library.pro复制到库项目文件夹并重命名为proguard-library.pro
  6. 编辑proguard-library.pro并注释掉-injars-outjars-libraryjars-printmapping行。
  7. 编辑库的build.gradle文件以包含:

     defaultConfig { minifyEnabled true shrinkResources true proguardFiles 'proguard-library.pro' consumerProguardFiles 'proguard-library-consumer.pro' } 

    您可以调整它以使发布和调试版本具有不同的行为。

  8. proguard-library-consumer.pro

     # include in this file any rules you want applied to a # consumer of this library when it proguards itself. -dontwarn junit.** -dontwarn org.junit.** # Make crash call-stacks debuggable. -keepnames class ** { *; } -keepattributes SourceFile,LineNumberTable 

唯一对我有用的是在我的库中定义两个选项:

 release { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' consumerProguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' }