ANTIGRAVITY LABEN
記事一覧/アプリ開発
アプリ開発/2026-05-15中級

Antigravity で追加したライブラリが古い Android 端末だけクラッシュする問題: coreLibraryDesugaring の盲点

Antigravity が提案するライブラリを追加したら Android 6/7 の端末だけクラッシュし始めた場合の診断手順と coreLibraryDesugaring による根本修正を、実際の開発事例をもとに解説します。

android27troubleshooting88coreLibraryDesugaringgradle2crash2

Beautiful HD Wallpapers(iOS/Android、累計 5,000 万 DL 超)の v2.0.0 をリリースした直後、Google Play Console のクラッシュレポートに見慣れないエラーが大量に流れ込んできました。28 日間で 50 名以上のユーザーが同じ画面でアプリを落としていて、共通点は Android 6.0.1 と 7.x の端末だけだということでした。

最新端末では全く再現せず、エラーログは一見すると全く関係ない場所を指していました。Antigravity にそのままスタックトレースを貼っても「Glide の設定を見直してみてください」という的外れな提案が返ってくることもありました。個人開発を続けていると、こういった問題に遭遇したとき、真っ先に「自分が書いたコードのバグ」を疑ってしまいますが、原因は全く別のところにありました。

根本原因は Java 8 の API クラスをネイティブサポートしていない旧端末への対応設定が欠けていたこと。そしてその設定は、ライブラリのバージョンアップを Antigravity に依頼した際に追加されなかったものでした。

同じ問題で時間を溶かしている方のために、診断から修正、再発防止まで整理します。

エラーログはこういう形になります

Play Console または Crashlytics に以下のようなスタックトレースが現れます。

java.lang.NoClassDefFoundError: Failed resolution of: Ljava/util/function/Supplier;
    at com.bumptech.glide.load.engine.cache.DiskCacheAdapter.<init>(DiskCacheAdapter.java:14)
    at com.bumptech.glide.load.engine.cache.InternalCacheDiskCacheFactory.build(...)

java.util.function.SupplierJava 8 の標準ライブラリに含まれるクラスです。Android 6.x/7.x の端末は Java 8 の一部 API をネイティブには持っておらず、このクラスが見つからずにクラッシュします。

なぜ Antigravity は警告してくれないのか

Antigravity は build.gradle を読んで「Glide 5.0.5 を追加すればよい」と提案しますが、minSdkVersion が 23(Android 6.0)のプロジェクトで Java 8 API を安全に使うには追加の設定が必要という文脈まで自動的に判断できない場合があります。

Glide 5.x は Glide 4.x と比べて内部実装が Java 8 の Functional Interface に大きく依存するように変わっています。AGP(Android Gradle Plugin)9.x 以降でも、この互換性ブリッジ(デシュガーリング)は明示的に有効化しなければなりません。

私自身の経験では、Antigravity に「Glide を 5 系にアップグレードしてください」と依頼したときに coreLibraryDesugaring の設定を追記してくれなかったことが発端でした。ライブラリを更新するタスクと、minSdkVersion の互換性を保つタスクは、AI にとって別の判断として扱われることがあります。

Glide 以外にも、以下のライブラリが Java 8 API に依存しており、同様のクラッシュを引き起こす可能性があります。

  • OkHttp 4.x 以降: java.net.InetAddress まわりの変更
  • Retrofit 2.8.x 以降: java.util.function.Function の利用
  • Kotlin Coroutines の特定バージョン: java.util.concurrent.Flow への依存
  • Room 2.5.x 以降: java.util.Optional の利用

廣川が運営するアプリでは minSdkVersion を長期間 23 に維持しており、アップデートのたびにこの問題が潜在的に発生しうる状態でした。一度の見落としが数十人規模のクラッシュに直結したため、以来、ライブラリ更新時の確認項目として必ず意識するようにしています。

診断:本当に desugaring の問題か確認する

まずエラーログで以下のキーワードが含まれているか確認してください。

NoClassDefFoundError: Ljava/util/function/
NoClassDefFoundError: Ljava/util/stream/
NoClassDefFoundError: Ljava/time/

これらはいずれも Java 8 の API クラスです。java.util.function.*java.util.stream.*java.time.* のいずれかが原因であれば、デシュガーリングの設定が欠けている可能性が高いです。

クラッシュが API レベル 26 未満の端末だけに集中していれば、ほぼ確定だと思います。

Play Console では「Android バイタル」→「クラッシュとアプリケーションが応答しない(ANR)」から端末ごとのクラッシュ分布を確認できます。旧端末に偏った分布が見えたら、デシュガーリングの問題を真っ先に疑ってください。

修正:coreLibraryDesugaring を有効化する

app/build.gradle に以下を追加します。

