recolog

@t0m0120

ReactNativeAndroidのJSCをv8に変える

September 09, 2019

発端

参考Issue
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR) libjsc.so still occuring on Caterpillar S41 (Android 8.0) #25494
App Crash on Android OS 6 Samsung Galaxy S7 SM-G930FD (JSC Crash) 64 bit support A/libc: Fatal signal 11 (SIGSEGV) #24261

signal 11 (SIGSEGV), code 1 (SEGV_MAPERR)
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
pid: 0, tid: 0 >>> com.myapp <<<

backtrace:
  #00  pc 00000000000f7748  /data/app/com.myapp-Fgc_pnA5bQP7DCgIn51TQQ==/lib/arm64/libjsc.so
  #01  pc 0000000000143fe8  /data/app/com.myapp-Fgc_pnA5bQP7DCgIn51TQQ==/lib/arm64/libjsc.so
  #02  pc 000000000012f0a8  /data/app/com.myapp-Fgc_pnA5bQP7DCgIn51TQQ==/lib/arm64/libjsc.so
  #03  pc 0000000000139484  /data/app/com.myapp-Fgc_pnA5bQP7DCgIn51TQQ==/lib/arm64/libjsc.so
  #04  pc 000000000013900c  /data/app/com.myapp-Fgc_pnA5bQP7DCgIn51TQQ==/lib/arm64/libjsc.so
  #05  pc 00000000001fb9c4  /data/app/com.myapp-Fgc_pnA5bQP7DCgIn51TQQ==/lib/arm64/libjsc.so
  #06  pc 00000000001f8e90  /data/app/com.myapp-Fgc_pnA5bQP7DCgIn51TQQ==/lib/arm64/libjsc.so
  #07  pc 00000000001f96bc  /data/app/com.myapp-Fgc_pnA5bQP7DCgIn51TQQ==/lib/arm64/libjsc.so
  #08  pc 00000000001e41a0  /data/app/com.myapp-Fgc_pnA5bQP7DCgIn51TQQ==/lib/arm64/libjsc.so
  #09  pc 00000000006171ec  /data/app/com.myapp-Fgc_pnA5bQP7DCgIn51TQQ==/lib/arm64/libjsc.so
  #10  pc 0000000000617950  /data/app/com.myapp-Fgc_pnA5bQP7DCgIn51TQQ==/lib/arm64/libjsc.so
  #11  pc 000000000060de7c  /data/app/com.myapp-Fgc_pnA5bQP7DCgIn51TQQ==/lib/arm64/libjsc.so
  #12  pc 000000000061b084  /data/app/com.myapp-Fgc_pnA5bQP7DCgIn51TQQ==/lib/arm64/libjsc.so
  #13  pc 0000000000646dc8  /data/app/com.myapp-Fgc_pnA5bQP7DCgIn51TQQ==/lib/arm64/libjsc.so
  #14  pc 0000000000066f34  /system/lib64/libc.so (_ZL15__pthread_startPv+36)
  #15  pc 000000000001eb94  /system/lib64/libc.so (__start_thread+68)

signal 11 (SIGSEGV), code 1 (SEGV_MAPERR)のエラーが端末を問わずに多発していた。
実機やAWSのDeviceFarmなどで色々試してみたがクラッシュが起きない。。。

JSCが原因っぽく0.59以前のバージョンなら治るっぽいがAndroidが64bit必須になっているので0.59以下にAndroidを下げられない。

代替案としてv0.60以上で実装されるUsing Hermes/ReactNativeを使うか ReactNativeでV8のRuntimeをサポートしたJSCに載せ替えるKudo/react-native-v8を使うの 2択っぽかった

SocialDogのversionは0.59.10だったのでどちらを試すか迷ったが
Hermesはまだ出たばかりかつrealmなど対応していないライブラリがあるっぽく危険に感じたので
Kudo/react-native-v8を試してみた。

0.59.10の場合はpatch2以下だと日本語がデバッグモードで文字化けしてしまうためpatch.2でyarn addする。
すぐに対応してもらって助かった。。。 Run code directly from dev server cause Non-Ascii characters garbled #13

yarn add 'react-native-v8@>=0.59.10-patch.2 <0.59.11'

--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -161,11 +161,18 @@ android {
             }
         }
     }
+
+    packagingOptions {
+        // Make sure libjsc.so does not packed in APK
+        exclude "**/libjsc.so"
+    }
 }

 dependencies {
     implementation fileTree(dir: "libs", include: ["*.jar"])
     implementation "com.facebook.react:react-native:+"  // From node_modules
+    // Add v8-android - prebuilt libv8.so into APK
+    implementation 'org.chromium:v8-android:+'

     // JSC from node_modules
     if (useIntlJsc) {
--- a/android/build.gradle
+++ b/android/build.gradle
@@ -24,8 +24,12 @@ allprojects {
     repositories {
         mavenLocal()
         maven {
-            // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
-            url("$rootDir/../node_modules/react-native/android")
+            // Replace AAR from original RN with AAR from react-native-v8
+            url("$rootDir/../node_modules/react-native-v8/dist")
+        }
+        maven {
+            // prebuilt libv8.so
+            url("$rootDir/../node_modules/v8-android/dist")
         }
         maven {
             // Android JSC is installed from npm

これでDebugModeを立ち上げずに下記console.logを叩いて Xcodeかadb logcatで確認する。 (DebugModeを立ち上げるとブラウザのjsエンジンになるので注意

console.log(`V8 version is ${global._v8runtime().version}`);

プロダクションの方をreact-native-v8に載せ替えてリリースし1週間弱動かしてみているが
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR)のクラッシュは起きなくなったっぽい

この辺もあってAndroidのUITsetなど工数かけて行った感がある。
issueは追いかけておくがとりあえずは解決・・・?