2018年9月7日金曜日

ReactNativeのAndroid版でMiltidexを有効にする方法


背景

ReactNativeとはFacebookが開発しているスマートフォンアプリをJavaScriptで開発できるフレームワークです。
Android版のReactNativeアプリででライブラリを多用すると、関数の数が65536を超えてビルドエラーになることがあります。

このエラーは64K問題と呼ばれることがあります。
Multidexというdexファイルを1つのアプリに複数もたせる機能を有効にすると、64K制限がdexファイルごとに適用されるため、64K問題を解決出来る場合があります。
(自分の場合は解決できました。)
備忘録を兼ねてMultidexの適用方法を共有します。

表示されるエラー

64K問題が発生すると、下記のようなメッセージが出てビルドが失敗します。
BUILD FAILED in 1m 24s
262 actionable tasks: 246 executed, 16 up-to-date
Could not install the app on the device, read the error above for details.
Make sure you have an Android emulator running or a device connected and have
set up your Android development environment:
https://facebook.github.io/react-native/docs/getting-started.html

上記の記述だけでは原因が分からないのですが、ログを遡るとこのような記述があり、64K問題が発生していることが分かります。
D8: Cannot fit requested classes in a single dex file. Try supplying a main-dex list.
# fields: 66666 > 65536

> Task :app:transformDexArchiveWithDexMergerForDebug FAILED
java.lang.RuntimeException: java.lang.RuntimeException: com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives:

注意点

Androidのバージョンが5より前の端末でMultidexを有効にするには、今回説明する方法以外にも設定が必要になるようです。
5より前の端末も対応したい場合はAndroidの説明ページの「Android 5.0 よりも前の Multidex サポート」を参考にして設定するか、Multidex以外の64K問題対応方法を試してみてください。

Multidexの設定方法


Androidの説明ページStackOverFlowでのやりとりgithubに公開されているメモなどを参考にしながら、下記の変更を行いました。

build.gradleにmultiDexEnableを有効にするフラグと、依存ライブラリを追加します。
android/app/build.gradle
android {
    defaultConfig {
        multiDexEnabled true // add this line
    }
}

dependencies {
    compile 'com.android.support:multidex:1.0.3' // add this line
}

android/app/src/main/java/{depends_on_your_app}/MainApplication.java
import android.support.multidex.MultiDexApplication; // add this line
 
// public class MainApplication extends Application implements ReactApplication {  // remove this line
public class MainApplication extends MultiDexApplication implements ReactApplication {  // add this line

}

上記の記述を追加すると、自分が担当していて64K問題が発生したプロジェクトでは、問題を回避してビルドできようになりました。

まとめ

ReactNativeアプリでMultidexを有効にして、64K問題を回避できました。

参考になれば嬉しいです。

0 件のコメント :