如何使用 Gradle 配置 Proguard?

Posted

技术标签:

【中文标题】如何使用 Gradle 配置 Proguard?【英文标题】:How to configure Proguard using Gradle? 【发布时间】:2014-03-07 12:01:34 【问题描述】:

我最近切换到 android Studio / Gradle,我想知道如何在 build.gradle 脚本中配置 ProGuard。我是 Gradle 的新手,但我认为配置 Proguard 任务是个好主意(如 Proguard 项目文档中所述。

我想配置 Proguard 以使用 'printmapping' 设置将映射保存在不同的文件中以用于不同的产品风格

task myProguardTask(type: proguard.gradle.ProGuardTask) 
     printmapping file("test.txt")

但它在任务执行时崩溃

Gradle: Execution failed for task ':module:proguardFlavorVariant'.
    > proguard.ConfigurationParser.<init>(Ljava/io/File;Ljava/util/Properties;)V

在较新版本的 Gradle 'android'-plugin 中,似乎包含了 Proguard,我认为这可能是为什么按照 Proguard 文档中所述配置 Proguard 任务不起作用的原因。但我没有找到关于如何使用较新的 android-gradle-plugin 执行此操作的任何文档。

感谢您的帮助!

【问题讨论】:

确保您的 proguard 配置文件正确写入,因为它显示解析错误,通常在您的 proguard 文件出现问题时出现。 感谢您的建议,但我的 proguard 文件应该没问题,因为如果我在 gradle 脚本中没有 proguard 自定义的情况下执行 gradle 构建(包括 proguard 任务),它就可以工作。 为什么不使用runProguard true proguardFile getDefaultProguardFile('proguard-android.txt') 在不同风味的风味配置中。 这是我现在正在使用的 ;-) 但我只是想知道是否有可能在 gradle 中配置它而不必创建 x 多个文件来维护。 好的,您能否将整个 build.gradle 文件包含在内,因为我认为您必须使用一些存储库或依赖类路径才能包含 proguard 任务,不确定。 【参考方案1】:

Proguard 内置于 Android-Gradle 插件中,您无需将其配置为单独的任务。文档位于:

http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Running-ProGuard

您的口味是否如此不同以至于您真的想要为它们提供不同的 ProGuard 配置?我认为在大多数情况下,您可以拥有一个可以涵盖所有这些的配置。

编辑:

如果您确实想针对不同的风格更改 ProGuard 规则,Android Gradle DSL 允许您这样做。文档中的示例显示了如何执行此操作:

android 
    buildTypes 
        release 
            // in later versions of the Gradle plugin runProguard -> minifyEnabled
            minifyEnabled true
            proguardFile getDefaultProguardFile('proguard-android.txt')
        
    

    productFlavors 
        flavor1 
        
        flavor2 
            proguardFile 'some-other-rules.txt'
        
    

这应该可以处理您的用例,除非您正在寻找一种方法让它根据风味名称自动确定 proguardFile 值,而无需手动设置它;你可以通过一些自定义的 Groovy 脚本来做到这一点。

【讨论】:

是的,我不需要在单独的任务中配置它 - 但我可以这样做吗? ;-)。我想使用不同的 proguard 配置来根据其风味名称命名 mapping.txt,这样我就不会错过哪个映射属于特定构建。我承认,这没什么大不了的,也没什么大不了的,但我只是想知道这是否可能。 您不需要单独的 ProGuard 任务来拥有每个风格的映射文件;我更新了我的答案。 我现在最终实施的。配置 proguard(尽管只是链接到配置 proguard 的外部文件)现在似乎是不可能的,至少文档没有说明它。 runProguard 更改为 minifyEnabled,see here。 除了“proguard-android.txt”之外,Android SDK 还为您提供了一个文件“proguard-android-optimize.txt”,它已经设置了一些规则来优化您的代码字节水平,并可能有助于缩小您的应用程序大小。见:developer.android.com/tools/help/proguard.html#enabling-gradle

以上是关于如何使用 Gradle 配置 Proguard?的主要内容,如果未能解决你的问题,请参考以下文章

将系统属性与 proguard 配置文件一起传递给 gradle proguardFile 属性

如何配置 ProGuard 以尊重 Jackson 模型?

如何使用 spring-boot gradle 插件进行 proguard

AndroidStudio 2.2 构建 gradle 错误(自定义 proguard 文件的路径)

构建android gradle项目时如何禁用proguard生成dump.txt

如何在 android studio gradle 中降级 proguard 版本?