Skip to content

Flutterでandroid-35リソースリンクエラーを解決

問題点

Flutterプロジェクトのリリースビルド実行時に以下のエラーが発生します:

bash
Android resource linking failed
aapt2 E ... Failed to load resources table in APK .../android-35/android.jar
error: failed to load include path .../android-35/android.jar.

エラーが発生する条件:

  • compileSdkVersionが35
  • Android Gradle Plugin (AGP) バージョンが 7.3.0
  • targetSdkVersionが34に設定
  • Flutterのリリースビルド時のみ発生

エラーの背景

このエラーはAndroid SDK 35と古いAGP間の互換性問題が原因です。aapt2リソースコンパイラがSDK 35のリソースを正しく処理できません。

解決方法

✅ 推奨解決策: Android Gradle Pluginの更新

  1. Gradleラッパーのバージョン更新
    gradle-wrapper.propertiesを変更:

    properties
    distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
  2. プロジェクトレベルのbuild.gradle変更
    AGPバージョンを最新に指定:

    groovy
    buildscript {
        dependencies {
            classpath 'com.android.tools.build:gradle:8.5.0'
        }
    }
  3. アプリレベルのbuild.gradle変更
    プラグインと基本設定を更新:

    groovy
    plugins {
        id "com.android.application" version "8.5.0" apply false
        // 他のプラグイン...
    }
    
    android {
        compileSdk 35
        // Flutter推奨バージョン使用
        compileSdkVersion flutter.compileSdkVersion
        minSdkVersion flutter.minSdkVersion
        targetSdkVersion flutter.targetSdkVersion
    }
  4. ビルド環境クリーンアップ
    コマンドを順に実行:

    bash
    flutter clean
    flutter pub get
    flutter build apk --release

AGPとSDKバージョンの注意点

compileSdk=35でビルドする場合:

  • AGP 8.5.0は公式にSDK 35をサポートしていません(警告が出力されます)
  • 警告を非表示にするにはgradle.propertiesに追加:
    properties
    android.suppressUnsupportedCompileSdk=35

🔧 Flutter推奨設定を使用する(代替案)

設定ファイルを簡素化し安定化する方法:

groovy
android {
    namespace "com.example.app"
    compileSdk flutter.compileSdkVersion  // Flutter互換バージョンを使用
    ndkVersion flutter.ndkVersion  // Flutter指定NDK

    defaultConfig {
        minSdk flutter.minSdkVersion  // 互換性を保証
        targetSdk flutter.targetSdkVersion
        versionCode 1
        versionName "1.0"
    }
}

このアプローチの利点:

  • Flutterがテスト済みのSDKバージョンを自動適用
  • 新しいAndroid SDKリリース時の互換問題を予防
  • プロジェクトのメンテナンス簡略化

💡 追加トラブルシューティング

  1. Manifestエラーが発生する場合

    • android/app/src/main/AndroidManifest.xmlから不要なpackage属性を削除
    • 名前空間はbuild.gradlenamespace設定でのみ管理
  2. desugaringが必要なライブラリ使用時

    groovy
    dependencies {
        coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4'
    }

解決策の技術的背景

なぜこのエラーが発生するのか

  1. AGPとSDKバージョンのミスマッチ

    • AGP 7.xはSDK 35のリソース形式に対応していない
    • android.jarのリソーステーブル読み込みに失敗
  2. aapt2の互換性問題

    • 古いaapt2はSDK 35の新しいリソース構成を解析できない
    • AGP 8.5.0ではaapt2が更新され問題解消

バージョン選択のベストプラクティス

コンポーネント推奨バージョン重要度
Gradle8.9+★★★
AGP8.5.0★★★
compileSdkflutter提供バージョン★★
targetSdkflutter提供バージョン★★

長期的な安定性のために

Flutterの公式互換性マップを使用することで:

  • メインストリーム更新からの影響を最小化
  • ビルド失敗リスクを軽減

最終チェック項目:

  • [x] AGPバージョンが8.5.0以上であるか
  • [x] Gradleが8.9以上であるか
  • [x] flutter cleanを実行済みか
  • [x] compileSdkVersionでFlutter提供値を使用しているか

これらの修正により、SDK 35環境でのリソースリンクエラーは解決し、安定したリリースビルドが可能になります。