ReactNativeで開発中、Androidのビルドで64K問題のエラーが出てハマった

64K問題

ReactNativeに限った話ではないが

Androidアプリでメソッド数が65536を超えるとビルドエラーになる問題のこと

Androidエンジニアにとっては常識だと思うが、Webから入った人間からすると結構厄介だった

検索すると沢山ヒットする

分かりやすかった記事

dev.classmethod.jp

こんなエラーが出る

f:id:rskull:20170731233923p:plain

調査する

前提として64K以上いけるMultidex化はしたくない

ビルドしたapkファイルにいくつメソッドがあるか調べる

dex-method-counts を使う方法があるけど、Android Studioの標準機能で出来る

これ64Kでビルド落ちた時apk作られないから調べられなくない…?

とりあえず、ビルド通ってた時期のapkファイルを調べてみた

f:id:rskull:20170731235542p:plain

めっちゃギリギリ! このあと新しい機能を入れたら落ちるようになったので、まずは原因を調査

$ ./gradlew :app:dependencies

を実行すると依存してるパッケージの一覧が出る

64K問題の原因で多いのは google-services 系を全パッケージ読み込んでるとか、別々のバージョンが入ってるとからしい

medium.com

compile (project(':react-native-device-info')){
    exclude group: "com.google.android.gms" 
}
compile ("com.google.android.gms:play-services-gcm:10.0.1") {
    force = true;
}

exclude するとコンパイル対象から除外されるので、依存してるreactnativeのパッケージからすべて除外して 最後に除外した play-services-xxx を必要なもののみ追加する

ここら辺の設定は人による

いろいろやってメソッド数が減ったのは確認できたけど、目的の機能入れたときに結局落ちた

中途半端になってしまったが調査中‥

いい方法を知りたい