proguard-android.txt和proguard-rules.pro有什么区别?- Android

50

在我的 buildType 中,我看到了这个:

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

我有一些问题:

  1. 为什么有两个文件?
  2. 它们之间有什么区别?
  3. 我应该在哪里编写我的规则?
3个回答

53

getDefaultProguardFile('proguard-android.txt') 方法从 Android SDK 的tools/proguard/文件夹中获取默认的 ProGuard 设置。该 Android SDK 文件夹中还提供了启用优化的 proguard-android-optimize.txt 文件,其中包含相同的规则。ProGuard 优化在字节码级别内和跨方法内部执行分析,以帮助使您的应用程序更小、运行更快。Android Studio 将 proguard-rules.pro 文件添加到模块的根目录中,因此您可以轻松地添加特定于当前模块的自定义 ProGuard 规则。

请参考:https://developer.android.com/studio/build/shrink-code

这意味着如果要将一些规则分离到多个文件中,您应该将自定义的 proguard 文件添加到 proguard-rules.pro 中,并在此声明它们。

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

14
如果你打开 proguard-android.txt 文件,你会看到以下信息:“这个文件已不再维护,也不会被新版本(2.2及以上)的 Gradle Android 插件所使用。相反,Gradle Android 插件会在构建时生成默认规则并将其存储在构建目录中。” - Bevor

7

getDefaultProguardFile('proguard-android.txt')会获取存储在Android SDKtools/proguard中的ProGuard设置。

proguard-rules.pro是位于模块根目录的文件。它的目的是允许您添加特定于该模块的自定义规则(ProGuard)。

了解更多信息


2

其他答案仍然大多正确,但由于它们是以前写的,所以有些事情已经改变了。

如果您打开 <android-sdk-root>/sdk/tools/proguard/proguard-android.txt,那么您会看到这个注释:

此文件不再维护,并且新版(2.2+)Gradle Android 插件不使用它。相反,Gradle Android 插件在构建时生成默认规则并将其存储在构建目录中。

这到底意味着什么?

这意味着 sdk/tools/proguard/proguard-android.txt 文件是无关紧要的 - 写在其中的规则实际上并没有被使用。但是,这并不意味着 proguardFiles getDefaultProguardFile('proguard-android.txt') 这一行现在是无用的。

如果您在使用AGP 2.2或更高版本(我认为现在几乎所有人都在使用)时使用proguardFiles getDefaultProguardFile('proguard-android.txt'),那么将使用AGP自带的proguard-android.txt文件。Google在AGP 2.2的发布说明中提到了这一点:

getDefaultProguardFile现在返回Android Gradle插件提供的默认ProGuard文件,并不再使用Android SDK中的文件。

如何查看规则?

如果您想要在AGP中查看新的proguard-android.txt文件中应用了哪些规则,您可以检查AGP在构建项目时生成的proguard-android.txt文件。请注意,只有在运行混淆(minify)时才会生成这个文件:因此,除非您使用minifyEnabledtrue的构建变体构建项目,否则该文件将不存在于您的项目中。AGP将在<project-root>/build/intermediates/default_proguard_files/global/目录下为您的项目生成该文件。

如果我找不到该文件怎么办?

那么您可以选择通过查看AGP源代码来了解如何生成proguard-android.txt文件。以下是在版本3.0.0上适用的方法:

1 - 找到gradle源文件

我参照了这个精彩的回答:https://dev59.com/-FgR5IYBdhLWcg3wZcgX#44122888

简而言之:

  • 在您的计算机上打开目录gradle/caches/modules-2/files-2.1/com.android.tools.build/gradle-core/
  • 这里列出了已下载的AGP版本 - 打开您感兴趣的目录
  • 在此目录中查找名为gradle-core-X-sources.jar的文件,其中X是您想要的版本号。对于我来说,那是gradle-core-3.0.0-sources.jar
  • 将该jar文件复制到安全的位置,然后解压缩它以查看其中隐藏的AGP源文件。

2 - 查找规则

现在你已经有了源文件,你可能会认为只需要找到名为proguard-android.txt的文件就可以了。不幸的是,这个文件不存在-它是动态构建的。相反,你需要找到AGP源码中构建proguard-android.txt文件的代码。对我来说,这在 com/android/build/gradle/ProguardFiles.java 中。事实证明,在撰写本文时,proguard-android.txt的规则只是在com/android/build/gradle/proguard-common.txt 文件中定义的规则。


现在(2023年7月)应该接受这个答案。不必费力去查看难以捉摸的proguard-android.txt,我是否可以简单地忽略它,并在build.gradle中用自己的proguardFiles 'proguard.cfg'语句覆盖它? - Introspective
是的,你绝对可以这样做 - 只要注意,在proguard运行时,'proguard-android.txt'中的规则将不会被包含在内 - 它只会使用你自定义的'proguard.cfg'文件中的规则。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接