在我的 buildType
中,我看到了这个:
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
我有一些问题:
- 为什么有两个文件?
- 它们之间有什么区别?
- 我应该在哪里编写我的规则?
在我的 buildType
中,我看到了这个:
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
我有一些问题:
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'
getDefaultProguardFile('proguard-android.txt')
会获取存储在Android SDK
的tools/proguard
中的ProGuard设置。
proguard-rules.pro
是位于模块根目录的文件。它的目的是允许您添加特定于该模块的自定义规则(ProGuard)。
了解更多信息
其他答案仍然大多正确,但由于它们是以前写的,所以有些事情已经改变了。
如果您打开 <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中的文件。
proguard-android.txt
文件中应用了哪些规则,您可以检查AGP在构建项目时生成的proguard-android.txt
文件。请注意,只有在运行混淆(minify)时才会生成这个文件:因此,除非您使用minifyEnabled
为true
的构建变体构建项目,否则该文件将不存在于您的项目中。AGP将在<project-root>/build/intermediates/default_proguard_files/global/
目录下为您的项目生成该文件。
那么您可以选择通过查看AGP源代码来了解如何生成proguard-android.txt
文件。以下是在版本3.0.0上适用的方法:
我参照了这个精彩的回答:https://dev59.com/-FgR5IYBdhLWcg3wZcgX#44122888
简而言之:
gradle/caches/modules-2/files-2.1/com.android.tools.build/gradle-core/
gradle-core-X-sources.jar
的文件,其中X是您想要的版本号。对于我来说,那是gradle-core-3.0.0-sources.jar
。现在你已经有了源文件,你可能会认为只需要找到名为proguard-android.txt
的文件就可以了。不幸的是,这个文件不存在-它是动态构建的。相反,你需要找到AGP源码中构建proguard-android.txt
文件的代码。对我来说,这在 com/android/build/gradle/ProguardFiles.java
中。事实证明,在撰写本文时,proguard-android.txt
的规则只是在com/android/build/gradle/proguard-common.txt
文件中定义的规则。
proguard-android.txt
,我是否可以简单地忽略它,并在build.gradle
中用自己的proguardFiles 'proguard.cfg'
语句覆盖它? - Introspective