2017年2月14日火曜日

MultiDexについて

こんばんは。

ビルドしているとある日突然、エラーとなりました。

Execution failed for task ':app:transformClassesWithDexForDebug'.
> com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536


単一の DEX ファイル内で参照できるメソッドの総数が 65,536 に制限されているそうです。
このエラーに単純に対応するのなら、MultiDexについて書かれている、以下を参照してください。

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


しかし、ちょっと待ってください!!


本当にメソッドの総数が65,536を超えるほどに、コーディングしたのでしょうか。
私は、電卓を作成したときでさえ、上記エラーとなってしまいました。
そのときは、疑問を持ちつつ、MultiDexの対応をしました。
電卓ほどの簡単なプログラムでさえ、MultiDexの対応をする必要があることに疑問を持っていたのです。

そもそも、自分ではそんなにコーディングしていません。参照しているライブラリで、65,536を超えていたのです。

例えば、Google Play Serviceを以下のようにbuild.gradleに設定してしまうと、65,536を超えます。



使いたいライブラリだけ参照するようにすれば、参照メソッド数を抑えられます。

例えば、Google DRIVEを使いたい場合、以下のようにすればよいです。


Google Play Serviceは以前は分かれていなかったそうですが、今は、分かれています。
詳しくは、以下を参照してください。

https://developers.google.com/android/guides/setup


選別せずに、Google Play Serviceを丸ごと設定し、MultiDexを設定していると、当然、apkファイルが大きくなってしまいます。
ビルドに時間がかかり、Debug時等のInstallで時間がかかり、時間の無駄です。

いまのところ、本棚もMultiDex対応せずに済んでいます。

0 件のコメント:

コメントを投稿