React Nativeの64bit対応
はじめに
GoogleからGoogle Playに公開しているアプリが64bitに対応していないから対応するように!というメールが来てました。
ドキュメントを見たら簡単にできそうなのでやってみたのですが、64bit対応するにはReact Nativeのバージョンを上げる必要があった事もあり、めちゃくちゃ大変でした。(休日が潰れた・・・)
大変だった思い出を残す事にしました。(完全な思い出メモなので、今後の役に立つかは微妙です。)
パッケージのバージョンアップ
react:16.0.0 → 16.8.6
react-native:0.51.1 → 0.59.8
native-base:2.4.5 → 2.12.1
flow-bin:0.67.1 → 0.100.0
react-native-localization:1.0.12 → 2.1.2
react-native-progress:3.5.0 → 3.6.0
react-native-splash-screen:3.0.6 → 3.2.0
react-native-sqlite-storage:3.3.6 → 3.3.10
react-native-vector-icons:5.0.0 → 6.4.2
react-navigation:2.10.0 → 3.11.0
metro-react-native-babel-preset:0.54.1(追加)
react-native-gesture-handler:1.3.0(追加)
react-native-firebase: 5.4.2(追加)
react-native-admob:不安定でメンテナンスされていないため削除。react-native-firebaseに置き換える事にする。
追加後に、
react-native link
build.gradleの修正
buildToolsVersionとかcompileSdkVersionを正しく指定しないとエラーになるのですが、ここはいつもトライ&エラーで時間が掛かります。
すぐに解決できる方法は無いのでしょうか。
今回は以下で動きました。
buildscript {
ext {
buildToolsVersion = "28.0.3"
minSdkVersion = 16
compileSdkVersion = 28
targetSdkVersion = 28
supportLibVersion = "27.1.1"
}
repositories {
maven {
url 'https://maven.google.com/'
name 'Google'
}
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.3.2'
classpath 'com.google.gms:google-services:4.2.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
追加
subprojects { subproject ->
afterEvaluate{
if((subproject.plugins.hasPlugin('android') || subproject.plugins.hasPlugin('android-library'))) {
android {
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
}
}
}
}
末尾に追加
task wrapper(type: Wrapper) {
gradleVersion = '4.10.1'
distributionUrl = "https\\://services.gradle.org/distributions/gradle-4.10.1-all.zip"
}
app\build.gradleの修正
64bit化の部分①
splits {
abi {
include "armeabi-v7a", "x86", "arm64-v8a", "x86_64"
}
}
64bit化の部分②
applicationVariants.all { variant ->
variant.outputs.each { output ->
def versionCodes = ["armeabi-v7a":1, "x86":2, "arm64-v8a": 3, "x86_64": 4]
}
}
react-nativeのバージョンアップ、react-native-firebaseの追加などによって修正が必要
dependencies {
implementation project(':react-native-firebase')
implementation project(':react-native-gesture-handler')
compile ("com.facebook.react:react-native:0.59.8") { force = true }
implementation "com.google.android.gms:play-services-base:16.1.0"
implementation "com.google.firebase:firebase-core:16.0.9"
implementation "com.google.firebase:firebase-ads:15.0.1"
}
末尾に追加
apply plugin: 'com.google.gms.google-services'
app\proguard-rules.proの修正
React Native Firebaseのドキュメントに書いてあったので追加
-keep class io.invertase.firebase.** { *; }
-dontwarn io.invertase.firebase.**
gradle\wrapper\gradle-wrapper.propertiesの修正
修正前は「gradle-3.5.1-all.zip」でした。
distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip
.babelrcの修正
metro-react-native-babel-preset を使用するように修正
{
"presets": ["module:metro-react-native-babel-preset"]
}
settings.gradleの修正
include ':react-native-firebase'
project(':react-native-firebase').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-firebase/android')
include ':react-native-gesture-handler'
project(':react-native-gesture-handler').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-gesture-handler/android')
MainActivity.javaの修正
react-navigationをv2からv3に上げた事により、react-native-gesture-handlerというものが必要になりました。
そのための修正です。
import com.facebook.react.ReactActivityDelegate;
import com.facebook.react.ReactRootView;
import com.swmansion.gesturehandler.react.RNGestureHandlerEnabledRootView;
@Override
protected ReactActivityDelegate createReactActivityDelegate() {
return new ReactActivityDelegate(this, getMainComponentName()) {
@Override
protected ReactRootView createRootView() {
return new RNGestureHandlerEnabledRootView(MainActivity.this);
}
};
}
MainApplication.javaの修正
react-native-gesture-handlerとreact-native-firebaseを追加した事による修正
import com.facebook.react.ReactActivityDelegate;
import com.facebook.react.ReactRootView;
import com.swmansion.gesturehandler.react.RNGestureHandlerEnabledRootView;
@Override
import com.swmansion.gesturehandler.react.RNGestureHandlerPackage;
import io.invertase.firebase.RNFirebasePackage;
import io.invertase.firebase.admob.RNFirebaseAdMobPackage;
@Override
protected List getPackages() {
return Arrays.asList(
new RNGestureHandlerPackage(),
new RNFirebasePackage(),
new RNFirebaseAdMobPackage()
);
}
エラー吐きまくりでめっちゃ大変でしたが、何とか動くところまでこぎつけました。
react-native-firebase入れたら、アプリのサイズが大きくなったのを何とかしたいです。
ディスカッション
コメント一覧
まだ、コメントがありません