Android - 混淆 java-library 工程
 # 一、工程配置
AndroidStudio 可以创建好几种 Module 工程,如果 Module 使用的是 android 插件(com.android.application 或 com.android.library),那么通过在 buildTypes 中将 minifyEnabled 设为 true 即可开启混淆,但如果 Module 使用的是 java 插件(java-library),那就需要借助额外的工具了,因为 java-library 默认没有提供混淆配置域。
# 1、依赖混淆库
想要混淆 java-library 工程,需要在 build.gradle 文件中手动依赖一个第三方库 proguard-gradle:
import proguard.gradle.ProGuardTask
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "com.guardsquare:proguard-gradle:7.1.0"
    }
}
# 2、自定义混淆 Task
依赖混淆库之后,还要自定义混淆任务,配置一些混淆选项,这里说明几个重点配置项:
- injars:要混淆的 jar 包(可以是文件或目录)
 - outjars:混淆后的 jar 包输出位置(可以是文件或目录)
 - printmapping:混淆后的代码与源码之间的映射关系日志
 - configuration:混淆规则文件(一般就是 
proguard-rules.pro) - dontshrink:不要开启压缩(默认混淆时会压缩代码,将没被引用到的代码抹去,这会导致某些类文件丢失字段,比如 java bean)
 
task("proguardTask", type: ProGuardTask, dependsOn: jar) {
    description = "Obfuscates source files"
    def artifactName = "[you library name].jar" // 根据实际情况修改!!!
    def inputFolder = "$buildDir/libs"
    def obfuscatedFolder = "$buildDir/obfuscated"
    def inputJar = "$inputFolder/$artifactName"
    def outputJar = "$obfuscatedFolder/$artifactName"
    injars inputJar
    outjars outputJar
    // For de-obfuscating stack traces later on
    printseeds "$obfuscatedFolder/seeds.txt"
    printmapping "$obfuscatedFolder/mapping.txt"
    // dependencies
    libraryjars "${System.getProperty('java.home')}/lib/rt.jar" //works for java 8
    libraryjars configurations.runtime
    libraryjars sourceSets.main.compileClasspath
    configuration files("proguard-rules.pro")
    // 不要压缩(压缩会把暂时没用到的代码抹去)
    dontshrink
    // 配置阶段触发:将之前生成的混淆jar包删除
    delete obfuscatedFolder
    // 执行阶段触发:当混淆jar包生成出来时,自动替换掉 build/libs 目录下的原始jar包
    doLast {
        delete "$inputJar"
        copy {
            from outputJar
            into inputFolder
        }
    }
}
proguard-gradle 这个库还有很多配置项,需要你感兴趣,可以到官网查阅手册了解:
- ProGuard 官方手册:https://www.guardsquare.com/manual/setup/gradle (opens new window)
 - Publishing an obfuscated kotlin library:https://dev.to/iurysza/publishing-an-obfuscated-kotlin-library-2kbk (opens new window)
 
# 3、关联混淆 Task
注意了,上面在声明混淆任务 proguardTask 时指定了一个依赖任务 dependsOn: jar,意思是当执行 proguardTask 任务时,需要先执行 jar 任务而已。反过来就不一定了,执行 jar 任务并不会执行 proguardTask 任务(此时 jar 任务不对 proguardTask 负责)。但是一般情况下,我们希望 jar 任务执行之后,顺便把 proguardTask 任务一并执行,这时就可以使用 finalizedBy() 方法对其进行关联:
jar.finalizedBy(proguardTask)
至此,只要 java-library 工程一触发 jar 任务(Mark 或 Build),proguardTask 任务也会一并执行了。
# 二、完整代码
以下是 java-library 工程 build.gradle 文件中的全部代码:
apply plugin: 'java-library'
dependencies {
    ...
}
import proguard.gradle.ProGuardTask
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "com.guardsquare:proguard-gradle:7.1.0"
    }
}
task("proguardTask", type: ProGuardTask, dependsOn: jar) {
    description = "Obfuscates source files"
    def artifactName = "[you library name].jar" // 根据实际情况修改!!!
    def inputFolder = "$buildDir/libs"
    def obfuscatedFolder = "$buildDir/obfuscated"
    def inputJar = "$inputFolder/$artifactName"
    def outputJar = "$obfuscatedFolder/$artifactName"
    injars inputJar
    outjars outputJar
    // For de-obfuscating stack traces later on
    printseeds "$obfuscatedFolder/seeds.txt"
    printmapping "$obfuscatedFolder/mapping.txt"
    // dependencies
    libraryjars "${System.getProperty('java.home')}/lib/rt.jar" //works for java 8
    libraryjars configurations.runtime
    libraryjars sourceSets.main.compileClasspath
    configuration files("proguard-rules.pro")
    // 不要压缩(压缩会把暂时没用到的代码抹去)
    dontshrink
    // 配置阶段触发:将之前生成的混淆jar包删除
    delete obfuscatedFolder
    // 执行阶段触发:当混淆jar包生成出来时,自动替换掉 build/libs 目录下的原始jar包
    doLast {
        delete "$inputJar"
        copy {
            from outputJar
            into inputFolder
        }
    }
}
jar.finalizedBy(proguardTask)

上次更新: 2025/10/26, 06:32:15
- 01
 - Flutter 多仓库本地 Monorepo 方案与体验优化10-25
 
- 02
 - Flutter webview 崩溃率上升怎么办?我的分析与解决方案10-19
 
- 03
 - Flutter - Melos Pub workspaces 实践10-12