web-dev-qa-db-ja.com

アプリケーションが大きすぎますか? dexを実行できません:新しいインデックスを非ジャンボ命令にマージできません

アプリをコンパイルすると、次のエラーが表示されます。

[2014-05-07 21:48:42 - Dex Loader] Unable to execute dex: Cannot merge new index 65536 into a non-jumbo instruction!

パッケージ内のどこかに新しいメソッドを宣言した場合になった時点で、このエラーが発生します。そうしないと、アプリがコンパイルされます。

このエラーの正確な(および正確な)意味を知りたいです。私のアプリは大きいですが、そんなに大きいとは思いません!そう:

  • エラーは、メソッドが多すぎることを意味しますか?公衆?静的?パッケージ?メンバー?
  • ルートパッケージのメソッド/メンバーに関連していますか、それとも含まれているJARライブラリに関連していますか?
  • これに関する詳細なデバッグ情報を取得する方法はありますか?

SOの同様の質問で対処された「ジャンボ」有効化フラグについては既に知っていますが、ジャンボモードはターゲットのAPIレベル(ICS)では使用できないと思います

36
rupps

プロジェクトに含まれるライブラリのメソッドの数に関連しています。たとえば、アプリにトラッキングがある場合、Googleアナリティクスは〜7000メソッドです。 Lombok(2MBのJAR)を使用した私のプロジェクトで、これらの問題が発生しました。このライブラリを取り除くことを解決しました。

11

エラーは、単一のdexファイル内の文字列(メソッド、メンバーなど)の量です。

Dexのジャンボを使用してアプリをコンパイルする必要があります:

dex.force.jumbo=true

project.properties

これにより、dexファイル内の文字列の制限が増加します。そして、プロジェクトはおそらくコンパイルされます。

また、ジャンボセットでは、メソッドの場合のみ64Kの制限があります単一のdexで。将来この制限を取得した場合、いくつかの依存関係を削除する必要があります。

[〜#〜] update [〜#〜]Gradleを使用したビルドの場合:Gradleでは、build.gradleファイルでもjumboModeを有効にできます。

dexOptions {
    jumboMode = true
}

チェック: Androidビルド:Gradleのデックスジャンボモード

また、Gradleを使用すると、メソッドの64K制限を回避できます multidexビルドの使用、チュートリアルはこちら: https://developer.Android.com/tools/building/multidex.html

52
fpanizza

Gradleビルドの場合、dexOptionsをbuild.gradleに追加してジャンボモードを有効にします。

Android {
    dexOptions {
        jumboMode = true
    }
}

新しい建物の前に「gradle clean」を実行することを忘れないでください。

24
gary

プロジェクトのすべてのクラスファイルとJARファイルがDEXの前にまとめられているため、問題が発生したようです。これは完全に真実ではないかもしれませんが、プロジェクトでこれを制御する方法は非常に難しいことが証明されています。最初にこの問題を引き起こしたものを削除しても、クリーニングと再構築は一貫した方法で問題を解決しませんでした。

そこで、この機会にプロジェクトをAndroid Studioに切り替え、デバッグビルドに対してもProGuardを有効にして問題を解決しました。より正確には、ProGuardの処理チェーンの縮小フェーズのみを使用します。

Gradleを使用すると、デバッグビルド用にProGuardを簡単に有効にできます。

buildTypes {
    debug {
        runProguard true
        proguardFile 'proguard-project-debug.txt'
    }
}

次に、使用するデバッグProGuard構成を示します。

-keep class com.your.code.**
# Use -keep to explicitly keep any other classes shrinking would remove
-dontoptimize
-dontobfuscate
-ignorewarnings

これにより、プロジェクトのビルド時間が長くなりますが、良い面はデバッガーが引き続き機能することです。

私が考えることができる唯一のより高速な代替案は、JARファイルから未使用のクラスファイルを手動で削除することです。しかし、これは実行が難しいだけでなく、後でライブラリのわずかに大きな部分を使用したい場合にも不便です。

これが、この問題に苦しんでいる他の開発者の助けになることを願っています。そしておそらく将来、Googleはデフォルトでこのプルーニングを行うコンパイラーを改善できるでしょう。 APK DEXファイルは8MBから2.9MBになりました。

新しいgradle(1.0.0+)バージョン

Android studio(1.0+)の新しいバージョンでは、バンドルされたGradleが更新されました。プロジェクトのGradleファイルがminifyEnabledおよびを活用できるように、ビルドメカニズムの動作にいくつかの変更が加えられました。 shrinkResourcesパラメータ。現在のバージョンは1.1.0です。

Androidのような動きの速いプラットフォームでの変更に対応するには手間がかかりますが、多くの場合、新しい機能、ツール、ビルド時間の短縮が報われます。したがって、Android Studioを更新し、プロジェクトを(慎重に)更新することは、時間をかける価値があります。

buildTypes {
    debug {
        proguardFile 'proguard-project-debug.txt'
        minifyEnabled true
        shrinkResources true
    }
}
7
omahena

いくつかの興味深い観察。マルチフレーバープロジェクトがある場合、同じエラーが表示される場合があります。ややこしい。一般的なコマンドでアプリを実行しようとしたことがわかりました:gradlew installDebug。この問題がなくなったようにコマンドラインを変更したとき。フレーバー部分を実際の部分に置き換えることを忘れないでください。

gradlew installFlavorDebug
0
yuliskov