Gradle badass-runtime-plugin 和 ProGuard Gradle 插件
Gradle badass-runtime-plugin and ProGuard Gradle Plugin
如何在jPackage之前运行混淆?
简介
我正在使用 gradle 插件在 JavaFx 中开发一个应用程序,并使用 jPackager 打包它,还使用 gradle 插件。
我使用的主要插件是:
id 'org.openjfx.javafxplugin' version '0.0.8'
id 'org.beryx.runtime' version '1.7.0'
id "com.github.johnrengelman.shadow" version "5.1.0"
我当前的gradle版本是:gradle-5.6.2-all
问题描述
如何使用混淆器以便在 jPackage 完成其工作之前对代码进行混淆和优化?
我可以 运行 proguard 任务,但是当我 运行 jPackage 时,代码不会被混淆!
我找到了旧 gradle 版本的教程 (Tutorial),但我不确定如何将其与当前插件混合使用。我已经尝试了一些代码片段,但它们都无法构建,我不想用一堆无法工作的代码来扰乱这个主题。
我目前的工作build.gradle
// 1. Include proguard dependency
buildscript {
repositories {
jcenter()
mavenCentral()
}
dependencies {
classpath 'net.sf.proguard:proguard-gradle:6.2.0'
}
}
plugins {
id 'java'
id 'application'
id 'org.openjfx.javafxplugin' version '0.0.8'
id 'org.beryx.runtime' version '1.7.0'
id "com.github.johnrengelman.shadow" version "5.1.0"
}
dependencies {
compile "org.controlsfx:controlsfx:11.0.0"
compile "eu.hansolo:tilesfx:11.13"
compile "com.jfoenix:jfoenix:9.0.9"
compile "org.apache.httpcomponents:httpclient:4.5.9"
compile "org.json:json:20180813"
compile "mysql:mysql-connector-java:8.0.17"
compile "org.jasypt:jasypt:1.9.3"
compile "com.mchange:c3p0:0.9.5.4"
compile "com.sun.mail:javax.mail:1.6.2"
compile "commons-validator:commons-validator:1.6"
compile 'org.openjfx:javafx-base:11:win'
compile 'org.openjfx:javafx-controls:11:win'
compile 'org.openjfx:javafx-fxml:11:win'
compile 'org.openjfx:javafx-graphics:11:win'
}
repositories {
mavenCentral()
}
javafx {
version = "13"
modules = [ 'javafx.controls','javafx.graphics','javafx.fxml' ]
}
mainClassName = 'Main'
runtime {
options = ['--strip-debug', '--compress', '2', '--no-header-files', '--no-man-pages']
jpackage {
jpackageHome = 'C:/Program Files/Java/openjdk-14-jpackage+1-49_windows-x64_bin/'
if(org.gradle.internal.os.OperatingSystem.current().windows) {
installerType = 'msi'
imageOptions = []
installerOptions = ['--win-per-user-install',
'--win-dir-chooser',
'--win-menu',
'--win-shortcut',
'--verbose',
'--description','Test of proguard with jPackage',
'--name', 'Test-ProguardJPackage',
'--vendor','DoesItMatter']
}
}
}
compileJava {
doFirst {
options.compilerArgs = [
'--module-path', classpath.asPath,
'--add-modules', 'javafx.controls,javafx.fxml'
]
}
}
run {
doFirst {
jvmArgs = [
'--module-path', classpath.asPath,
'--add-modules', 'javafx.controls,javafx.fxml'
]
}
}
task cleanClasses(type: Delete) {
delete "${buildDir}/classes/java/main"
delete "${buildDir}/resources/java/main"
}
classes.dependsOn(cleanClasses)
// 2.2 Add proguard task
task proguard(type: proguard.gradle.ProGuardTask, dependsOn: classes) {
injars project.sourceSets.main.output
outjars "${buildDir}/proguard/output.jar"
libraryjars project.sourceSets.main.compileClasspath
configuration 'proguard.conf'
}
// 2.3 Clean after proguard task
task cleanAfterProguard(type: Delete, dependsOn: proguard) {
delete "${buildDir}/classes/java/main"
delete "${buildDir}/resources/java/main"
}
// 2.4 Extract output jar to buildDir
task unpackProguardOutput (type: Copy, dependsOn: cleanAfterProguard) {
from zipTree("${buildDir}/proguard/output.jar")
into file("${buildDir}/classes/java/main")
}
// 3. Create a task to run the app with the proguarded buildDir
task runProguard(type: JavaExec, dependsOn: unpackProguardOutput) {
classpath = sourceSets.main.runtimeClasspath
jvmArgs = ['--module-path', classpath.asPath,
'--add-modules', 'javafx.controls,javafx.fxml' ]
main = 'Main' // <-- this name will depend on the proguard result
}
参考资料
参见 manual,提供依赖关系的 buildscript
块看起来完全不同:
buildscript {
repositories {
flatDir dirs: '/usr/local/java/proguard/lib'
}
dependencies {
classpath ':proguard:'
}
}
虽然它抱怨说它是 unable to resolve class proguard.gradle.ProGuardTask
,但可能不会 proguard.gradle.ProGuardTask
。 dependsOn: 'obfuscatedJar'
很奇怪,因为任务 myProguardTask
应该混淆它。
task myProguardTask(type: proguard.gradle.ProGuardTask) {
...
}
还要确保甚至安装了 /usr/local/java/proguard/lib
,例如。使用 locate proguard
,因为 Java 它不是由 Android SDK 提供的 - 因此必须将其作为 buildscript
依赖项提供。然后,您必须根据混淆时抛出的所有警告编写自定义 proguard.txt
。
更新 proguard-gradle
插件可能是另一种可能的选择:
dependencies {
classpath 'net.sf.proguard:proguard-gradle:6.2.0'
}
作为参考,这应该是 ProGuardTask.java。
问题
当您 运行 一个 Gradle 任务时,您必须根据它们的依赖关系考虑之前将要执行的任务。
在您链接的 答案中,您可以看到混淆器自定义任务在它们之间串联在一起,当您 运行 ./gradlew runProguard
时,实际上您得到了这个顺序任务:
:cleanClasses
:compileJava
:processResources
:classes
:proguard
:cleanAfterProguard
:unpackProguardOutput
:runProguard
如果您想现在添加 runtime
插件,对于 runtime
或 jpackage
之类的任务,您将得到以下命令:
:cleanClasses
:compileJava
:processResources
:classes
:jar
:startScripts
:installDist
:jre
:runtime
你看到问题了吗?根本没有调用混淆器任务,因为我们没有修改 runtime
任务以依赖混淆器。
解决方案
如你所见,runtime
和jpackage
都依赖于项目的jar。因此,一个简单的解决方法是将 proguard
任务连接到 jar
任务中,因此我们使用 proguarded 类 而不是原始的创建一个 jar。
在你的构建中类似这样的东西应该可以工作:
jar.dependsOn(unpackProguardOutput)
但是资源有问题(proguarded FXML文件会被原来的覆盖),因为原来的资源又被复制到jar中了。
所以我们可以改为修改 jar 任务:
jar {
dependsOn 'cleanAfterProguard'
manifest {
attributes(
'Main-Class': 'org.openjfx.Launcher'
)
}
from zipTree("${buildDir}/proguard/output.jar")
}
现在的任务顺序是:
:cleanClasses
:compileJava
:processResources
:classes
:proguard
:cleanAfterProguard
:jar
:startScripts
:installDist
:jre
:runtime
现在 运行ning ./gradlew clean runtime
将根据 proguarded hellofx.jar
生成 运行time 图像。 运行 build/image/bin/hellofx
应该可以。
同样适用于jpackage
:
:cleanClasses
:compileJava
:processResources
:classes
:proguard
:cleanAfterProguard
:jar
:startScripts
:installDist
:jre
:jpackageImage
:jpackage
在这张照片中,您看到 hellofx.app 中包含的 jar 仅包含受保护的 类。
如何在jPackage之前运行混淆?
简介
我正在使用 gradle 插件在 JavaFx 中开发一个应用程序,并使用 jPackager 打包它,还使用 gradle 插件。
我使用的主要插件是:
id 'org.openjfx.javafxplugin' version '0.0.8'
id 'org.beryx.runtime' version '1.7.0'
id "com.github.johnrengelman.shadow" version "5.1.0"
我当前的gradle版本是:gradle-5.6.2-all
问题描述
如何使用混淆器以便在 jPackage 完成其工作之前对代码进行混淆和优化?
我可以 运行 proguard 任务,但是当我 运行 jPackage 时,代码不会被混淆!
我找到了旧 gradle 版本的教程 (Tutorial),但我不确定如何将其与当前插件混合使用。我已经尝试了一些代码片段,但它们都无法构建,我不想用一堆无法工作的代码来扰乱这个主题。
我目前的工作build.gradle
// 1. Include proguard dependency
buildscript {
repositories {
jcenter()
mavenCentral()
}
dependencies {
classpath 'net.sf.proguard:proguard-gradle:6.2.0'
}
}
plugins {
id 'java'
id 'application'
id 'org.openjfx.javafxplugin' version '0.0.8'
id 'org.beryx.runtime' version '1.7.0'
id "com.github.johnrengelman.shadow" version "5.1.0"
}
dependencies {
compile "org.controlsfx:controlsfx:11.0.0"
compile "eu.hansolo:tilesfx:11.13"
compile "com.jfoenix:jfoenix:9.0.9"
compile "org.apache.httpcomponents:httpclient:4.5.9"
compile "org.json:json:20180813"
compile "mysql:mysql-connector-java:8.0.17"
compile "org.jasypt:jasypt:1.9.3"
compile "com.mchange:c3p0:0.9.5.4"
compile "com.sun.mail:javax.mail:1.6.2"
compile "commons-validator:commons-validator:1.6"
compile 'org.openjfx:javafx-base:11:win'
compile 'org.openjfx:javafx-controls:11:win'
compile 'org.openjfx:javafx-fxml:11:win'
compile 'org.openjfx:javafx-graphics:11:win'
}
repositories {
mavenCentral()
}
javafx {
version = "13"
modules = [ 'javafx.controls','javafx.graphics','javafx.fxml' ]
}
mainClassName = 'Main'
runtime {
options = ['--strip-debug', '--compress', '2', '--no-header-files', '--no-man-pages']
jpackage {
jpackageHome = 'C:/Program Files/Java/openjdk-14-jpackage+1-49_windows-x64_bin/'
if(org.gradle.internal.os.OperatingSystem.current().windows) {
installerType = 'msi'
imageOptions = []
installerOptions = ['--win-per-user-install',
'--win-dir-chooser',
'--win-menu',
'--win-shortcut',
'--verbose',
'--description','Test of proguard with jPackage',
'--name', 'Test-ProguardJPackage',
'--vendor','DoesItMatter']
}
}
}
compileJava {
doFirst {
options.compilerArgs = [
'--module-path', classpath.asPath,
'--add-modules', 'javafx.controls,javafx.fxml'
]
}
}
run {
doFirst {
jvmArgs = [
'--module-path', classpath.asPath,
'--add-modules', 'javafx.controls,javafx.fxml'
]
}
}
task cleanClasses(type: Delete) {
delete "${buildDir}/classes/java/main"
delete "${buildDir}/resources/java/main"
}
classes.dependsOn(cleanClasses)
// 2.2 Add proguard task
task proguard(type: proguard.gradle.ProGuardTask, dependsOn: classes) {
injars project.sourceSets.main.output
outjars "${buildDir}/proguard/output.jar"
libraryjars project.sourceSets.main.compileClasspath
configuration 'proguard.conf'
}
// 2.3 Clean after proguard task
task cleanAfterProguard(type: Delete, dependsOn: proguard) {
delete "${buildDir}/classes/java/main"
delete "${buildDir}/resources/java/main"
}
// 2.4 Extract output jar to buildDir
task unpackProguardOutput (type: Copy, dependsOn: cleanAfterProguard) {
from zipTree("${buildDir}/proguard/output.jar")
into file("${buildDir}/classes/java/main")
}
// 3. Create a task to run the app with the proguarded buildDir
task runProguard(type: JavaExec, dependsOn: unpackProguardOutput) {
classpath = sourceSets.main.runtimeClasspath
jvmArgs = ['--module-path', classpath.asPath,
'--add-modules', 'javafx.controls,javafx.fxml' ]
main = 'Main' // <-- this name will depend on the proguard result
}
参考资料
参见 manual,提供依赖关系的 buildscript
块看起来完全不同:
buildscript {
repositories {
flatDir dirs: '/usr/local/java/proguard/lib'
}
dependencies {
classpath ':proguard:'
}
}
虽然它抱怨说它是 unable to resolve class proguard.gradle.ProGuardTask
,但可能不会 proguard.gradle.ProGuardTask
。 dependsOn: 'obfuscatedJar'
很奇怪,因为任务 myProguardTask
应该混淆它。
task myProguardTask(type: proguard.gradle.ProGuardTask) {
...
}
还要确保甚至安装了 /usr/local/java/proguard/lib
,例如。使用 locate proguard
,因为 Java 它不是由 Android SDK 提供的 - 因此必须将其作为 buildscript
依赖项提供。然后,您必须根据混淆时抛出的所有警告编写自定义 proguard.txt
。
更新 proguard-gradle
插件可能是另一种可能的选择:
dependencies {
classpath 'net.sf.proguard:proguard-gradle:6.2.0'
}
作为参考,这应该是 ProGuardTask.java。
问题
当您 运行 一个 Gradle 任务时,您必须根据它们的依赖关系考虑之前将要执行的任务。
在您链接的 ./gradlew runProguard
时,实际上您得到了这个顺序任务:
:cleanClasses
:compileJava
:processResources
:classes
:proguard
:cleanAfterProguard
:unpackProguardOutput
:runProguard
如果您想现在添加 runtime
插件,对于 runtime
或 jpackage
之类的任务,您将得到以下命令:
:cleanClasses
:compileJava
:processResources
:classes
:jar
:startScripts
:installDist
:jre
:runtime
你看到问题了吗?根本没有调用混淆器任务,因为我们没有修改 runtime
任务以依赖混淆器。
解决方案
如你所见,runtime
和jpackage
都依赖于项目的jar。因此,一个简单的解决方法是将 proguard
任务连接到 jar
任务中,因此我们使用 proguarded 类 而不是原始的创建一个 jar。
在你的构建中类似这样的东西应该可以工作:
jar.dependsOn(unpackProguardOutput)
但是资源有问题(proguarded FXML文件会被原来的覆盖),因为原来的资源又被复制到jar中了。
所以我们可以改为修改 jar 任务:
jar {
dependsOn 'cleanAfterProguard'
manifest {
attributes(
'Main-Class': 'org.openjfx.Launcher'
)
}
from zipTree("${buildDir}/proguard/output.jar")
}
现在的任务顺序是:
:cleanClasses
:compileJava
:processResources
:classes
:proguard
:cleanAfterProguard
:jar
:startScripts
:installDist
:jre
:runtime
现在 运行ning ./gradlew clean runtime
将根据 proguarded hellofx.jar
生成 运行time 图像。 运行 build/image/bin/hellofx
应该可以。
同样适用于jpackage
:
:cleanClasses
:compileJava
:processResources
:classes
:proguard
:cleanAfterProguard
:jar
:startScripts
:installDist
:jre
:jpackageImage
:jpackage
在这张照片中,您看到 hellofx.app 中包含的 jar 仅包含受保护的 类。