如何在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
相关产品推荐
相关产品推荐

