2 回答
TA贡献1951条经验 获得超3个赞
问题
当您运行 Gradle 任务时,您必须根据任务的依赖关系考虑之前将执行的任务。
您可以看到 proguard 自定义任务在它们之间连接起来,当您运行 时./gradlew runProguard
,实际上您会得到以下任务顺序:
:cleanClasses
:compileJava
:processResources
:classes
:proguard
:cleanAfterProguard
:unpackProguardOutput
:runProguard
如果您现在想添加runtime插件,对于类似runtime或 之类的任务jpackage,您将得到以下命令:
:cleanClasses
:compileJava
:processResources
:classes
:jar
:startScripts
:installDist
:jre
:runtime
你看到问题了吗?根本没有调用 proguard 任务,因为我们没有修改任务runtime以依赖 proguard。
解决方案
正如您所看到的,runtime和都jpackage依赖于项目的 jar。因此,一个简单的修复方法是将任务连接到任务proguard中jar,因此我们从 proguarded 类而不是原始类中创建一个 jar。
在你的构建中类似这样的东西应该可以工作:
jar.dependsOn(unpackProguardOutput)
但是,资源存在问题(受到混淆的 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
现在运行./gradlew clean runtime将生成一个基于 proguarded 的运行时映像hellofx.jar。跑步build/image/bin/hellofx应该有效。
这同样适用于jpackage:
:cleanClasses
:compileJava
:processResources
:classes
:proguard
:cleanAfterProguard
:jar
:startScripts
:installDist
:jre
:jpackageImage
:jpackage
在这张图片中,您可以看到 hellofx.app 中包含的 jar 仅包含 proguarded 类。
TA贡献1836条经验 获得超3个赞
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'
}
添加回答
举报