1. ホーム
  2. android

[解決済み] dexの実行ができない:メソッドIDが[0, 0xffff]にない:65536

2022-03-16 09:40:01

質問

以前にもいろいろなバージョンのdex errosを見たことがありますが、今回のものは新しいものです。ライブラリプロジェクトは無傷で、依存関係も正しくリンクされているようです。

Unable to execute dex: method ID not in [0, 0xffff]: 65536
Conversion to Dalvik format failed: Unable to execute dex: method ID not in [0, 0xffff]: 65536

または

Cannot merge new index 65950 into a non-jumbo instruction

または

java.util.concurrent.ExecutionException: com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536

tl;dr : Googleの公式ソリューションがついに登場!

http://developer.android.com/tools/building/multidex.html

dex-ingを行う際にメモリ不足にならないようにするために必要なことです。

dexOptions {
        javaMaxHeapSize "4g"
}

また、信頼性の低い方法でこれを修正できるジャンボモードもあります。

dexOptions {
        jumboMode true
}

更新: アプリが肥大化し、メインアプリの内部に多くのメソッドがある場合、以下のようにアプリを再編成する必要があるかもしれません。

http://blog.osom.info/2014/12/too-many-methods-in-main-dex.html

解決方法は?

アップデート3(2014/11/3)
Googleがついにリリース 公式説明 .


アップデート2(2014/10/31)
Gradle プラグイン v0.14.0 (Android版) サポート追加 マルチインデックスに対応しました。有効化するためには build.gradle :

android {
   defaultConfig {
      ...
      multiDexEnabled  true
   }
}

アプリケーションが5.0より前のAndroidをサポートしている場合(つまり、あなたの minSdkVersion が 20 以下である場合、動的にパッチを適用する必要があります。 アプリケーションクラスローダ そうすれば、セカンダリ dex からクラスを読み込むことができます。幸いなことに ライブラリ がそれをやってくれます。あなたのアプリの依存関係に追加してください。

dependencies {
  ...
  compile 'com.android.support:multidex:1.0.0'
} 

早速、ClassLoaderのパッチコードを呼び出す必要があります。 MultiDexApplication クラスの ドキュメント は、3つの方法を提案しています(ピック そのうちの1つ 一番使いやすいものを選んでください。)

1 - 宣言する MultiDexApplication クラスをアプリケーションとして AndroidManifest.xml :

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.multidex.myapplication">
    <application
        ...
        android:name="android.support.multidex.MultiDexApplication">
        ...
    </application>
</manifest>

2 Application クラスは MultiDexApplication クラスがあります。

public class MyApplication extends MultiDexApplication { .. }

3 - 呼び出し MultiDex#install から Application#attachBaseContext メソッドを使用します。

public class MyApplication {
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
        ....
    }
    ....
}


アップデート1(2014/10/17)を行いました。
予想通り。 マルチデックスのサポート は、Android サポートライブラリのリビジョン 21 に同梱されています。android-support-multidex.jar は /sdk/extras/android/support/multidex/library/libs フォルダに格納されています。


マルチdexサポートはこの問題を解決します。dx 1.8ではすでに複数のdexファイルを生成することができます。
Android Lでは、マルチデックスをネイティブにサポートし、次のサポートライブラリの改訂では、API 4までの古いリリースをカバーする予定です。

に記載されています。 これ Anwar GhuloumによるAndroid Developers Backstageポッドキャストエピソード。私は トランスクリプトを掲載 (と一般的なマルチデックスの説明)の該当部分です。