Jetpack Compose 関連の依存関係まとめ

## はじめに

- Jetpack Compose に関する依存関係について、時々確認することがあるのでまとめました
- 記事を作成した時点での Android Studio のバージョンは「Koala | 2024.1.1」です
    - ちなみに Build は「#AI-241.15989.150.2411.11948838, built on June 11, 2024」でした
- 依存関係は Gradle version catalogs を使って設定しています
    - カタログを使えない事情がありましたら、従来通りの記法に読み替えて頂ければと思います
    - `version.ref` には適当な値が設定されているとお考えください
- 不備や認識違いがありましたら、指摘頂けると大変助かります

## プロジェクト作成直後に設定されている依存関係

- プロジェクト作成時のウィザードで [Phone and Tablet] > [Empty Activity] を選択した場合のデフォルト設定です
- `libs.androidx.compose.ui` があるので、`libs.androidx.compose.ui.graphics` は削っても問題はないと思います
    - 下記の build.gradle ではコメントアウトしていますが、これでも問題なく動作します（コメントアウトしなくても勿論大丈夫です）

### ビルド設定

- バージョンカタログ

```toml
# Compose BOM (部品表)
androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" }

# Material Design 3
androidx-compose-material3 = { group = "androidx.compose.material3", name = "material3" }

# レイアウト・描画・入力など、デバイス操作に必要な Compose UI の基本コンポーネント
androidx-compose-ui = { group = "androidx.compose.ui", name = "ui" }

# Android Studio での Preview サポート
androidx-compose-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" }
androidx-compose-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" }

# UIテスト
androidx-compose-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" }
androidx-compose-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" }

# Activity との統合
# ガイドでは Optional だが、作成時点では設定された状態になっている
androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose" }

# プロジェクト作成時に設定されているが androidx.compose.ui に含まれているので実は不要。入っている理由は謎
androidx-compose-ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics" }
```

- build.gradle.kts

```kotlin
implementation(platform(libs.androidx.compose.bom))
androidTestImplementation(platform(libs.androidx.compose.bom))

implementation(libs.androidx.compose.material3)
implementation(libs.androidx.compose.ui)
// implementation(libs.androidx.compose.ui.graphics)

implementation(libs.androidx.compose.ui.tooling.preview)
debugImplementation(libs.androidx.compose.ui.tooling)

androidTestImplementation(libs.androidx.compose.ui.test.junit4)
debugImplementation(libs.androidx.compose.ui.test.manifest)

implementation(libs.androidx.activity.compose)
```

## Material 関連

- プロジェクト作成直後は、現時点（2024.07）で最新の Material3 に依存関係が設定された状態でプロジェクトが作成されています
- Material3 を使わない（使えない）場合、 `libs.androidx.compose.material3` でなく下記の依存関係を定義することで対応できるようです

### ビルド設定

- Material3 でなく Material2 を適用したい場合のバージョンカタログ

```toml
androidx-compose-material = { group = "androidx.compose.material", name = "material" }
```

- Material ライブラリは不要だが Compose は使いたい場合のバージョンカタログ

```toml
androidx-compose-foundation = { group = "androidx.compose.foundation", name = "foundation" }
```

## ConstraintLayout

- デフォルトでは Compose で ConstraintLayout を利用するための設定が無いので、そのための依存関係を追加する必要があります

### ビルド設定

- バージョンカタログ

```toml
androidx-constraintlayout-compose = { group = "androidx.constraintlayout", name = "constraintlayout-compose", version.ref = "constraintLayoutCompose" }
```

- build.gradle.kts

```kotlin
implementation(libs.androidx.constraintlayout.compose)
```

## 設定しておいた方がよさそうな依存関係

`Fragment` や Lifecycle 関連（ `ViewModel` や `LiveData` ）と統合させる場合に必要です

### ビルド設定

- バージョンカタログ

```toml
# Fragment との統合（Activity.setContent に相当する Fragment.content 拡張関数を提供する）
androidx-fragment-compose = { group = "androidx.fragment", name = "fragment-compose", version.ref = "fragmentCompose" }

# ViewModel との統合
androidx-viewmodel-compose = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-compose", version.ref = "lifecycleCompose" }

# LiveData との統合
androidx-livedata-compose = { group = "androidx.compose.runtime", name = "runtime-livedata" }
```

- build.gradle.kts

```kotlin
implementation(libs.androidx.fragment.compose)
implementation(libs.androidx.viewmodel.compose)
implementation(libs.androidx.livedata.compose)
```

## composeOptions のバージョンについて （Kotlin 2.0 未満の場合）

Kotlin のバージョンが2.0以降なら Compose Compiler Gradle plugin を使うことになるので、この内容は2.0未満のとき参考にして貰えるかと思います

- Compose を使うためには build.gradle に `composeOptions` を設定しますが、そこに指定するバージョンと Kotlin のバージョンには互換性があります
- 互換性の無いバージョンの組み合わせを設定すると、ビルドエラーが発生します
- 詳細は [Compose Compiler と Kotlin の互換性についてのリンク](https://developer.android.com/jetpack/androidx/releases/compose-kotlin) をご確認ください

### カタログと依存関係の一例

Compose Compiler Version 1.5.14 に対して互換性のある Compatible Kotlin Version は、上記のリンクによると 1.9.24 なので、以下の設定でビルドに成功します

- バージョンカタログ

```toml
[versions]
kotlin = "1.9.24"

[plugins]
jetbrains-kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
```

- build.gradle.kts

```kotlin
android {
    composeOptions {
        kotlinCompilerExtensionVersion = "1.5.14"
    }
}
```

## 関連リンク

- [Jetpack Compose の自習用プロジェクト (GitHub)](https://github.com/outerlet/ComposeImpl)
- [Migrate your build to version catalogs - Android Developers](https://developer.android.com/build/migrate-to-catalogs)
- [Get started with ConstraintLayout - Android Developers](https://developer.android.com/develop/ui/compose/layouts/constraintlayout#get-started)
- [Compose Compiler Gradle plugin - Android Developers](https://developer.android.com/develop/ui/compose/compiler)