Androidアプリは、ビルドシステムの都合により、メソッド数が65536(64k=64☓1024)を超えるとビルドできないという制約があり、「64k問題」と呼ばれたりしています。
(Flutterでは、Firebase関連のパッケージを使った際に発生します)
ですので、メソッド数が65536を超えるアプリをビルドすると、
こんなエラーとか
Cannot fit requested classes in a single dex file. Try supplying a main-dex list. # methods: 68029 > 65536
こんなエラーが出て、ビルドが止まってしまいます。
trouble writing output: Too many field references: 131000; max is 65536. You may try using –multi-dex option.
この「65536」という数字は、自分が作ったメソッドだけではなくて、Androidのフレームワークや使っている外部のライブラリとかを全部含むので、意外と超える可能性のある数字です。
Android アプリ(APK)ファイルには、Dalvik Executable(DEX)形式の実行可能なバイトコード ファイルが含まれており、その中にアプリの実行に使用されるコンパイル済みのコードがあります。Dalvik Executable の仕様により、単一の DEX ファイル内で参照できるメソッドの総数が 65,536 に制限されます。これらのメソッドには、Android フレームワーク メソッド、ライブラリ メソッド、独自のコードのメソッドが含まれます。コンピュータ サイエンスにおいては、Kilo、K は 1024(または、2^10)を表します。65,536 は 64 X 1024 に等しいため、この制限は「64K 参照制限」と呼ばれます。
もちろん、ライブラリの見直しなどを行って、メソッド数を減らすという手段を取るのが常道ではありますが、メソッド数が65536を超えてもビルドを回せるように予め設定しておきたい場合の対処法の説明です。
(最初から複数のdexファイルが使えるように設定をしておくということです)
もくじ
1.モジュール レベル(アプリケーションレベル)の build.gradle
ファイルで minSdkVersion
を 21以上に
2022年8月時点で、世の中のAndroidスマホの約99%がAndroidバージョン5.0(APIレベル21)以上なので、この対応で問題ないと思います。
2.minSdkVersion
を 20 以下に設定している場合は、Multidex サポート ライブラリを依存関係に追加
android { defaultConfig { ... minSdkVersion 15 targetSdkVersion 26 multiDexEnabled true } ... } dependencies { compile 'com.android.support:multidex:1.0.3' ← コレ }
3.MultiDexの初期化
1.Applicationクラスを継承したクラスを使っていない場合
アプリ内でApplicationクラスを継承したクラスを使っていない場合は、マニフェストファイルの<application>タグ内に、以下の編集を行います(最初に起動するクラスをMultiDexApplicationクラスにする)
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="https://schemas.android.com/apk/res/android" package="com.example.myapp"> <application android:name="android.support.multidex.MultiDexApplication" > ← コレ ... </application> </manifest>
2.Applicationクラスを継承したクラスを使っている場合
Java/Kotlinではクラスの継承は1つしかできないので、自作ApplicationクラスのattachBaseContext()メソッド内で、Multidexを有効にする
public class MyApplication extends Application { @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); ← コレ } }
これで、最初から複数のdexファイルが使えるように設定できたので、メソッド数が65536を超えても、ビルドがちゃんと回ってくれるようになります。
(下の動画で詳しく説明していますので、よろしければご覧ください)