• 作者:老汪软件技巧
  • 发表时间: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 文件有助于了解哪些部分的代码被认为是未使用的并被移除掉了。如果有意外的代码被移除导致应用出现问题,可以通过此文件来检查问题所在。