You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Gradle插件项目中混淆后发布Jar包?

Gradle Java插件项目的Jar混淆方案

Gradle的java-gradle-plugin(包括基础Java插件)没有内置混淆功能——Android项目的混淆支持是Android插件默认集成了ProGuard/R8工具的缘故。要给Java Gradle插件的Jar包做混淆,需要手动引入混淆插件并配置规则,下面是具体实现步骤:

1. 引入混淆插件

推荐使用ProGuard官方Gradle插件,也可以用R8(语法兼容)。在build.gradle的plugins块中添加:

plugins {
    id 'java-gradle-plugin'
    id 'maven-publish'
    id 'com.guardsquare.proguard' version '7.4.2' // ProGuard插件
    // 可选:如果需要打包成包含依赖的Fat Jar,添加Shadow插件
    id 'com.github.johnrengelman.shadow' version '8.1.1'
}

2. 编写混淆规则

在项目根目录创建proguard-rules.pro,针对Gradle插件的特性添加规则(必须保留插件入口类和Gradle相关的元数据):

# 保留插件入口类,Gradle需要通过它加载插件
-keep public class signpackage.SignPackagePlugin {
    public <init>();
}

# 保留注解和签名元数据,避免插件配置丢失
-keepattributes *Annotation*, Signature

# 保留自定义任务类的构造器(如果你的插件有自定义任务)
-keep class * implements org.gradle.api.Task {
    public <init>(org.gradle.api.Project);
}

# 保留命名接口实现类的构造器
-keep class * implements org.gradle.api.Named {
    public <init>(java.lang.String);
}

# 忽略不必要的警告,减少日志干扰
-dontwarn org.slf4j.**
-dontnote org.gradle.**
# 若混淆后运行出错,可先关闭优化排查问题
# -dontoptimize

3. 配置混淆任务与发布流程

修改build.gradle,让混淆任务与发布流程关联,确保发布的是混淆后的Jar:

// 配置ProGuard任务
proguard {
    configurations {
        main {
            // 输入:编译后的class文件
            injars sourceSets.main.output
            // 输出:混淆后的Jar路径
            outjars "${buildDir}/libs/${project.name}-${project.version}-obfuscated.jar"
            // 依赖库路径
            libraryjars configurations.compileClasspath
            // 应用混淆规则
            configuration file('proguard-rules.pro')
        }
    }
}

// 让发布任务依赖混淆任务,保证先混淆再发布
tasks.named('publish').configure {
    dependsOn proguard.main
}

// 修改发布配置,使用混淆后的Jar作为artifact
publishing {
    publications {
        maven(MavenPublication) {
            groupId = 'com.zo.sign'
            artifactId = 'signpkg'
            version = '1.0'
            // 替换默认的components.java,指定混淆后的Jar
            artifact "${buildDir}/libs/${project.name}-${project.version}-obfuscated.jar"
            
            // 可选:发布源码和Javadoc(需要先定义对应任务)
            artifact sourcesJar
            artifact javadocJar
        }
    }
    
    // 原仓库配置保持不变
    repositories {
        maven {
            def releasesRepoUrl = layout.buildDirectory.dir('repos/releases')
            def snapshotsRepoUrl = layout.buildDirectory.dir('repos/snapshots')
            url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl
        }
    }
}

// 可选:定义源码Jar任务
task sourcesJar(type: Jar) {
    from sourceSets.main.allJava
    archiveClassifier.set('sources')
}

// 可选:定义Javadoc Jar任务
task javadocJar(type: Jar) {
    from javadoc
    archiveClassifier.set('javadoc')
}

4. 验证与发布

  • 执行./gradlew proguardMain生成混淆Jar,查看build/libs目录下的输出文件,确认混淆生效。
  • 执行./gradlew publish,将混淆后的Jar发布到目标仓库。

关键注意事项

  • 混淆规则需要根据插件实际代码调整:如果插件有自定义扩展、服务接口等,必须保留对应的类和方法,否则Gradle加载插件时会抛出找不到类或方法的异常。
  • 若使用R8替代ProGuard,只需替换插件为com.android.tools.r8,大部分规则语法与ProGuard兼容。

内容的提问来源于stack exchange,提问作者arunkumar A

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 11:57:45