我试图使用gradle with proguard来混淆代码,然后生成一个zip文件进行分发。我想使用distribution plugin,但它总是包含jar任务生成的jar。有没有办法强制分发插件省略原始(非混淆)jar并且只包含混淆的jar?除了原始版本之外,我还可以轻松添加模糊的jar,但我想分发原文的模糊jar 而不是,以便生成的执行脚本针对模糊版本运行。
这是我的删节build.gradle文件:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'net.sf.proguard:proguard-gradle:5.3.3'
}
}
apply plugin: 'java'
apply plugin: 'application'
task obfuscate(type: proguard.gradle.ProGuardTask) {
configuration 'proguard.txt'
injars "build/libs/${rootProject.name}.jar"
outjars "build/libs/${rootProject.name}-release.jar"
}
jar.finalizedBy(project.tasks.obfuscate)
distributions {
main {
contents {
from(obfuscate) {
into "lib"
}
from(jar) {
exclude "*.jar"
}
}
}
}
我已尝试在发行版块中尝试排除原始jar,但似乎没有任何效果。
非常感谢任何想法。
答案 0 :(得分:1)
这不是最佳解决方案,但我能够通过在混淆步骤结束时重命名jar来解决此问题。现在,我将原始jar命名为<JAR_NAME>-original.jar
,并将混淆的jar命名为原始jar的名称。我仍然希望有更好的方法来做到这一点,但这似乎有效。
以下是更新后的build.gradle
文件:
import java.nio.file.Paths
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'net.sf.proguard:proguard-gradle:5.3.3'
}
}
apply plugin: 'java'
apply plugin: 'application'
def jarNameWithoutExtension = jar.archiveName.with { it.take(it.lastIndexOf(".")) }
def obfuscatedJarName = "${jarNameWithoutExtension}-release.jar"
def jarFileLocation = jar.archivePath.parent
def obfuscatedFilePath = Paths.get(jarFileLocation, obfuscatedJarName)
task obfuscate(type: proguard.gradle.ProGuardTask) {
configuration 'proguard.txt'
injars jar.archivePath
outjars obfuscatedFilePath.toString()
// Rename the original and obfuscated jars. We want the obfuscated jar to
// have the original jar's name so it will get included in the distributable
// package (generated by installDist / distZip / distTar / assembleDist).
doLast {
jar.archivePath.renameTo(Paths.get(jarFileLocation, "$jarNameWithoutExtension-original.jar").toFile())
obfuscatedFilePath.toFile().renameTo(jar.archivePath)
}
}
jar.finalizedBy(project.tasks.obfuscate)