TL; DR
Androidでは、アプリおよびアプリが参照するライブラリが65,536メソッドを超えるとビルドエラーが発生します。
65,536 = 64 × 1,024(K)なので64K問題と言います。
解決策1: アプリが使用するメソッドやライブラリを見直す
一番シンプルで当たり前の解決策。とはいえ、必要だからライブラリを入れているのであって、実際に効果はそこまで期待できないと思われます。
実際は、解決策2, 3のどちらかを選択することになるでしょう。
解決策2: 対象のSDKを21以上にする
Android 5.0(API 21)移行ではデフォルトでmultidexに対応しているので、何らかの理由でそれ以前のバージョンに対応する必要がなければ単純に対象のSDKを21以上にするのが良いです。
android/app/build.gradle
android {
defaultConfig {
applicationId "com.example.sample"
// minSdkVersion 16
minSdkVersion 21 // 最小サポートSDKを21以上にする
targetSdkVersion 29
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
}
}
解決策3: multidexサポートライブラリを使用する
何らかの事情がある場合にはmultidexサポートライブラリを使用することでも解決できます。
android/app/build.gradle
android {
defaultConfig {
applicationId "com.example.sample"
minSdkVersion 16
targetSdkVersion 29
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
multiDexEnabled true // multidexサポートライブラリを使用する
}
}
解決策4: ビルド時に圧縮する(参考)
Flutterでできるのかは要調査(調査するとは言っていない)。
ビルド時に不要なメソッドを除くことができるはず。
検索用
1. flutter run
を実行した際に64K問題が発生したときのログ
この時は、cloud_firestore
をpubspec.yaml
に追加したことでアプリ全体のメソッド数が85242個と64Kよりも大きくなってしまった。
D8: Cannot fit requested classes in a single dex file (# methods: 85242 > 65536)
com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives:
The number of method references in a .dex file cannot exceed 64K.
Learn how to resolve this issue at https://developer.android.com/tools/building/multidex.html
参考資料