- 作者:老汪软件技巧
- 发表时间:2024-09-22 17:00
- 浏览量:
在 Android 项目中,consumerProguardFiles 和 proguardFiles 是与混淆相关的配置选项,它们有不同的用途和适用场景。
proguardFiles 和 consumerProguardFiles 的区别
所以proguardFiles指定的是当前模块的混淆规则文件,仅在构建当前模块时使用;而consumerProguardFiles指定库模块的混淆规则文件,当该模块被其他项目引用时,这些规则文件将自动应用。
示例
假设我们有一个 Android 项目,其中包含一个应用程序模块(app)和一个库模块(lib_proguard)。
proguardFiles 示例
在 app 模块中,我们使用 proguardFiles 来指定混淆规则文件:
// app/build.gradle
android {
buildTypes {
release {
minifyEnabled true // 启用混淆
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
在这个示例中,app 模块在构建 release 版本时启用了混淆,并使用了两个混淆规则文件:
这些规则文件只影响 app 模块及其直接引用的代码。
consumerProguardFiles 示例
在 lib_proguard 模块中,我们使用 consumerProguardFiles 来指定混淆规则文件:
// lib_proguard/build.gradle
android {
defaultConfig {
// 库模块的配置
}
buildTypes {
release {
//注意这里得配置consumerProguardFiles,consumer-rules.pro中的混淆规则才会生效
consumerProguardFiles 'consumer-rules.pro'
}
}
}
在这个示例中,lib_proguard 模块定义了一个混淆规则文件 consumer-rules.pro,它会在以下情况下生效:
consumerProguardFiles 和 proguardFiles 配合使用
如果希望在构建该模块时应用特定的混淆规则,同时在该库被其他项目引用时也应用这些规则,可以同时使用 proguardFiles 和 consumerProguardFiles:
// lib_proguard/build.gradle
android {
buildTypes {
release {
minifyEnabled true
proguardFiles 'proguard-rules.pro' // 用于构建该库模块时的混淆规则,一般也不会这么写
consumerProguardFiles 'consumer-rules.pro' // 用于在其他项目中引用该库时的混淆规则
}
}
}
在这个配置中:
综合示例
更多情况下,是在主 app/build.gradle 中设置proguard-rules.pro,在 lib_proguard/build.gradle 中设置consumer-rules.pro,这样打包后就会把所有的混淆规则进行合并,如:
Release包生成的混淆文件
打完 Release 包后,通常会在 build/outputs/mapping/release/ 目录下生成一些与代码混淆相关的文件。这些文件是由 ProGuard 或 R8(ProGuard 的后继者)生成的,具体包括以下几个文件:
configuration.txt
configuration.txt 是由 ProGuard 或 R8 生成的文件,包含了在混淆过程中实际使用的所有混淆配置规则。它列出了最终生效的混淆规则,包含在 proguard-rules.pro 文件中定义的规则、consumerProguardFiles 中的规则(从依赖的库模块中引入的混淆规则)以及 Android SDK 和其他工具可能附加的默认规则。通过查看这个文件,可以了解所有实际应用的混淆配置规则。
mapping.txt
mapping.txt 文件是混淆映射文件,记录了混淆过程中类名、方法名和字段名的映射关系。混淆后的代码会将原始的类名、方法名、字段名替换为随机的短名称,以减小 APK 大小并增强反编译的难度。 mapping.txt 文件中的映射关系在排查生产环境的崩溃问题时尤为重要。用过bugly的对这个文件都不陌生吧。借助这个文件,可以将崩溃日志中的混淆名称还原为原始的代码名称(即反混淆),以便更容易理解和调试代码。
seeds.txt
seeds.txt 文件用于记录混淆过程中哪些类和成员(方法或字段)未进行任何混淆或移除操作。 这些类和成员通常是通过配置规则明确指定要保留的部分,例如使用了 @Keep 注解或在 ProGuard 配置文件中配置了 -keep 规则。seeds.txt 文件有助于你了解在混淆过程中保留了哪些代码,确保它们不被混淆或优化移除。
usage.txt
usage.txt 文件记录了被删除的类、方法、字段的信息。 ProGuard 或 R8 在混淆时,会根据规则判断哪些代码是无用的或不可达的,从而移除它们以优化 APK 的大小。usage.txt 文件有助于了解哪些部分的代码被认为是未使用的并被移除掉了。如果有意外的代码被移除导致应用出现问题,可以通过此文件来检查问题所在。