android {
    compileOptions {
        // Java 8 API を古い Android 端末でも使えるようにする
        coreLibraryDesugaringEnabled true
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}
 
dependencies {
    // デシュガーリング用ライブラリ(AGP 9.x 推奨バージョン)
    coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.4'
}

Kotlin DSL(build.gradle.kts)の場合は次のように書きます。

android {
    compileOptions {
        isCoreLibraryDesugaringEnabled = true
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }
}
 
dependencies {
    coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.4")
}

この修正を v2.1.0 に入れてリリースしたところ、28 日間続いていたクラッシュが次のビルドから消えました。Android 6.0.1 ユーザー全員のクラッシュが 1 行の設定追加で解消できたことは、今でも印象に残っています。

Antigravity に最初から伝える方法

同じ問題を再発させないために、プロジェクトの GEMINI.md(または Antigravity のカスタムインストラクション)に以下を追記しておくことをおすすめします。

## Android プロジェクトの制約
 
- minSdkVersion は 23(Android 6.0)を維持すること
- Java 8 API を使うライブラリを追加・更新する際は、
  必ず coreLibraryDesugaring の設定を確認・追記すること
- Glide 5.x、OkHttp 4.x 以降、Kotlin Coroutines の最新版は
  Java 8 API に依存しているためデシュガーリングが必須

こうしておくことで、Antigravity がライブラリを追加・更新するたびに coreLibraryDesugaring の存在を意識した提案をしてくれるようになります。アーティストとしての活動とアプリ開発を並行している私の場合、開発の中断を最小限にしたいという動機から、こういった「一度設定すれば再発しない」対策を積極的に GEMINI.md に蓄積するようにしています。

Before/After で確認する

修正前(クラッシュする状態):

android {
    compileOptions {
        // coreLibraryDesugaringEnabled の記述なし
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}
 
dependencies {
    implementation 'com.github.bumptech.glide:glide:5.0.5'
    // coreLibraryDesugaring の指定なし ← ここが問題
}

修正後(Android 6.x でも正常動作):

android {
    compileOptions {
        coreLibraryDesugaringEnabled true   // ← この1行を追加
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}
 
dependencies {
    implementation 'com.github.bumptech.glide:glide:5.0.5'
    coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.4'  // ← 追加
}

AGP バージョンと desugar_jdk_libs のバージョン確認

desugar_jdk_libs のバージョンと AGP のバージョンには対応関係があります。AGP 9.x 以降では 2.x.x 系を使うのが推奨されています。古い 1.x.x 系では一部の Java 11 API が含まれていないため、使えるクラスに制限があります。

# 現在の AGP バージョンを確認
grep "com.android.tools.build:gradle" build.gradle.kts

最新の対応バージョンは google/desugar_jdk_libs の GitHub Releases で確認できます。

旧端末でのテスト体制を整える

デシュガーリング関連のバグを事前に防ぐには、API レベル 23〜25 の実機か、対応する Android エミュレーターで定期的にテストしておく点が肝心です。

Android Studio の AVD Manager では API Level 23(Android 6.0 Marshmallow)のエミュレーターを作成できます。ライブラリをアップグレードしたときに最低限このエミュレーターで起動確認することで、リリース後のクラッシュをかなり予防できます。

個人開発では実機のバリエーションを揃えるのが難しい場合もありますが、Google Play Console の「事前起動レポート」を活用することも選択肢の一つです。Google が Firebase Test Lab を使って複数端末で自動テストを実行し、クラッシュを検出してくれます。

minSdkVersion を確認して 26 未満であれば、ライブラリ更新前に必ず coreLibraryDesugaring の有無を確認する習慣をつけてください。

このパターンを一度経験してから GEMINI.md に記載するようにしたため、その後の各アプリの更新では同種のクラッシュは発生していません。アプリ開発を長く続けていると、「一度踏んだ落とし穴は必ず記録する」という習慣が自然と身につきます。GEMINI.md はそのための最適な場所だと感じています。

個人開発において「設定 1 行の落とし穴」は意外と多く、どれも原因さえわかれば修正は一瞬ですが、たどり着くまでに時間がかかることがほとんどです。同じ問題で詰まっている方の参考になれば幸いです。

シェア

お読みいただきありがとうございます

Antigravity Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

もしこの記事がお役に立ちましたら、チップ(¥150)で応援いただけると大変励みになります。広告なしでの運営を続けるため、皆さまのご支援が大きな力になっています。

関連記事

アプリ開発2026-06-27
AI Studio が選んだ Gradle と AGP のバージョンが、既存アプリのビルドを静かに壊す前に
AI Studio が生成した Kotlin/Compose 画面を既存の Android アプリへ取り込むと、AGP・Kotlin・依存ライブラリのバージョンがずれてビルドが静かに壊れます。version catalog で単一の真実を固定し、取り込み口で生成側の宣言を検査するゲートの設計を、実測とコードでまとめました。
アプリ開発2026-05-17
AntigravityにRecyclerViewクラッシュを直させると別の場所が壊れる問題 — 防御的コピーで根本解決した話
RecyclerViewのIndexOutOfBoundsExceptionをAntigravityに修正させても再発する場合、共有リスト参照が原因の可能性があります。防御的コピーをAntigravityに正確に伝えるプロンプトとAGENTS.mdの書き方を解説します。
アプリ開発2026-05-16
RecyclerView の IndexOutOfBoundsException が28日で50件超に達したとき、Antigravity が見落とした「防御的コピー」の落とし穴
Android アプリで RecyclerView の IndexOutOfBoundsException が急増した実体験をもとに、Antigravity を使ったデバッグの流れと「防御的コピー」による根本対処を解説します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →