为了账号安全,请及时绑定邮箱和手机立即绑定

Gradle badass-runtime-plugin 和 ProGuard Gradle 插件

Gradle badass-runtime-plugin 和 ProGuard Gradle 插件

神不在的星期二 2023-10-13 15:09:23
如何在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),但是我不确定如何将其与当前插件混合使用。我尝试了一些代码片段,但它们都无法构建,我不想用一堆不起作用的代码来混淆这个主题。
查看完整描述

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 类。

https://img1.sycdn.imooc.com/6528ed860001cc9606880801.jpg

查看完整回答
反对 回复 2023-10-13
?
米脂

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'

}



查看完整回答
反对 回复 2023-10-13
  • 2 回答
  • 0 关注
  • 120 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信