ネイティブディストリビューション
ここでは、ネイティブディストリビューションについて学習します。サポートされているすべてのシステム向けにインストーラーやパッケージを作成する方法、およびディストリビューションと同じ設定でアプリケーションをローカルで実行する方法を学びます。
以下のトピックの詳細については、引き続きお読みください。
- Compose Multiplatform Gradleプラグインとは
- アプリケーションをローカルで実行するなどの基本的なタスクと、ミニファイや難読化などの高度なタスクに関する詳細。
- JDKモジュールを含める方法と
ClassNotFoundException
への対処法。 - ディストリビューションのプロパティを指定する方法: パッケージバージョン、JDKバージョン、出力ディレクトリ、ランチャーのプロパティ、およびメタデータ。
- リソースライブラリ、JVMリソースのロード、またはパックされたアプリケーションへのファイルの追加を使用したリソースの管理方法。
- Gradleソースセット、Kotlin JVMターゲット、または手動でのソースセットのカスタマイズ方法。
- OSごとにアプリケーションアイコンを指定する方法。
- Linux上のパッケージメンテナーのメールアドレスやmacOS上のApple App Storeのアプリカテゴリなど、プラットフォーム固有のオプション。
- macOS固有の構成: 署名、公証、および
Info.plist
。
Gradleプラグイン
このガイドは、Compose Multiplatform Gradleプラグインを使用したComposeアプリケーションのパッケージ化に主に焦点を当てています。org.jetbrains.compose
プラグインは、基本的なパッケージ化、難読化、macOSのコード署名のためのタスクを提供します。
このプラグインを使用すると、jpackage
を使用してアプリケーションをネイティブディストリビューションにパッケージ化したり、アプリケーションをローカルで実行したりするプロセスが簡素化されます。配布可能なアプリケーションは自己完結型でインストール可能なバイナリであり、必要なすべてのJavaランタイムコンポーネントを含んでいるため、ターゲットシステムにJDKがインストールされている必要はありません。
パッケージサイズを最小限に抑えるため、Gradleプラグインはjlinkツールを使用し、配布可能なパッケージに必要なJavaモジュールのみがバンドルされるようにします。ただし、必要なモジュールを指定するには、Gradleプラグインを構成する必要があります。詳細については、未定義のセクションを参照してください。
代替として、JetBrainsが開発していない外部ツールであるConveyorを使用することもできます。Conveyorはオンラインアップデート、クロスビルド、その他様々な機能をサポートしていますが、オープンソース以外のプロジェクトではライセンスが必要です。詳細については、Conveyorドキュメントを参照してください。
基本的なタスク
Compose Multiplatform Gradleプラグインの基本的な設定可能な単位はapplication
です(これはGradleアプリケーションプラグインと混同しないようにしてください。こちらは非推奨です)。
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")
// Alternatively: 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 {
// Version for all packages
packageVersion = "..."
macOS {
// Version for all macOS packages
packageVersion = "..."
// Version for the dmg package only
dmgPackageVersion = "..."
// Version for the pkg package only
pkgPackageVersion = "..."
// Build version for all macOS packages
packageBuildVersion = "..."
// Build version for the dmg package only
dmgPackageBuildVersion = "..."
// Build version for the pkg package only
pkgPackageBuildVersion = "..."
}
windows {
// Version for all Windows packages
packageVersion = "..."
// Version for the msi package only
msiPackageVersion = "..."
// Version for the exe package only
exePackageVersion = "..."
}
linux {
// Version for all Linux packages
packageVersion = "..."
// Version for the deb package only
debPackageVersion = "..."
// Version for the rpm package only
rpmPackageVersion = "..."
}
}
}
}
パッケージバージョンを定義するには、次の規則に従ってください。
ファイルタイプ | バージョン形式 | 詳細 |
dmg , pkg | MAJOR[.MINOR][.PATCH] |
|
msi , exe | MAJOR.MINOR.BUILD |
|
deb | [EPOCH:]UPSTREAM_VERSION[-DEBIAN_REVISION] |
|
rpm | 任意の形式 | バージョンに- (ダッシュ) 文字を含めることはできません。 |
JDKバージョン
このプラグインはjpackage
を使用しますが、これはJDK 17以上のJDKバージョンを必要とします。JDKバージョンを指定する際は、以下のいずれかの要件を満たしていることを確認してください。
JAVA_HOME
環境変数が互換性のあるJDKバージョンを指している。javaHome
プロパティがDSL経由で設定されている。
compose.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プロジェクトの名前 |
packageVersion | アプリケーションのバージョン。 | Gradleプロジェクトのバージョン |
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 for desktopは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 Silicon 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
を使用して含めるファイルを指定します。mainJar
ファイルプロパティに、メインクラスを含む.jar
ファイルを指定します。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 {
// Options for macOS
}
windows {
// Options for Windows
}
linux {
// Options for 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 | メニューバー、「<App>について」メニュー項目、 および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アプリケーションに必要なエンタイトルメントを追加してください。App Store向けにビルドする際に使用されるデフォルトファイルについては、 sandbox.plistを参照してください。このデフォルトファイルはJDKのバージョンによって異なる場合があります。 ファイルが指定されていない場合、プラグインはjpackage が提供するデフォルトのエンタイトルメントを使用します。 詳細については、 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: GUIDを生成するを参照してください。 | |
msiPackageVersion = "MSI_VERSION" | MSI固有のパッケージバージョンを設定します。詳細については、パッケージバージョンセクションを参照してください。 | |
exePackageVersion = "EXE_VERSION" | EXE固有のパッケージバージョンを設定します。詳細については、パッケージバージョンセクションを参照してください。 |
macOS固有の構成
macOSでの署名と公証
最新のmacOSバージョンでは、インターネットからダウンロードされた署名されていないアプリケーションの実行が許可されていません。そのようなアプリケーションを実行しようとすると、次のエラーが発生します。「YourApp is damaged and can't be open. You should eject the disk image」(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>
"""
src/main/main.kt
ファイルでjava.awt.Desktop
クラスを使用して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)
}
}
}
次のステップ
デスクトップコンポーネントに関するチュートリアルを探索してください。