Android 基礎 -- Part 02 Jetpack Compose で自動生成したプロジェクトのライブラリを調べて更新する
Tags: android, jetpackcompose
Published: 2023-01-03 14:31:35


## why

https://www.youtube.com/watch?v=r869VVmj26E&list=PLgAI_5b_7BdRaBPAD5RMrzjoSwefDXpkw&index=2

MokeLab さんのこの動画を参考にすると
プロジェクト作成でテンプレートから作っただけだと、全然最新のライブラリを使っていないらしい。

なので 2022-01-02 時点での最新に更新してみる。

---

## ルートとアプリの build.gradle という設定ファイルを確認する

springboot と同じく、Gradle で管理されているプロジェクトなので
build.gradle という設定ファイルがある。

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sla1xshunf9px69y8chp.png)

Android の場合は

* プロジェクトルートの設定ファイル ( Project: HelloJetpack )
* そのアプリの設定ファイル ( Module: HelloJetpack.ap )

の 2 つがある

---
---

# Compose 1.3.2 と追従する Kotlin 1.7.20 への更新

---

## ルートの build.grade で compose_ui を 1.1.1 から 1.3.2 に更新

```kotlin
buildscript {
    ext {
        compose_ui_version = '1.1.1'
    }
}// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
    id 'com.android.application' version '7.3.1' apply false
    id 'com.android.library' version '7.3.1' apply false
    id 'org.jetbrains.kotlin.android' version '1.6.10' apply false
}
```

トップレベルだから、これらの設定はサブプロジェクトやモジュールに引き継がれるとコメントから解釈した。

まず Jetpack Compose のバージョンを確認する

https://developer.android.com/jetpack/androidx/releases/compose#versions

Android 公式を見ると 1.3.2 が最新の安定版だと書いてある。

```kotlin
buildscript {
    ext {
        compose_ui_version = '1.3.2'
    }
}
```

なので compose_ui を 1.3.2 に変更してビルドしてみる

```error
      :app is currently compiled against android-32.
```

するとモジュールの android-32 と競合するとエラーが出た

```kotlin
      Recommended action: Update this project to use a newer compileSdkVersion
      of at least 33, for example 33.
```

最新の 33 の Compile Software Dev Kit に変更の推奨メッセージが出ている。

---

## アプリの　build.gradle で compileSdk を 32 から 33 に更新

なのでひと足先に、アプリの compileSdk を

```kotlin
android {
    namespace 'com.example.hellojetpack'
    compileSdk 32

    defaultConfig {
        applicationId "com.example.hellojetpack"
        minSdk 31
        targetSdk 32
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        vectorDrawables {
            useSupportLibrary true
        }
    }
```

32 から 33 に変えて、再度ビルドしてみる。

```kotlin
> Task :prepareKotlinBuildScriptModel UP-TO-DATE

BUILD SUCCESSFUL in 1s
```

すると無事にビルドすることができた。


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4zqldfepnrubp6w22pbn.png)

targetSdk も 32 から 33 に更新する。
32 のままだと、Spring の TODO があるときのような警告が出ているので。

---

## ルートの build.grade で kotlin を 1.6.10 から 1.7.21 にする

https://kotlinlang.org/docs/releases.html#release-details

kotlin の公式サイトを見ると、1.8 が最新だが、試験的な機能が入っているので安定版ではないように見える。

なのでそれの次に新しい 1.7.21 をいれる。
1.7.21 の欄には Android Studio Dolphin では 1.7.21 のプラグインを入れると Android Studio 自体がアップデートされると書いてある。

Android Studio がアップデートされることに問題を感じないので、1.7.21 を入れることにする。

```kotlin
plugins {
// ...
    id 'org.jetbrains.kotlin.android' version '1.7.21' apply false
}
```

apply false にしておくと、モジュールで別のバージョンを指定したときに優先してくれるらしい。

これでルートで 1.7.21 にしてビルドすると

```php
> Task :app:compileDebugKotlin FAILED

e: This version (1.1.1) of the Compose Compiler requires 
Kotlin version 1.6.10 

but you appear to be using Kotlin version 1.7.21 
which is not known to be compatible.

```

コンパイルデバック Kotlin で落ちた。
アプリで compose 1.1.1 のコンパイラが使われているらしい。
そして compose 1.1.1 では Kotlin 1.6.10 が要求されている。

---

## アプリの composeOption を 1.1.1 から　1.3.2 に更新

```kotlin
    composeOptions {
        kotlinCompilerExtensionVersion '1.1.1'
    }
```

アプリの compose のオプションが 1.1.1 のままだった
ルートに合わせて 1.3.2 に更新してビルドする

```kotlin
e: This version (1.3.2) of the Compose Compiler requires
 Kotlin version 1.7.20 

but you appear to be using Kotlin version 1.7.21 
which is not known to be compatible.  

```

今度は、compose 1.3.2 が Kotlin 1.7.20 を要求していて
1.7.21 では使えないとでた。

---

## ルートの kotlin を 1.7.21 から 1.7.20 に更新

```kotlin
plugins {
// ...
    id 'org.jetbrains.kotlin.android' version '1.7.20' apply false
}
```

なので、kotlin を下げてビルドして Gradle Sync する

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qe5wkqecp006s7257ncp.png)

すると、今度こそエラーなしでビルドと実行できた。

----
----

# app の依存を更新

## 現状を確認

```kotlin
dependencies {

    implementation 'androidx.core:core-ktx:1.7.0'
    implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.3.1'
    implementation 'androidx.activity:activity-compose:1.3.1'
    implementation "androidx.compose.ui:ui:$compose_ui_version"
    implementation "androidx.compose.ui:ui-tooling-preview:$compose_ui_version"
    implementation 'androidx.compose.material:material:1.1.1'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
    androidTestImplementation "androidx.compose.ui:ui-test-junit4:$compose_ui_version"
    debugImplementation "androidx.compose.ui:ui-tooling:$compose_ui_version"
    debugImplementation "androidx.compose.ui:ui-test-manifest:$compose_ui_version"
}
```

初期生成時では

android x の

* ktx
* lifecycle-runtime
* activity-compose
* compose.material
* test.ext
* test.espresso
* compose.ui

などが入っていて

compose.ui のみが

```kotlin
implementation "androidx.compose.ui:ui:$compose_ui_version"
```

ルートで定義された compose_ui のバージョンを受け取っている。
なので更新が必要ない。

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xrvxr21hl1uat9x2rnmg.png)

他は更新しろと警告が出ている。
なので更新する。

---

## 全て Alt Enter でガイドに従って更新する。

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0cjwz28vn7tba1c8meui.png)

Alt Enter で警告のハイライトをされている場所から推奨するバージョンに変更できる。なので変更する。
IntelliJ で　Interface から実装を生やすのと同じ操作だ。

```kotlin
dependencies {

    implementation 'androidx.core:core-ktx:1.9.0'
    implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
    implementation 'androidx.activity:activity-compose:1.6.1'
    implementation "androidx.compose.ui:ui:$compose_ui_version"
    implementation "androidx.compose.ui:ui-tooling-preview:$compose_ui_version"
    implementation 'androidx.compose.material:material:1.3.1'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.4'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.0'
// ...
}
```

compose って名前がついているから全て 1.3.2 かと思ったが
1.3.1 から　1.6.1 までバラバラだった。

## ビルド

ビルドすると、無事に通った。