2 回答

TA貢獻(xiàn)1951條經(jīng)驗(yàn) 獲得超3個(gè)贊
問題
當(dāng)您運(yùn)行 Gradle 任務(wù)時(shí),您必須根據(jù)任務(wù)的依賴關(guān)系考慮之前將執(zhí)行的任務(wù)。
您可以看到 proguard 自定義任務(wù)在它們之間連接起來,當(dāng)您運(yùn)行 時(shí)./gradlew runProguard
,實(shí)際上您會(huì)得到以下任務(wù)順序:
:cleanClasses
:compileJava
:processResources
:classes
:proguard
:cleanAfterProguard
:unpackProguardOutput
:runProguard
如果您現(xiàn)在想添加runtime插件,對(duì)于類似runtime或 之類的任務(wù)jpackage,您將得到以下命令:
:cleanClasses
:compileJava
:processResources
:classes
:jar
:startScripts
:installDist
:jre
:runtime
你看到問題了嗎?根本沒有調(diào)用 proguard 任務(wù),因?yàn)槲覀儧]有修改任務(wù)runtime以依賴 proguard。
解決方案
正如您所看到的,runtime和都jpackage依賴于項(xiàng)目的 jar。因此,一個(gè)簡(jiǎn)單的修復(fù)方法是將任務(wù)連接到任務(wù)proguard中jar,因此我們從 proguarded 類而不是原始類中創(chuàng)建一個(gè) jar。
在你的構(gòu)建中類似這樣的東西應(yīng)該可以工作:
jar.dependsOn(unpackProguardOutput)
但是,資源存在問題(受到混淆的 FXML 文件將被原始文件覆蓋),因?yàn)樵假Y源會(huì)再次復(fù)制到 jar 中。
所以我們可以修改jar任務(wù)來代替:
jar {
? ? dependsOn 'cleanAfterProguard'
? ? manifest {
? ? ? ? attributes(
? ? ? ? ? ? ? ? 'Main-Class': 'org.openjfx.Launcher'
? ? ? ? )
? ? }
? ? from zipTree("${buildDir}/proguard/output.jar")
}
現(xiàn)在這將是任務(wù)順序:
:cleanClasses
:compileJava
:processResources
:classes
:proguard
:cleanAfterProguard
:jar
:startScripts
:installDist
:jre
:runtime
現(xiàn)在運(yùn)行./gradlew clean runtime將生成一個(gè)基于 proguarded 的運(yùn)行時(shí)映像hellofx.jar。跑步build/image/bin/hellofx應(yīng)該有效。
這同樣適用于jpackage:
:cleanClasses
:compileJava
:processResources
:classes
:proguard
:cleanAfterProguard
:jar
:startScripts
:installDist
:jre
:jpackageImage
:jpackage
在這張圖片中,您可以看到 hellofx.app 中包含的 jar 僅包含 proguarded 類。

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超3個(gè)贊
buildscript
提供依賴項(xiàng)的塊看起來完全不同:
buildscript {
? ? repositories {
? ? ? ? flatDir dirs: '/usr/local/java/proguard/lib'
? ? }
? ? dependencies {
? ? ? ? classpath ':proguard:'
? ? }
}
雖然它抱怨說確實(shí)如此unable to resolve class proguard.gradle.ProGuardTask,但很可能不會(huì)有任何proguard.gradle.ProGuardTask。這dependsOn: 'obfuscatedJar'很奇怪,因?yàn)槿蝿?wù)myProguardTask應(yīng)該會(huì)混淆它。
task myProguardTask(type: proguard.gradle.ProGuardTask) {
? ? ...
}
還要確保/usr/local/java/proguard/lib甚至已安裝,例如。,locate proguard因?yàn)閷?duì)于 Java,Android SDK 不提供它 - 因此必須將其作為buildscript依賴項(xiàng)提供。然后,您必須proguard.txt根據(jù)混淆時(shí)拋出的所有警告編寫一個(gè)自定義。
更新proguard-gradle插件可能是另一種可能的選擇:
dependencies {
? ? classpath 'net.sf.proguard:proguard-gradle:6.2.0'
}
添加回答
舉報(bào)