[Flutter/Android]Android 64k問題を回避するための設定方法(Cannot fit requested classes in a single dex file / Too many field references)

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.

blank

 

この「65536」という数字は、自分が作ったメソッドだけではなくて、Androidのフレームワークや使っている外部のライブラリとかを全部含むので、意外と超える可能性のある数字です。

Android アプリ(APK)ファイルには、Dalvik Executable(DEX)形式の実行可能なバイトコード ファイルが含まれており、その中にアプリの実行に使用されるコンパイル済みのコードがあります。Dalvik Executable の仕様により、単一の DEX ファイル内で参照できるメソッドの総数が 65,536 に制限されます。これらのメソッドには、Android フレームワーク メソッド、ライブラリ メソッド、独自のコードのメソッドが含まれます。コンピュータ サイエンスにおいては、Kilo、K は 1024(または、2^10)を表します。65,536 は 64 X 1024 に等しいため、この制限は「64K 参照制限」と呼ばれます。

https://developer.android.com/studio/build/multidex?hl=ja

もちろん、ライブラリの見直しなどを行って、メソッド数を減らすという手段を取るのが常道ではありますが、メソッド数が65536を超えてもビルドを回せるように予め設定しておきたい場合の対処法の説明です。

(最初から複数のdexファイルが使えるように設定をしておくということです)

 

1.モジュール レベル(アプリケーションレベル)の build.gradle ファイルで minSdkVersion を 21以上に

blank

2022年8月時点で、世の中のAndroidスマホの約99%がAndroidバージョン5.0(APIレベル21)以上なので、この対応で問題ないと思います。

blank

 

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を超えても、ビルドがちゃんと回ってくれるようになります。

(下の動画で詳しく説明していますので、よろしければご覧ください)

blank

こんな記事も読まれています

今すぐプレゼントを受け取る(約6時間のFlutter初級編体験版動画講座を無料でプレゼント)

はじめての方へ

blank
みんプロ式プログラミング講座体系・ラインナップ
みんプロ式プログラミング講座受講の流れ(割引特典利用方法)
サイトマップ(みんプロHPコンテンツ一覧)
運営会社概要

おすすめコンテンツ

プログラミングを学ぶとどんないいことがあるのか
みんプロ式を選んでいただける6つの理由
ぼくの人生挫折ヒストリー(代表者プロフィール)
ぼくのプログラミング挫折ヒストリー(無料メール講座・6大特典付き)
今最も注目のアプリ開発ツール「Flutter(フラッター)」ミニ動画講座

みんプロ式動画講座(コア・Flutter)

ゼロからのFlutter(初級編)-はじめてのプログラミングからアプリリリースまで-
Flutter中級編1-Web通信・設計・状態管理・DIの基礎-
Flutter中級編2-Firebase/地図・カメラ連携等の基礎-
Flutter中級編3-広告/アプリ内課金等の基礎-
Flutter中級編4-Webアプリとレスポンシブデザインの基礎-

みんプロ式動画講座(サテライト)

Flutter/Dartトラブルシューティング・小ネタ集(コア初級編受講で無料プレゼント)
ゼロからのGit・GitHub(コマンドラインツールを極力使わないバージョン管理入門)
Flutter/Dartにおける設計・状態管理・DIの解説集

みんプロ式対面講座(Zoom)

反転授業型3ヶ月集中グループコース(対面講座)
アプリ作成サポート型マンツーマンコース(対面講座)

みんプロ作成アプリ

blank
blank
blank
blank

TOP