ComposeとKotlinコンパイラーの互換性とビルドエラー

投稿日:  更新日:

プロジェクトのビルドで「Something went wrong while checking for version compatibility between the Compose Compiler and the Kotlin Compiler.」とメッセージを吐き、エラーになる場合があります。

既存のプロジェクトを新しくリリースされたAndroid Studioでビルドした場合に頻発します。

先日、「Giraffe|2022.3.1」がリリース(2023.07)されて、早速、ビルドをしたら発生しました。

その対処方法を説明します。

※環境:Android Studio Giraffe | 2022.3.1

スポンサーリンク

コンパイラーの互換性

Jetpack Composeにおいて、@Composable(アノテーション)の付く関数をコンポーザブル関数と呼び、コンパイラーによって特別なバイトコードへ変換されます。

このとき使われるコンパイラーが「Composeコンパイラー」です。

@Composable
fun Greeting(name: String, modifier: Modifier = Modifier) {
    Text(
        text = "Hello $name!",
        modifier = modifier
    )
}

Composeコンパイラーは特定のバージョンの「Kotlinコンパイラー」を拡張して作られます。

ですので、特定のバージョンにおいて、両者は互換性を持ちます。どちらのコンパイラーを使っても、Kotlinコードが同様にコンパイル可能です。

この関係が「ComposeとKotlinの互換性マップ」に書かれています。

スポンサーリンク

ビルドエラーの発生

新しくリリースされたAndroid Studioでビルドした場合などに、コンパイラーのバージョンに関連したビルドエラーが発生することがあります。

以下のようなメッセージを出力するエラーです。

Something went wrong while checking for version compatibility between the Compose Compiler and the Kotlin Compiler.
----------
Compose コンパイラーと Kotlin コンパイラーの間のバージョンの互換性をチェック中に問題が発生しました。

つまり、「互換性のないバージョンのコンパイラーがAndroid Studio内に指定されている」と言っています。

スポンサーリンク

ビルドエラーの原因

原因は、新しくリリースされたAndroid Studioでモジュールを新規作成すると、互換性のないバージョンのComposeコンパイラーが指定されるためです。

エラーの起きる理由

新規作成したモジュール(Module C)をビルドするとエラーになります。

スポンサーリンク

ビルドエラーの対処

「互換性マップ」に従い、互換性のあるバージョンに変更します。

以下は、Kotlinコンパイラーのバージョンを変更した例です。逆に、Composeコンパイラーのバージョンを変更する場合もあります。

buildscript {
    val agp_version by extra("8.0.2")
}
// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
    id("com.android.application") version "8.0.2" apply false
//  id("org.jetbrains.kotlin.android") version "1.7.20" apply false
    id("org.jetbrains.kotlin.android") version "1.8.10" apply false
}
plugins {
    id("com.android.application")
    id("org.jetbrains.kotlin.android")
}

android {
    ...
    composeOptions {
        kotlinCompilerExtensionVersion = "1.4.3"
    }
    ...
}

dependencies {
    ....
}

互換性マップのサンプル

ただし、コンパイラーのバージョンの変更に伴って、ライブラリーのバージョンを変更する必要があるかも知れません。必要に応じて依存リスト(dependencies { })を修正してください。

スポンサーリンク

関連記事:

表示の変わらないUI要素(Composable関数)に対して行われる再Composeは無駄な処理です。 ですので、極力排除したいところですが、表示が変わらないため、画面上からの判断が難しくなっています。 このようなとき、Layout Inspectorを利用すると、無駄な再Composeを見つけ出すことが出来ます。 ※環境:Android Studio Giraffe | 2022.3.1 Patch 1 ...
Jetpack ComposeはAndroidシステムの新たなUIフレームワークです。従来のViewシステムと、アプリ画面の描画の仕組みが異なります。 このJetpack Composeによるアプリ画面の描画について、仕組みの大枠をまとめます。 ※環境:Android Studio Giraffe | 2022.3.1 Patch 1     Kotlin 1.8.10     Compose Compiler 1.4.3 ...
Jetpack Composeは描画処理の軽量化(消費リソース量の削減)をするために、表示の変更されたUI要素のみを再Composeし、表示の変わらないUI要素をスキップします。これにより、高い表示パフォーマンスを維持しています。 しかし、スキップが正常に行われないとしても、アプリの画面に現れて来ません。なぜなら、同じ表示を無駄に繰り返すことになるからです。 アプリは動くけれど動作が鈍いならば、真っ先に疑うポイントです。不要な再Composeが行われている可能性が考えられます。 これは気付かないうちに蓄積し易い不具合です。ですので、再Composeとスキップについて理解し、予防に努めることをお勧めします。 今回は「再Composeとスキップ」について、まとめます。 ※環境:Android Studio Giraffe | 2022.3.1 Patch 1     Kotlin 1.8.10     Compose Compiler 1.4.3 ...
サンプルアプリを作成して、描画処理(再Compose)の周期を観測してみました。 その結果を紹介します。 ※環境:Android Studio Giraffe | 2022.3.1 Patch 1     Kotlin 1.8.10     Compose Compiler 1.4.3 ...
スポンサーリンク