何が起きたのか
新しくアプリでも作るか〜と「build.gradle.kts」ファイルに依存関係とかを追記して、
ビルドしてエミュレータでHelloWorld確認しておくか。とRUNボタンをポッチっとしてみたら、あれ、、、
XXXX firebase-auth-api.kotlin_moduleModule was compiled with an
incompatible version of Kotlin.The binary version of its
metadata is 2.1.0, expected version is 1.9.0.
なんかエラーになっちゃいました。
何が問題なんですかね?
調査の結果としては、「Android Studioで使用するKotlinコンパイラのバージョンと、Firebase Authenticationライブラリ(firebase-auth)で使用されているKotlinコンパイラのバージョンが競合している」ことが問題だったみたいです。
これをなんとか回避したので、備忘を兼ねて残しておきます
どう対処することにしたのか
前提として、こんな感じで「build.gradle.kts」ファイルを書いてました
- プロジェクト直下
plugins { id("com.android.application") version "8.2.1" apply false id("org.jetbrains.kotlin.android") version "1.9.0" apply false id("com.google.dagger.hilt.android") version "2.51.1" apply false // Add the dependency for the Google services Gradle plugin id("com.google.gms.google-services") version "4.4.2" apply false //composeに関する依存関係を2.1.0に合わせる }
-
app直下
dependencies { //firebaseの依存関係 implementation(platform("com.google.firebase:firebase-bom:33.10.0")) implementation("com.google.firebase:firebase-auth") implementation("com.google.firebase:firebase-firestore")
ここで、firebase-bomを使っているので、bomがいい感じにAuthとかfirestoreとかのバージョンを解決してくれたりしていますが、そのいい感じになっているAuthのバージョンの中でKoltinコンパイラ2.1.0が使われているっぽいんですよね〜
今回は、1.9.0側に合わせようという判断をなんとなくしたので、このbom33.10.0をいい感じにダウングレードして、その中のAuthがいい感じにダウングレードしてくれれば、1.9.0のコンパイラを使ってくれるんじゃね?と思ったので、そんな対処を模索することにしました。
※コンパイラのバージョンが揃わないのが何が問題なんだ。というのは私もいまいちわかっていなかったので、そちらは最後に調べた結果をまとめておきました〜
どうやってダウングレードしたのか
javaコードやjavaの親戚みたいなkotlinのライブラリはMarvenCentralってとこで管理されているっぽいので、そこにアクセスして
Marven Central
FirebaseAuthと検索バーで調べて、23.2.0が出てきたので、「Dependencies」ってところを見たら、kotlin-stdlibの依存関係のところにVersion2.1.0と書かれていました。(正しくエラーで出てたバージョンの情報ですね)
なので、FirebaseAuthの以前のバージョンの「Dependencies」を見てみて、以下のfirebaseの公式サイトでBomとFirebaseのバージョン情報をみて見たら、
FirebaseBomとAuth等のバージョン情報を確認する
- implementation(platform("com.google.firebase:firebase-bom:33.10.0"))
を - implementation(platform("com.google.firebase:firebase-bom:32.2.0"))
に変えたらうまく動きました。(よかった〜〜)
参考:コンパイラのバージョン違いは何が問題?
(1.9.0でも2.1.0でもどっちでもいいじゃん)
そう思っていましたが、何が問題なんでしょうか。調べてみました。
一例として挙げられる問題は、メモリの格納方法が変わっている可能性があるとのことでした。
何を言っているか全くわからなかったので、図示してみます。
何が言いたいかというと、
- 2.1.0ではメモリ効率を考えて、field1:Intをメモリの2つ目のセグメントに割り当てる。field2:Stringを1つ目のセグメントに割り当てる。と言うロジックになっていたとする
- 1.9.0ではfield1:Intが2つ目のセグメントに。と言った感じで、メモリへの割り当てルールが異なるため、本来取得したい値ではないものを取得する可能性があるということらしい。
以上です〜