🔥

Flutter3.24系にあげたら、Androidがビルドできなくなあったあなたへ

2024/11/21に公開

概要

Flutter3.24 系にあげたら、下記のエラーで Android がビルドできなくなったので、それの解決策をまとめます。

* What went wrong:
Execution failed for task ':fluttertoast:checkDebugAndroidTestAarMetadata'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.CheckAarMetadataWorkAction
   > 14 issues were found when checking AAR metadata:

       1.  Dependency 'androidx.fragment:fragment:1.7.1' requires libraries and applications that
           depend on it to compile against version 34 or later of the
           Android APIs.

           :fluttertoast is currently compiled against android-33.

           Recommended action: Update this project to use a newer compileSdk
           of at least 34, for example 35.

           Note that updating a library or application's compileSdk (which
           allows newer APIs to be used) can be done separately from updating
           targetSdk (which opts the app in to new runtime behavior) and
           minSdk (which determines which devices the app can be installed
           on).
* What went wrong:
Execution failed for task ':in_app_review:processDebugAndroidTestManifest'.
> Manifest merger failed : uses-sdk:minSdkVersion 16 cannot be smaller than version 19 declared in library [androidx.fragment:fragment:1.7.1] /Users/xxx/.gradle/caches/8.9/transforms/acc9118fa488ce5128b339e11d95b742/transformed/fragment-1.7.1/AndroidManifest.xml as the library might be using APIs not available in 16
  	Suggestion: use a compatible library with a minSdk of at most 16,
  		or increase this project's minSdk version to at least 19,
  		or use tools:overrideLibrary="androidx.fragment" to force usage (may lead to runtime failures)

原因

原因はパッケージ間の minSdkVersion と compileSdkVersion があっていないことです。

  • fluttertoastでは compileSdkVersion が 33 だが、fragment-1.7.1 では compileSdkVersion が 34
  • in_app_review では minSdkVersion が 16 だが、fragment-1.7.1 では minSdkVersion が 19

これらのエラーは、Flutter3.24 系になったタイミングで内部的に使用する Android ライブラリのバージョンが上げているため生じています。

解決策

根本的

根本的な解決策としては、compileSdkVersion と minSdkVersion があってないことが原因なので、パッケージ側に対応してもらうのが一番安全です。
エラーが出ている パッケージそれぞれ依頼して minSdkVersion と compileSdkVersion をあげてもらいましょう。

一時的

android.gradle
subprojects {
    afterEvaluate { project ->
        if (
                ["flutter_timezone", "in_app_review", "fluttertoast"].contains(project.name) && // 対象のパッケージのみ上書き
                        (project.plugins.hasPlugin("com.android.application") || project.plugins.hasPlugin("com.android.library")) // Android向けのモジュール化かチェック
        ) {
            println "Evaluating project: ${project.name}"

            project.android {
                compileSdkVersion 34
            }
            project.android.defaultConfig {
                minSdkVersion 19
            }
        }
    }
    project.evaluationDependsOn(':app')
}

一時的にエラーを解消したい場合は、エラーが出る対象のパッケージの compileSdkVersion と minSdkVersion をアプリ側で強制的に上書きします。
無理やり上書きしてるだけなので、不明なエラーが出るリスクがあります。
パッケージ側での対応がすぐには見込めない&このリスクが許容できる場合のみ使用すると良さそうです。
また、issueStackOverflow では全てのライブラリのバージョンを更新するコードが散見されますが、今後 35 など新しいバージョンが出たときにも 34 に上書きするような処理になってしまいます。
そのため、対象のパッケージのみを更新するような処理にすることをお勧めします。

GitHubで編集を提案

Discussion