[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.

 

この「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以上に

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

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

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

GAMBO(願望) 願望実現・目標達成の
17秒 / 68秒ワーク
GAMBO(願望) 引き寄せ難民だったぼくの挫折経験から生まれた誰でもできる願望実現サポートアプリ。かの有名な17秒/68秒ワークを独自の視覚化メソッドで簡単実践。
App Store / Google Play 詳しく見る →
Meiso(瞑想) 鐘音と自然音で
5分からのマインドフルネス
Meiso(瞑想) 初心者でも“迷わず続けられる”ことにこだわった、完全無料の瞑想アプリ。画面のガイドに従うだけで呼吸のリズムが整い、最短5分から瞑想を実践できます。
App Store / Google Play 詳しく見る →
小学生からの英検®単語 A ふりがな・音声付き
英検単語1日5分トレーニング
小学生からの英検®単語 ありそうでなかった!ふりがな付き英検®単語トレーニングアプリ!1日たった5分!スキマ時間を活用して、英検®頻出単語を効率的に習得。お子様の一人学習にも安心設計。
App Store / Google Play 詳しく見る →
オボエルンジャー レトロゲームで
nバック脳トレ
オボエルンジャー 科学的脳力開発法「Nバック課題」をファミコン風8bitレトロゲームにアレンジした新感覚脳トレアプリ。記憶力・感情コントロール力・集中力の向上に。
App Store / Google Play 詳しく見る →
ゴイコイコイ 超高速フラッシュカードで
語彙習得
ゴイコイコイ 日常語1400語を視覚的に学べる、高速読み上げフラッシュカード式の語彙トレーニングアプリ。知育教室で行われるフラッシュカード学習を、家庭で“手軽に・安価に・正確に”再現。
App Store / Google Play 詳しく見る →

TOP