【问题标题】:Proguard ignores config file of libraryProguard 忽略库的配置文件
【发布时间】:2015-01-14 23:42:53
【问题描述】:

我这几天都面临着一个非常奇怪的问题......

我有一个带有两个模块的 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 规则在主模块上运行良好。它做它应该做的。但它总是将我的图书馆完全混淆为 a.a....

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

【问题讨论】:

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


    【解决方案1】:

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

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

    defaultConfig {
        consumerProguardFiles 'proguard-rules.txt'
    }
    

    然后这个文件在库 aar 中被打包成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 对我来说很好。

    【讨论】:

    • 您好埃里克,首先感谢您的快速回复。我现在完全取出了库中的 minifyEnabled 选项,它确实解决了我在电子邮件中提到的“输出 jar 为空”,但 proguard 无论如何都忽略了 proguard 配置
    • 确实,我错过了 consumerProguardFiles 的事情。现在可以了,非常感谢:)
    • consumerProguardFiles 应该在defaultConfig 而不是buildTypes/release 中指定,以便在消费应用程序在调试和发布模式下进行保护时它可以工作(例如,为了避免 65k dex 方法限制)。
    • 这真的很有帮助,非常感谢!此外,有没有办法隐藏/混淆资源文件夹中的 strings.xml 文件或资产文件夹中的任何文件?我看到这些即使在 ProGuard 之后也没有被触及。
    【解决方案2】:

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

    当然,Eric 知道他在说什么,但我 [断断续续] 一直试图找到一种干净的方法在 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 重命名为 .../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
      

    【讨论】:

    • 错误:资源收缩器不能用于库。
    • @Swooby 为什么我们在 lib 模块中同时需要 consumerProguardFiles 和 proguardFiles?
    • @Aada consumerProguardFiles 是其他人使用您的图书馆的规则; proguardFiles 是您使用的库的规则
    【解决方案3】:

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

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

    【讨论】:

    • 这确实有效..出于某种原因,仅使用 consumerProguardFiles 保留了我需要的大部分内容,但随机忽略了一些类的规则..同时使用这两种工作..但是为什么!??
    • 不幸的是,它确实奏效了...花了相当长的时间尝试这样做,现在只剩下弄清楚为什么它会奏效了:)
    • * 出了什么问题:配置项目 ':content' 时出现问题。 > 默认文件 proguard-android.txt 不应用作消费者配置文件。
    【解决方案4】:

    我在库模块中使用下面并解决了。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      • 2013-03-12
      • 2016-08-31
      • 2018-07-20
      • 1970-01-01
      • 1970-01-01
      • 2013-11-02
      相关资源
      最近更新 更多