Wie starte ich Proguard vor jPackage?
Einführung
Ich entwickle eine App in JavaFx mit Gradle-Plugins und packe sie mit jPackager, auch mit den Gradle-Plugins.
Die wichtigsten Plugins, die ich benutze, sind:
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"
Meine aktuelle Gradle-Version ist: gradle-5.6.2-all
Problembeschreibung
Wie verwende ich Proguard, damit der Code verschleiert und optimiert wird, bevor jPackage seine Arbeit erledigt?
Ich kann die Proguard-Aufgaben ausführen, aber wenn ich jPackage ausführe, wird der Code nicht verschleiert!
Ich habe ein Tutorial ( Tutorial ) für eine ältere Gradle-Version gefunden, bin mir jedoch nicht sicher, wie ich dies mit den aktuellen Plugins mischen soll. Ich habe ein paar Code-Schnipsel ausprobiert, aber sie konnten nicht alle erstellt werden, und ich möchte dieses Thema nicht mit einer Menge nicht funktionierenden Codes überladen.
Mein aktuell arbeitendes 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
}
Verweise
Packen Sie eine nicht modulare JavaFX-Anwendung
JavaFX Proguard-Verschleierung
compileJava
,run
wird all dies vom JavaFX-Plugin erledigt.compile “.org.openjfx:...”
Siehe Handbuch , der
buildscript
Block, der die Abhängigkeit bereitstellt, sieht ganz anders aus:Während es sich beschwert, dass es ist
unable to resolve class proguard.gradle.ProGuardTask
, wird es wahrscheinlich keine gebenproguard.gradle.ProGuardTask
. UnddependsOn: 'obfuscatedJar'
ist seltsam, weil die AufgabemyProguardTask
es verschleiern soll.Stellen Sie auch sicher, dass
/usr/local/java/proguard/lib
das sogar installiert ist, z. mitlocate proguard
, weil es für Java nicht vom Android SDK bereitgestellt wird - und daher muss es alsbuildscript
Abhängigkeit bereitgestellt werden . Dann müssen Sie einen benutzerdefinierten Code schreibenproguard.txt
, der auf allen Warnungen basiert, die beim Verschleiern ausgegeben werden.Das Aktualisieren des
proguard-gradle
Plugins ist möglicherweise eine weitere mögliche Option:Als Referenz wäre dies ProGuardTask.java .
quelle