読者です 読者をやめる 読者になる 読者になる

おすしたべたい

おすしがたくさん食べられるようにがんばるブログ

MultiDexでクソはまった

普段はLollipopで開発していて、ゴリゴリ進めていたら突然のDexIndexOverflowExceptionなるものが発生。
よくわからなかったのでググッてどこかのStackOverflowの回答で出てた対策で適当に対応していた。
内容は、build.gradleに以下を追加するというもの。

android {
  defaultConfig {
    multiDexEnabled true
  }
}

この時は普通に動いたので特に何も気にしていなかった。

が、時は過ぎひと通り出来上がったところで(今更)KitKatでチェックしてみると、謎のエラーを吐きまくって実行できない。
java.lang.NoClassDefFoundErrorなんていう悲しい例外がすろーされまくって(自分が育てたクラスなのに…)アプリが起動する前に落ちてしまう。。 ということで一生懸命調べました。

そして!ついに!たどり着いたStackOverflowの記事がこちらになります。

stackoverflow.com

散々時間かけて悩んでソースコードの色んなところをコメントアウトしたり戻したりしてわけわかんなくなってましたが、結構前にbuild.guradleに追加したmultiDexEnabledがいけなかったんですねー。よくわからんものをよくわからんまま使うなということですねー。

そして最終的に辿り着いたのがこの記事でした。本当にありがとうございます。 wannabe-jellyfish.hatenablog.com

この記事によると

apkに含められるメソッドの総数は65,535が上限

だそうです。

所謂65k制限ってやつなんでしょうか?お前かよ!!!!!!!

multiDexEnabledはLollipop以降しかよしなにやってくれないようなので、KitKat以下でもよしなにやってもらえるようにするためにはそれ用のサポートライブラリを使えばいいようです。

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

ほとんど上の記事からの引用ですが、後はApplicationにMultiDexApplicationクラスを利用するか、独自のApplicationを利用している場合はMultiDexApplicationを継承して、MultiDex.install(this);すればいいようです。

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

これですべて解決出来ました。ここまでたどり着くのにすごく時間がかかった……

以上、現場からお伝えしました。