Androidビルドエラー解決方法「The binary version of its metadata is X.X.X, expected version is X.X.X」

こういうエラーの解決方法

- **Class 'XXX' was compiled with an incompatible version of Kotlin.The binary version of its metadata is 1.8.0, expected version is 1.6.0**

意訳

- パッケージ「 Kotlin `1.8.0` が欲しいよ〜。 君が持ってる `1.6.0` じゃ古すぎて嫌だよ〜。」

どうすれば良い？

- 必ずしも `1.8.0` ぴったりを用意する必要はなく、少し新しめの Kotlin を用意すれば解決することが多いです。ただし**コピペで終わるような解決策がない**のでちょこっと知識が必要です。急がば回れです。


# Kotlinを新しくしたいだけなのに...

面倒なたらい回しが始まるので覚悟しましょう。数字は今回適当なのでエラーを見ながら設定しましょう。

- パッケージ 「Kotlin `1.8.0` が欲しいよ〜」
- Kotlin 「KGP `1.8.0` が欲しいよ〜」
- KGP 「Gradle `7.3.3` が欲しいよ〜」
- Gradle 「Java `17` が欲しいよ〜」
- Java 「Android Studio `2024.1.1` が欲しいよ〜」

## パッケージ 「Kotlin `1.8.0` が欲しいよ〜」

エラーの通りなので、以下のファイルを変更しましょう。Flutterバージョンによっては書かなくて良いときもあるので **記述が見つからなければ何もしなくてOK** です。

```
// android/build.gradle
buildscript {
    ext.kotlin_version = '1.8.0'
}
```

## Kotlin 「KGP `1.8.0` が欲しいよ〜」

ついでに AGP `1.8.0` も欲しいよ〜。

[Kotlin と KGP のバージョン対応はこちら](https://kotlinlang.org/docs/gradle-configure-project.html#apply-the-plugin)

- KGP ...Gradleを強化してKotlin関連の機能を補ってくれるプラグイン
- AGP ...Gradleを強化してAndroid関連の機能を補ってくれるプラグイン

書き方はいくつかパターンがあります。自分のプロジェクトに当てはまりそうなパターンを選んでください。

パターン1

```
// android/build.gradle
buildscript {
    dependencies {
        // AGP
        classpath 'com.android.tools.build:gradle:7.3.0'
        // KGP ($kotlin_version と書いてあれば変更しなくてOK)
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}
```

パターン2

```
// android/settings.gradle
plugins {
    // AGP
    id "com.android.application" version "7.3.0" apply false
    // KGP
    id "org.jetbrains.kotlin.android" version "1.8.0" apply false
}
```

パターン3

```
// android/settings.gradle.kts
plugins {
  // AGP
  id("com.android.application") version "7.3.0" apply false
  // KGP
  id("org.jetbrains.kotlin.android") version "1.8.0" apply false
}
```

## KGP 「Gradle `7.3.3` が欲しいよ〜」

[KGP と Gradle のバージョン対応はこちら](https://kotlinlang.org/docs/gradle-configure-project.html#apply-the-plugin)

```
// android/gradle/wrapper/gradle-wrapper.poperties
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip
```

## Gradle 「Java `17` が欲しいよ〜」

**今回、直接Javaのバージョンを変えるわけではないので、確認だけしておきます。**

[Gradle と Java のバージョン対応はこちら](https://docs.gradle.org/current/userguide/compatibility.html)


```
# 今現在プロジェクトで使われているJavaを確認 
$ flutter doctor -v

# OpenJDK と書かれているところで Java のバージョンがわかる
# OpenJDK は 1.x の表記になっている
# 例えば 1.8 なら Java 8 のこと
```

- flutter に頼らない Java バージョン確認方法

```
1. Android Studioを開く
2. メニュー > File > Project Structure > SDK Location > JDK Location
3. 例えば jdk1.8.0 と表示されていれば、Java 8 のこと
```

## Java 「Android Studio `2024.1.1` が欲しいよ〜」

**とりあえず Android Studio は最新で大丈夫です。**

最近のモバイルアプリ開発の場合, Javaを単体で用意することは少なく Android Studio についてくる OpenJDK を使っているはず。なので Java を更新したければ Android Studio をインストールしなおすのが一番早いです。
(Flutterの大型アップデートに合わせて, 3ヶ月に一回くらいは Android Studio や Xcode も更新しよう)

それでもJavaのバージョンが足りない場合、 Android Studio はそのままで Java だけアップデートすることもできます。以下のページに説明があります。
https://developer.android.com/build/jdks

## おまけ Android Studio 「AGP 3.2 以上 が欲しいよ〜」

あまり気にすることは少ないですが、ここで AGP の手順まで戻ることもあります。

バージョン対応はこちらから確認
https://developer.android.com/studio/releases?hl=ja




# 全員「((これで準備OK))」

これでようやく目的のパッケージを使うことができます。ビルドエラーが出ないことを確認してください。

# それでもダメな場合

### 1. パッケージの組み合わせが不可能

例えば、

- パッケージA ... 新すぎる
- パッケージB ... 古すぎる

みたいになっていたら両方の要求を満たすのが難しいことがあります。
**どちらかのパッケージを新しくしたり古いバージョンに戻してみましょう。**

### 2. パッケージ特有の設定が必要
パッケージによっては build.gradle に〜を書き込んでください。のような注意書きがあります。
**パッケージ公式の説明ページを呼んで見逃しがないか確認しましょう。**

他にも何か情報があれば追記します。