ネイティブ配布
ここでは、ネイティブ配布について学びます。サポートされているすべてのシステム向けのインストーラーやパッケージの作成方法、および配布用と同じ設定でアプリケーションをローカルで実行する方法について説明します。
以下のトピックの詳細については、このまま読み進めてください。
- Compose Multiplatform Gradle プラグインとは
- 基本的なタスクの詳細(アプリケーションのローカル実行など)と、高度なタスク(ミニファイや難読化など)
- JDK モジュールの含め方と
ClassNotFoundExceptionへの対処法 - 配布プロパティの指定方法:パッケージバージョン、JDK バージョン、出力ディレクトリ、ランチャープロパティ、メタデータ
- リソースの管理方法:リソースライブラリの使用、JVM リソースのロード、パッケージ化されたアプリケーションへのファイルの追加
- ソースセットのカスタマイズ方法:Gradle ソースセット、Kotlin JVM ターゲット、または手動による設定
- アプリケーションアイコンの指定方法(各 OS ごと)
- プラットフォーム固有のオプション:Linux のパッケージメンテナーのメールアドレスや、macOS の Apple App Store 用アプリカテゴリなど
- macOS 固有の設定:署名、公証(Notarization)、
Info.plist
Gradle プラグイン
このガイドは、主に Compose Multiplatform Gradle プラグインを使用した Compose アプリケーションのパッケージ化に焦点を当てています。 org.jetbrains.compose プラグインは、基本的なパッケージ化、難読化、および macOS のコード署名のためのタスクを提供します。
このプラグインは、jpackage を使用したネイティブ配布用のパッケージ化プロセスと、ローカルでのアプリケーション実行を簡素化します。 配布可能なアプリケーションは、必要なすべての Java ランタイムコンポーネントを含む自己完結型のインストール可能なバイナリであり、ターゲットシステムに JDK がインストールされている必要はありません。
パッケージサイズを最小限に抑えるために、Gradle プラグインは jlink ツールを使用して、配布パッケージに必要な Java モジュールのみが含まれるようにします。 ただし、どのモジュールが必要かを指定するために Gradle プラグインを設定する必要があります。 詳細については、JDK モジュールの含め方のセクションを参照してください。
代替案として、JetBrains が開発していない外部ツールである Conveyor を使用することもできます。 Conveyor はオンラインアップデート、クロスビルド、およびその他のさまざまな機能をサポートしていますが、オープンソースでないプロジェクトにはライセンスが必要です。 詳細については、Conveyor のドキュメントを参照してください。
基本的なタスク
Compose Multiplatform Gradle プラグインにおける基本的な設定単位は application です(非推奨となった Gradle application プラグインと混同しないでください)。
application DSL メソッドは、最終的なバイナリセットの共有設定を定義します。これにより、ファイルのコレクションを JDK ディストリビューションとともに、さまざまな形式の圧縮されたバイナリインストーラーにパックできます。
サポートされているオペレーティングシステムでは、以下の形式が利用可能です。
- macOS:
.dmg(TargetFormat.Dmg)、.pkg(TargetFormat.Pkg) - Windows:
.exe(TargetFormat.Exe)、.msi(TargetFormat.Msi) - Linux:
.deb(TargetFormat.Deb)、.rpm(TargetFormat.Rpm)
以下は、基本的なデスクトップ設定を含む build.gradle.kts ファイルの例です。
import org.jetbrains.compose.desktop.application.dsl.TargetFormat
plugins {
kotlin("jvm")
id("org.jetbrains.compose")
}
dependencies {
implementation(compose.desktop.currentOs)
}
compose.desktop {
application {
mainClass = "example.MainKt"
nativeDistributions {
targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Exe)
}
}
}プロジェクトをビルドすると、プラグインは以下のタスクを作成します。
| Gradle タスク | 説明 |
package<FormatName> | アプリケーションを対応する FormatName バイナリにパッケージ化します。現在、クロスコンパイルはサポートされていません。 つまり、特定の形式をビルドするには、対応する互換性のある OS を使用する必要があります。 たとえば、.dmg バイナリをビルドするには、macOS で packageDmg タスクを実行する必要があります。 現在の OS と互換性のないタスクは、デフォルトでスキップされます。 |
packageDistributionForCurrentOS | アプリケーションのすべてのパッケージタスクを集約します。これは ライフサイクルタスク です。 |
packageUberJarForCurrentOS | 現在のオペレーティングシステムのすべての依存関係を含む単一の jar ファイルを作成します。 このタスクは、compose.desktop.currentOS が compile、implementation、または runtime 依存関係として使用されていることを想定しています。 |
run | mainClass で指定されたエントリポイントからアプリケーションをローカルで実行します。run タスクは、フルランタイムを備えたパッケージ化されていない JVM アプリケーションを起動します。 この方法は、ランタイムを最小化したコンパクトなバイナリイメージを作成するよりも高速でデバッグが容易です。 最終的なバイナリイメージを実行するには、代わりに runDistributable タスクを使用してください。 |
createDistributable | インストーラーを作成せずに、最終的なアプリケーションイメージを作成します。 |
runDistributable | 事前パッケージ化されたアプリケーションイメージを実行します。 |
利用可能なすべてのタスクは、Gradle ツールウィンドウにリストされます。タスクを実行すると、Gradle は ${project.buildDir}/compose/binaries ディレクトリに出力バイナリを生成します。
JDK モジュールの含め方
配布サイズを削減するために、Gradle プラグインは jlink を使用して、必要な JDK モジュールのみをバンドルします。
現時点では、Gradle プラグインは必要な JDK モジュールを自動的に判断しません。これはコンパイルエラーの原因にはなりませんが、 必要なモジュールが提供されない場合、実行時に ClassNotFoundException が発生する可能性があります。
パッケージ化されたアプリケーションまたは runDistributable タスクの実行時に ClassNotFoundException が発生した場合は、modules DSL メソッドを使用して追加の JDK モジュールを含めることができます。
compose.desktop {
application {
nativeDistributions {
modules("java.sql")
// または: includeAllModules = true
}
}
}必要なモジュールを手動で指定するか、suggestModules を実行することができます。suggestModules タスクは jdeps 静的解析ツールを使用して、不足している可能性のあるモジュールを特定します。 ツールの出力は不完全であったり、不要なモジュールがリストされたりする場合があることに注意してください。
配布物のサイズが重要な要素ではなく、無視できる場合は、includeAllModules DSL プロパティを使用してすべてのランタイムモジュールを含めることを選択できます。
配布プロパティの指定方法
パッケージバージョン
ネイティブ配布パッケージには、特定のパッケージバージョンが必要です。 パッケージバージョンを指定するには、以下の DSL プロパティを使用できます。これらは優先度の高い順に並んでいます。
nativeDistributions.<os>.<packageFormat>PackageVersionは、単一のパッケージ形式のバージョンを指定します。nativeDistributions.<os>.packageVersionは、単一のターゲット OS のバージョンを指定します。nativeDistributions.packageVersionは、すべてのパッケージのバージョンを指定します。
macOS では、以下の DSL プロパティを使用してビルドバージョンを指定することもできます。これも優先度の高い順に並んでいます。
nativeDistributions.macOS.<packageFormat>PackageBuildVersionは、単一のパッケージ形式のビルドバージョンを指定します。nativeDistributions.macOS.packageBuildVersionは、すべての macOS パッケージのビルドバージョンを指定します。
ビルドバージョンを指定しない場合、Gradle は代わりにパッケージバージョンを使用します。macOS でのバージョニングの詳細については、 CFBundleShortVersionString および CFBundleVersion のドキュメントを参照してください。
以下は、優先順位に従ってパッケージバージョンを指定するためのテンプレートです。
compose.desktop {
application {
nativeDistributions {
// すべてのパッケージのバージョン
packageVersion = "..."
macOS {
// すべての macOS パッケージのバージョン
packageVersion = "..."
// dmg パッケージのみのバージョン
dmgPackageVersion = "..."
// pkg パッケージのみのバージョン
pkgPackageVersion = "..."
// すべての macOS パッケージのビルドバージョン
packageBuildVersion = "..."
// dmg パッケージのみのビルドバージョン
dmgPackageBuildVersion = "..."
// pkg パッケージのみのビルドバージョン
pkgPackageBuildVersion = "..."
}
windows {
// すべての Windows パッケージのバージョン
packageVersion = "..."
// msi パッケージのみのバージョン
msiPackageVersion = "..."
// exe パッケージのみのバージョン
exePackageVersion = "..."
}
linux {
// すべての Linux パッケージのバージョン
packageVersion = "..."
// deb パッケージのみのバージョン
debPackageVersion = "..."
// rpm パッケージのみのバージョン
rpmPackageVersion = "..."
}
}
}
}パッケージバージョンを定義するには、以下のルールに従ってください。
| ファイル形式 | バージョン形式 | 詳細 |
dmg, pkg | MAJOR[.MINOR][.PATCH] |
|
msi, exe | MAJOR.MINOR.BUILD |
|
deb | [EPOCH:]UPSTREAM_VERSION[-DEBIAN_REVISION] |
|
rpm | 任意の形式 | バージョンに - (ハイフン) 文字を含めることはできません。 |
JDK バージョン
このプラグインは jpackage を使用します。これには JDK 17 以上の JDK バージョンが必要です。 JDK バージョンを指定するときは、以下の要件の少なくとも 1 つを満たしていることを確認してください。
JAVA_HOME環境変数が、互換性のある JDK バージョンを指している。DSL を介して
javaHomeプロパティが設定されている:kotlincompose.desktop { application { javaHome = System.getenv("JDK_17") } }
出力ディレクトリ
ネイティブ配布用にカスタム出力ディレクトリを使用するには、以下に示すように outputBaseDir プロパティを設定します。
compose.desktop {
application {
nativeDistributions {
outputBaseDir.set(project.layout.buildDirectory.dir("customOutputDir"))
}
}
}ランチャープロパティ
アプリケーションの起動プロセスを調整するために、以下のプロパティをカスタマイズできます。
| プロパティ | 説明 |
mainClass | main メソッドを含むクラスの完全修飾名。 |
args | アプリケーションの main メソッドへの引数。 |
jvmArgs | アプリケーションの JVM への引数。 |
設定例を以下に示します。
compose.desktop {
application {
mainClass = "MainKt"
args += listOf("-customArgument")
jvmArgs += listOf("-Xmx2G")
}
}メタデータ
nativeDistributions DSL ブロック内で、以下のプロパティを設定できます。
| プロパティ | 説明 | デフォルト値 |
packageName | アプリケーション名。 | Gradle プロジェクトの 名前 (name) |
packageVersion | アプリケーションのバージョン。 | Gradle プロジェクトの バージョン (version) |
description | アプリケーションの説明。 | なし |
copyright | アプリケーションの著作権情報。 | なし |
vendor | アプリケーションのベンダー。 | なし |
licenseFile | アプリケーションのライセンスファイル。 | なし |
設定例を以下に示します。
compose.desktop {
application {
nativeDistributions {
packageName = "ExampleApp"
packageVersion = "0.1-SNAPSHOT"
description = "Compose Multiplatform App"
copyright = "© 2024 My Name. All rights reserved."
vendor = "Example vendor"
licenseFile.set(project.file("LICENSE.txt"))
}
}
}リソースの管理
リソースをパッケージ化してロードするには、Compose Multiplatform リソースライブラリ、JVM リソースロードを使用するか、パッケージ化されたアプリケーションにファイルを追加します。
リソースライブラリ
プロジェクトのリソースをセットアップする最も簡単な方法は、リソースライブラリを使用することです。 リソースライブラリを使用すると、サポートされているすべてのプラットフォームにわたる共通コードからリソースにアクセスできます。 詳細については、マルチプラットフォームリソース を参照してください。
JVM リソースロード
デスクトップ用の Compose Multiplatform は JVM プラットフォーム上で動作するため、java.lang.Class API を使用して .jar ファイルからリソースをロードできます。src/main/resources ディレクトリ内のファイルには、Class::getResource または Class::getResourceAsStream を介してアクセスできます。
パッケージ化されたアプリケーションへのファイルの追加
.jar ファイルからリソースをロードするのがあまり実用的でない場合があります。たとえば、ターゲット固有のアセットがあり、macOS パッケージには含めるが Windows パッケージには含めたくないファイルがある場合などです。
このような場合、インストールディレクトリに追加のリソースファイルを含めるように Gradle プラグインを設定できます。 以下のように DSL を使用して、ルートリソースディレクトリを指定します。
compose.desktop {
application {
mainClass = "MainKt"
nativeDistributions {
targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb)
packageVersion = "1.0.0"
appResourcesRootDir.set(project.layout.projectDirectory.dir("resources"))
}
}
}上記の例では、ルートリソースディレクトリは <PROJECT_DIR>/resources として定義されています。
Gradle プラグインは、以下のようにリソースサブディレクトリからファイルを取り込みます。
共通リソース:
<RESOURCES_ROOT_DIR>/commonにあるファイルは、ターゲットの OS やアーキテクチャに関係なく、すべてのパッケージに含まれます。OS 固有のリソース:
<RESOURCES_ROOT_DIR>/<OS_NAME>にあるファイルは、特定のオペレーティングシステム用にビルドされたパッケージにのみ含まれます。<OS_NAME>の有効な値は、windows、macos、linuxです。OS およびアーキテクチャ固有のリソース:
<RESOURCES_ROOT_DIR>/<OS_NAME>-<ARCH_NAME>にあるファイルは、特定のオペレーティングシステムと CPU アーキテクチャの組み合わせに対してビルドされたパッケージにのみ含まれます。<ARCH_NAME>の有効な値は、x64およびarm64です。 たとえば、<RESOURCES_ROOT_DIR>/macos-arm64内のファイルは、Apple シリコン搭載の Mac 用のパッケージにのみ含まれます。
compose.application.resources.dir システムプロパティを使用して、含まれているリソースにアクセスできます。
import java.io.File
val resourcesDir = File(System.getProperty("compose.application.resources.dir"))
fun main() {
println(resourcesDir.resolve("resource.txt").readText())
}カスタムソースセット
org.jetbrains.kotlin.jvm または org.jetbrains.kotlin.multiplatform プラグインを使用している場合は、デフォルト設定を利用できます。
org.jetbrains.kotlin.jvmを使用した設定には、mainソースセット の内容が含まれます。org.jetbrains.kotlin.multiplatformを使用した設定には、単一の JVM ターゲット の内容が含まれます。 複数の JVM ターゲットを定義すると、デフォルト設定は無効になります。この場合、プラグインを手動で設定するか、単一のターゲットを指定する必要があります(下記参照)。
デフォルト設定が曖昧または不十分な場合は、いくつかの方法でカスタマイズできます。
Gradle ソースセット を使用する場合:
plugins {
kotlin("jvm")
id("org.jetbrains.compose")
}
val customSourceSet = sourceSets.create("customSourceSet")
compose.desktop {
application {
from(customSourceSet)
}
}Kotlin JVM ターゲット を使用する場合:
plugins {
kotlin("multiplatform")
id("org.jetbrains.compose")
}
kotlin {
jvm("customJvmTarget") {}
}
compose.desktop {
application {
from(kotlin.targets["customJvmTarget"])
}
}手動で設定する場合:
- デフォルト設定を無効にするには
disableDefaultConfigurationを使用します。 - 含めるファイルを指定するには
fromFilesを使用します。 - メインクラスを含む
.jarファイルを指すようにmainJarファイルプロパティを指定します。 - すべてのプラグインタスクにタスク依存関係を追加するには
dependsOnを使用します。
compose.desktop {
application {
disableDefaultConfiguration()
fromFiles(project.fileTree("libs/") { include("**/*.jar") })
mainJar.set(project.file("main.jar"))
dependsOn("mainJarTask")
}
}アプリケーションアイコン
アプリのアイコンが、以下の OS 固有の形式で利用可能であることを確認してください。
- macOS 用:
.icns - Windows 用:
.ico - Linux 用:
.png
compose.desktop {
application {
nativeDistributions {
macOS {
iconFile.set(project.file("icon.icns"))
}
windows {
iconFile.set(project.file("icon.ico"))
}
linux {
iconFile.set(project.file("icon.png"))
}
}
}
}プラットフォーム固有のオプション
プラットフォーム固有の設定は、対応する DSL ブロックを使用して構成できます。
compose.desktop {
application {
nativeDistributions {
macOS {
// macOS 用のオプション
}
windows {
// Windows 用のオプション
}
linux {
// Linux 用のオプション
}
}
}
}以下の表は、サポートされているすべてのプラットフォーム固有のオプションを示しています。ドキュメント化されていないプロパティの使用は 推奨されません。
| プラットフォーム | オプション | 説明 |
| 全プラットフォーム | iconFile.set(File("PATH_TO_ICON")) | アプリケーションのプラットフォーム固有のアイコンへのパスを指定します。詳細は アプリケーションアイコン セクションを参照してください。 |
packageVersion = "1.0.0" | プラットフォーム固有のパッケージバージョンを設定します。詳細は パッケージバージョン セクションを参照してください。 | |
installationPath = "PATH_TO_INST_DIR" | デフォルトのインストールディレクトリへの絶対パスまたは相対パスを指定します。 Windows では、インストール中にパスをカスタマイズできるように dirChooser = true を使用することもできます。 | |
| Linux | packageName = "custom-package-name" | デフォルトのアプリケーション名をオーバーライドします。 |
debMaintainer = "[email protected]" | パッケージメンテナーのメールアドレスを指定します。 | |
menuGroup = "my-example-menu-group" | アプリケーションのメニューグループを定義します。 | |
appRelease = "1" | rpm パッケージのリリース値、または deb パッケージのリビジョン値を設定します。 | |
appCategory = "CATEGORY" | rpm パッケージのグループ値、または deb パッケージのセクション値を割り当てます。 | |
rpmLicenseType = "TYPE_OF_LICENSE" | rpm パッケージのライセンスの種類を指定します。 | |
debPackageVersion = "DEB_VERSION" | deb 固有のパッケージバージョンを設定します。詳細は パッケージバージョン セクションを参照してください。 | |
rpmPackageVersion = "RPM_VERSION" | rpm 固有のパッケージバージョンを設定します。詳細は パッケージバージョン セクションを参照してください。 | |
| macOS | bundleID | 一意のアプリケーション識別子を指定します。これには英数字(A-Z、a-z、0-9)、ハイフン(-)、 ピリオド(.)のみを含めることができます。リバース DNS 表記(com.mycompany.myapp)の使用が推奨されます。 |
packageName | アプリケーションの名前。 | |
dockName | メニューバー、「<アプリ>について」メニュー項目、および Dock に表示されるアプリケーションの名前。 デフォルト値は packageName です。 | |
minimumSystemVersion | アプリケーションの実行に必要な最小 macOS バージョン。詳細は LSMinimumSystemVersion を参照してください。 | |
signing, notarization, provisioningProfile, runtimeProvisioningProfile | macOS 用の配布物の署名と公証 チュートリアルを参照してください。 | |
appStore = true | Apple App Store 用にアプリをビルドして署名するかどうかを指定します。JDK 17 以上が必要です。 | |
appCategory | Apple App Store 用のアプリのカテゴリ。App Store 用にビルドする場合、デフォルト値は public.app-category.utilities で、それ以外の場合は Unknown です。 有効なカテゴリのリストについては LSApplicationCategoryType を参照してください。 | |
entitlementsFile.set(File("PATH_ENT")) | 署名時に使用されるエンタイトルメントを含むファイルへのパスを指定します。カスタムファイルを提供するときは、 Java アプリケーションに必要なエンタイトルメントを追加してください。App Store 用にビルドするときに使用されるデフォルトのファイルについては、 sandbox.plist を参照してください。このデフォルトファイルは JDK バージョンによって異なる場合があることに注意してください。 ファイルが指定されていない場合、プラグインは jpackage によって提供されるデフォルトのエンタイトルメントを使用します。 詳細は macOS 用の配布物の署名と公証 チュートリアルを参照してください。 | |
runtimeEntitlementsFile.set(File("PATH_R_ENT")) | JVM ランタイムの署名時に使用されるエンタイトルメントを含むファイルへのパスを指定します。カスタムファイルを提供するときは、 Java アプリケーションに必要なエンタイトルメントを追加してください。デフォルトのファイルについては sandbox.plist を参照してください。詳細は macOS 用の配布物の署名と公証 チュートリアルを参照してください。 | |
dmgPackageVersion = "DMG_VERSION" | DMG 固有のパッケージバージョンを設定します。詳細は パッケージバージョン セクションを参照してください。 | |
pkgPackageVersion = "PKG_VERSION" | PKG 固有のパッケージバージョンを設定します。詳細は パッケージバージョン セクションを参照してください。 | |
packageBuildVersion = "DMG_VERSION" | パッケージのビルドバージョンを設定します。詳細は パッケージバージョン セクションを参照してください。 | |
dmgPackageBuildVersion = "DMG_VERSION" | DMG 固有のパッケージビルドバージョンを設定します。詳細は パッケージバージョン セクションを参照してください。 | |
pkgPackageBuildVersion = "PKG_VERSION" | PKG 固有のパッケージビルドバージョンを設定します。詳細は パッケージバージョン セクションを参照してください。 | |
infoPlist | macOS での Info.plist セクションを参照してください。 | |
| Windows | console = true | アプリケーションにコンソールランチャーを追加します。 |
dirChooser = true | インストール中にインストールパスをカスタマイズできるようにします。 | |
perUserInstall = true | アプリケーションをユーザーごとにインストールできるようにします。 | |
menuGroup = "start-menu-group" | 指定したスタートメニューグループにアプリケーションを追加します。 | |
upgradeUuid = "UUID" | インストールされているバージョンよりも新しいバージョンがある場合に、ユーザーがインストーラーを介して アプリケーションを更新できるようにする一意の ID を指定します。値は単一のアプリケーションに対して一定である必要があります。 詳細については How To: Generate a GUID を参照してください。 | |
msiPackageVersion = "MSI_VERSION" | MSI 固有のパッケージバージョンを設定します。詳細は パッケージバージョン セクションを参照してください。 | |
exePackageVersion = "EXE_VERSION" | EXE 固有のパッケージバージョンを設定します。詳細は パッケージバージョン セクションを参照してください。 |
macOS 固有の設定
macOS での署名と公証
最新の macOS バージョンでは、インターネットからダウンロードした署名されていないアプリケーションの実行を許可していません。そのようなアプリケーションを実行しようとすると、次のエラーが発生します:「"YourApp"は壊れているため開けません。ディスクイメージを取り出す必要があります。」
アプリケーションに署名して公証する方法については、こちらの チュートリアル を参照してください。
macOS での Information property list
DSL は重要なプラットフォーム固有のカスタマイズをサポートしていますが、提供されている機能だけでは不十分な場合があります。 DSL で表現されていない Info.plist の値を指定する必要がある場合は、回避策として生の XML スニペットを含めることができます。この XML はアプリケーションの Info.plist に追加されます。
例:ディープリンク
build.gradle.ktsファイルでカスタム URL スキームを定義します。
compose.desktop {
application {
mainClass = "MainKt"
nativeDistributions {
targetFormats(TargetFormat.Dmg)
packageName = "Deep Linking Example App"
macOS {
bundleID = "org.jetbrains.compose.examples.deeplinking"
infoPlist {
extraKeysRawXml = macExtraPlistKeys
}
}
}
}
}
val macExtraPlistKeys: String
get() = """
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>Example deep link</string>
<key>CFBundleURLSchemes</key>
<array>
<string>compose</string>
</array>
</dict>
</array>
"""java.awt.Desktopクラスを使用して、src/main/main.ktファイルに URI ハンドラーをセットアップします。
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.compose.ui.window.singleWindowApplication
import java.awt.Desktop
fun main() {
var text by mutableStateOf("Hello, World!")
try {
Desktop.getDesktop().setOpenURIHandler { event ->
text = "Open URI: " + event.uri
}
} catch (e: UnsupportedOperationException) {
println("setOpenURIHandler is unsupported")
}
singleWindowApplication {
MaterialTheme {
Text(text)
}
}
}runDistributableタスクを実行します:./gradlew runDistributable
その結果、compose://foo/bar のようなリンクをブラウザからアプリケーションにリダイレクトできるようになります。
ミニファイと難読化
Compose Multiplatform Gradle プラグインには、ProGuard のサポートが組み込まれています。 ProGuard は、コードのミニファイ(縮小化)と難読化のための オープンソースツール です。
各 デフォルト パッケージングタスク(ProGuard なし)に対して、Gradle プラグインは リリース タスク(ProGuard あり)を提供します。
| Gradle タスク | 説明 |
デフォルト: リリース: | JDK とリソースがバンドルされたアプリケーションイメージを作成します。 |
デフォルト: リリース: | JDK とリソースがバンドルされたアプリケーションイメージを実行します。 |
デフォルト: リリース: | Gradle JDK を使用して、パッケージ化されていないアプリケーション .jar を実行します。 |
デフォルト: リリース: | アプリケーションイメージを <FORMAT_NAME> ファイルにパッケージ化します。 |
デフォルト: リリース: | 現在の OS と互換性のある形式でアプリケーションイメージをパッケージ化します。 |
デフォルト: リリース: | アプリケーションイメージを uber (fat) .jar にパッケージ化します。 |
デフォルト: リリース: | 公証のために <FORMAT_NAME> アプリケーションイメージをアップロードします(macOS のみ)。 |
デフォルト: リリース: | 公証が成功したかどうかを確認します(macOS のみ)。 |
デフォルト設定では、いくつかの定義済みの ProGuard ルールが有効になっています。
- アプリケーションイメージがミニファイされ、使用されていないクラスが削除されます。
compose.desktop.application.mainClassがエントリポイントとして使用されます。- Compose ランタイムが機能し続けることを保証するために、いくつかの
keepルールが含まれています。
ほとんどの場合、ミニファイされたアプリケーションを得るために追加の設定は必要ありません。 ただし、ProGuard はバイトコード内の一部の使用箇所を追跡できない場合があります(例:リフレクションを介してクラスが使用される場合)。 ProGuard 処理後にのみ発生する問題に遭遇した場合は、カスタムルールを追加する必要があるかもしれません。
カスタム設定ファイルを指定するには、以下のように DSL を使用します。
compose.desktop {
application {
buildTypes.release.proguard {
configurationFiles.from(project.file("compose-desktop.pro"))
}
}
}ProGuard ルールと構成オプションの詳細については、Guardsquare の マニュアル を参照してください。
難読化はデフォルトで無効になっています。有効にするには、Gradle DSL を介して以下のプロパティを設定します。
compose.desktop {
application {
buildTypes.release.proguard {
obfuscate.set(true)
}
}
}ProGuard の最適化はデフォルトで有効になっています。無効にするには、Gradle DSL を介して以下のプロパティを設定します。
compose.desktop {
application {
buildTypes.release.proguard {
optimize.set(false)
}
}
}uber JAR の生成はデフォルトで無効になっており、ProGuard は入力された各 .jar に対して対応する .jar ファイルを生成します。これを有効にするには、Gradle DSL を介して以下のプロパティを設定します。
compose.desktop {
application {
buildTypes.release.proguard {
joinOutputJars.set(true)
}
}
}次のステップ
デスクトップコンポーネント に関するチュートリアルをご覧ください。
