Skip to content

Flutterでコアライブラリの脱糖化を有効化

flutter_local_notificationsを使用する際、次のエラーが発生することがあります:

Dependency ':flutter_local_notifications' requires core library desugaring to be enabled for :app

このエラーはパッケージがJava 8+の機能に依存しているため、デスガリング(脱糖化)を有効にする必要があることを示しています。

解決手順

ステップ 1: app/build.gradle の変更

androidブロック内のcompileOptionsを更新します:

groovy
android {
    compileOptions {
        // コアライブラリの脱糖化を有効化
        coreLibraryDesugaringEnabled true
        
        // Javaバージョンの設定(1.8以上)
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

Javaバージョンについて

  • Java 11を使用する場合はVERSION_11に変更可能
  • kotlinOptionsがある場合は合わせて更新:
    groovy
    kotlinOptions {
        jvmTarget = '1.8' // または '11'
    }

ステップ 2: 依存関係の追加

app/build.gradledependenciesブロックに脱糖化ライブラリを追加:

groovy
dependencies {
    // デスガリングライブラリ(最新安定版を使用)
    coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.4'
}

バージョンの互換性

AGP(Android Gradle Plugin)のバージョンごとに互換性のあるバージョン:

  • AGP 7.4+ → 2.0.3
  • AGP 7.3 → 1.2.3
  • AGP 4.0-7.2 → 1.1.9

Kotlin DSL(build.gradle.kts)の場合

kotlin
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")
}

適用後の最終構成例

app/build.gradleの完全なサンプル:

groovy
android {
    namespace "com.example.app"
    compileSdkVersion 34

    compileOptions {
        coreLibraryDesugaringEnabled true
        sourceCompatibility JavaVersion.VERSION_11
        targetCompatibility JavaVersion.VERSION_11
    }

    kotlinOptions {
        jvmTarget = '11'
    }

    defaultConfig {
        applicationId "com.example.app"
        minSdkVersion 21
        targetSdkVersion 34
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
    }
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.4'
}

なぜこの設定が必要か

flutter_local_notificationsは以下のJava 8+機能を使用します:

  • 新しい日時API(java.timeパッケージ)
  • ストリームAPI(java.util.stream
  • 関数型インターフェース

デスガリングの仕組み

脱糖化はビルド時にJava 8+のコードをAndroidがサポートするJava 7形式へ変換するプロセスです。

トラブルシューティング

  1. 同期エラーが続く場合

    bash
    flutter clean
    rm -rf android/.gradle
    flutter pub get
  2. マルチデックスエラーの場合

    groovy
    defaultConfig {
        multiDexEnabled true
    }
  3. 古いバージョンで発生する問題

    • Flutter 3.10+を使用
    • Android Gradle Pluginを8.3+に更新
    • Gradle自体を8.4+に更新(gradle-wrapper.propertiesで設定)

参考資料