Proguard忽略了库的配置文件

时间:2014-11-17 22:33:34

标签: android android-studio module proguard android-library

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

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

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

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

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

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

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

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

编辑:

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

enter image description here

我的图书馆的proguard配置

enter image description here

我的图书馆的gradle:

enter image description here

最后结果我总是得到。我在proguard配置中排除/包含的内容无关紧要

enter image description here

如您所见,proguard规则在主模块上运行良好。它做了应有的事情。但它总是将我的图书馆混淆为a.a ....

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

4 个答案:

答案 0 :(得分:83)

您通常不应在库项目中启用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引用配置。
  4. 为库项目和应用程序项目单独启用/禁用ProGuard对我来说很好。

答案 1 :(得分:8)

令人惊讶的是,Eric的回答实际上也适用于我!

当然埃里克知道他在说什么,但我已经[打开和关闭]试图找到一种干净的方式在gradle中自动完成这项工作一年多没有运气直到我今天刚发现这篇文章。 / p>

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

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

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

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

  9. 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
    

答案 2 :(得分:5)

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

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

答案 3 :(得分:0)

我在图书馆模块中使用下面的方法并解决了该问题。

proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
consumerProguardFiles 'lib_proguard-rules.pro'