Gradle badass-runtime-pluginおよびProGuard Gradle Plugin


8

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です

問題の説明

jPackageが機能する前にコードを難読化および最適化するために、どのようにプロガードを使用しますか?

proguardタスクを実行できますが、jPackageを実行してもコードが難読化されません。

古いGradleバージョンのチュートリアル(チュートリアル)を見つけましたが、これを現在のプラグインとどのように組み合わせるかわかりません。私はいくつかのコードスニペットを試しましたが、それらはすべてビルドに失敗し、このトピックを機能しないコードの束で乱雑にしたくありません。

私の現在働いている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
}

参考文献

非モジュラーJavaFXアプリケーションをパッケージ化する

JavaFX Proguard難読化


回答:


1

問題

Gradleタスクを実行するときは、依存関係に基づいて、以前に実行されるタスクを考慮する必要があります。

リンクしたJavaFX Proguard難読化の回答では、proguardカスタムタスクがタスク間で連結されていることがわかります./gradlew runProguard。実際にを実行すると、次の順序でタスクが実行されます。

:cleanClasses
:compileJava
:processResources
:classes
:proguard
:cleanAfterProguard
:unpackProguardOutput
:runProguard

runtimeプラグインを追加したい場合は、runtimeまたはのようなタスクの場合jpackage、次の順序になります。

:cleanClasses
:compileJava
:processResources
:classes
:jar
:startScripts
:installDist
:jre
:runtime

あなたは問題を見ますか?プロガードruntimeに依存するようにタスクを変更していないため、プロガードタスクへの呼び出しはまったくありません。

解決

あなたが見る、両方のようにruntimeしてjpackageプロジェクトのjarファイルに依存します。したがって、1つの簡単な修正は、proguardタスクをタスクにフックすることjarです。そのため、元のクラスではなく、保護されたクラスからjarを作成します。

ビルドで次のようなものが機能するはずです。

jar.dependsOn(unpackProguardOutput)

ただし、元のリソースがjarに再度コピーされるため、リソースに問題があります(保護されたFXMLファイルは元のファイルで上書きされます)。

そのため、代わりに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すると、保護されたに基づいてランタイムイメージが生成されますhellofx.jar。実行build/image/bin/hellofx動作するはずです。

同じことが当てはまりますjpackage

:cleanClasses
:compileJava
:processResources
:classes
:proguard
:cleanAfterProguard
:jar
:startScripts
:installDist
:jre
:jpackageImage
:jpackage

この写真では、hellofx.appに含まれているjarに、保護されたクラスのみが含まれていることがわかります。


回答をありがとうございます。ただし、あなたの回答にはshadowjarのdepが必要なので、私はまだ機能していません。したがって、Jar {}は使用されません。[タスク ':cleanClasses'、タスク ':compileJava'、タスク ':processResources'、タスク ':classes'、タスク ':shadowJar'、タスク ':startShadowScripts'、タスク ':installShadowDist'、タスク ':jre'、タスク':jpackageImage'、タスク ':jpackage']
KenobiShan

1
そもそもなぜシャドウプラグインが必要なのですか?インストーラーを実行しています。ビルドをニーズに合わせて、不要なものを削除します。
ホセ・ペリーダ

シャドウプラグインを使用した理由がわかりません。私は削除し、現在動作しています:github.com/KenobySky/hellofx
KenobiShan

1
すごい。を削除し、ビルドからJavaFXの依存関係を削除するcompileJavarun、そのすべてがJavaFXプラグインによって処理されます。
ホセ・ペリーダ

1
これら:compile “.org.openjfx:...”
ホセ・ペリーダ

0

マニュアルを参照してください。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、もう1つは持っているようにそれを提供するために- JavaのためにそれがAndroidのSDKで提供されていないので、buildscript依存関係。次にproguard.txt、難読化するときにスローされるすべての警告に基づいて、カスタムを作成する必要があります。


proguard-gradleプラグインの更新は別の可能なオプションかもしれません:

dependencies {
    classpath 'net.sf.proguard:proguard-gradle:6.2.0'
}

参考までに、これはProGuardTask.javaです。


javafxビルドのタスクを作成する方法を適切に説明していません。また、Jpackageはビルド後に実行されることにも注意してください。だからあなたの答えは不完全です。
KenobiShan

@KenobiShanhowは、Javaコードがない場合、これに完全に答えますか?proguardタスクを追加する場合、これには構成ルールの記述が必要になります。これは、proguardが欠落しているクラスなどについて不平を言っているときにのみ記述できます。
Martin

build.gradleには「Javaコード」は必要ありません。問題は、関連するプラグインおよび関連するproguardでのproguardの使用に関することです。一般的なJavaアプリケーションではproguardの使用は簡単ですが、これらの制限があるため、この問題について人々は好奇心をそそられます
KenobiShan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.