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

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

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


今すぐ無料お試しキットを受け取る

はじめての方へ


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

みんプロ作成アプリ





TOP