背景
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 件のコメント :
コメントを投稿