Gradle badass-runtime-plugin 和 ProGuard Gradle 插件

如何在jPackage之前运行proguard?

介绍

我使用 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

问题描述

如何使用 proguard 以便在 jPackage 完成其工作之前对代码进行混淆和优化?

我可以运行 proguard 任务,但是当我运行 jPackage 时,代码不会被混淆!

我找到了旧版 gradle 版本的教程(Tutorial),但是我不确定如何将其与当前插件混合使用。我尝试了一些代码片段,但它们都无法构建,我不想用一堆不起作用的代码来混淆这个主题。


神不在的星期二
浏览 76回答 2
2回答

饮歌长啸

问题当您运行 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 类。

米脂

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'}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java