React Native系列(6) - 編譯安卓私有React-Native代碼

 

爲什麼要本身編譯React Native安卓私有代碼

咱們在開發中遇到一個HTTP2的問題,React Native安卓客戶端在和HTTP2支持的服務器通信的過程當中會有crash,見css

  1. React-Native HTTP2 issue
  2. How to build private build

因爲時間緊急,發佈期限已經拖了很久了,無法等待官方解決方案,只能在本地作修復而後發佈。html

編譯私有React-Native

針對android,React-Native有官方指導說明.java

過程當中遇到很多坑,記錄以下:node

boost下載失敗

說明文檔裏面指定的 gradle-download-task版本有問題, 要用最新版,老版的2.0.0會拋403下載失敗,致使編譯通不過。測試de.undercouch:gradle-download-task:3.1.2能夠工做。react

classpath 'de.undercouch:gradle-download-task:3.1.2'

NDK版本不對致使編譯失敗

文檔裏面指定NDK是android-ndk-r10e, 我用brew搜不到r10e,因而裝了一個13b, 結果編譯錯誤,只能乖乖手動下載r10e的包而後解壓,而後在.zshrc裏面設置ANDROID_NDK路徑linux

export ANDROID_NDK=/Users/your_home/android-ndk/android-ndk-r10e

用android-ndk-r13b編譯拋錯以下:android

:ReactAndroid:buildReactNdkLib
	[armeabi-v7a] Compile++      : reactnativejni <= Dummy.cpp
	[armeabi-v7a] Compile++      : reactnativejnifb <= CatalystInstanceImpl.cpp
	make: [armeabi-v7a] Compile++      : reactnativejnifb <= CxxModuleWrapper.cpp
	/usr/local/Cellar/android-ndk/r13b/toolchains/arm-linux-androideabi-4.8/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-g++: No such file or directory
	make: /usr/local/Cellar/android-ndk/r13b/toolchains/arm-linux-androideabi-4.8/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-g++: No such file or directory
	[armeabi-v7a] Compile++      : reactnativejnifb <= JExecutorToken.cpp
	make: /usr/local/Cellar/android-ndk/r13b/toolchains/arm-linux-androideabi-4.8/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-g++: No such file or directory
	make: /usr/local/Cellar/android-ndk/r13b/toolchains/arm-linux-androideabi-4.8/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-g++: No such file or directory
	make: *** [/Users/andrewy/sourcecode/github/dgandroid3/ReactNative/dgAndroid/node_modules/react-native/ReactAndroid/build/tmp/buildReactNdkLib/local/armeabi-v7a/objs/reactnativejni/Dummy.o] Error 1
	make: *** Waiting for unfinished jobs....
	make: *** [/Users/andrewy/sourcecode/github/dgandroid3/ReactNative/dgAndroid/node_modules/react-native/ReactAndroid/build/tmp/buildReactNdkLib/local/armeabi-v7a/objs/reactnativejnifb/CxxModuleWrapper.o] Error 1
	make: *** [/Users/andrewy/sourcecode/github/dgandroid3/ReactNative/dgAndroid/node_modules/react-native/ReactAndroid/build/tmp/buildReactNdkLib/local/armeabi-v7a/objs/reactnativejnifb/CatalystInstanceImpl.o] Error 1
	make: *** [/Users/andrewy/sourcecode/github/dgandroid3/ReactNative/dgAndroid/node_modules/react-native/ReactAndroid/build/tmp/buildReactNdkLib/local/armeabi-v7a/objs/reactnativejnifb/JExecutorToken.o] Error 1
	[armeabi-v7a] Compile++      : reactnativejnifb <= JMessageQueueThread.cpp
	make: /usr/local/Cellar/android-ndk/r13b/toolchains/arm-linux-androideabi-4.8/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-g++: No such file or directory
	make: *** [/Users/andrewy/sourcecode/github/dgandroid3/ReactNative/dgAndroid/node_modules/react-native/ReactAndroid/build/tmp/buildReactNdkLib/local/armeabi-v7a/objs/reactnativejnifb/JMessageQueueThread.o] Error 1
	:ReactAndroid:buildReactNdkLib FAILED
	FAILURE: Build failed with an exception.
	* What went wrong:
	Execution failed for task ':ReactAndroid:buildReactNdkLib'.
	> Process 'command '/usr/local/Cellar/android-ndk/r13b/ndk-build'' finished with non-zero exit value 2

react-native-fetch-blob編譯失敗

實際上把後面的react-native 重複的問題解決後這個問題會自動解決,能夠跳過, 仍是要手動改依賴)git

ndk的問題解決之後,react-native-fetch-blob編譯又失敗了.提示okhttp3找不到。github

解決方法: 把react-native-fetch-blob/android/build.gradle下面的macos

compile 'com.facebook.react:react-native:+'

替換成

compile project(':ReactAndroid')

Step 2: Create a local.properties file in the android directory of your react-native app with the following contents:

Example:

sdk.dir=/Users/your_unix_name/android-sdk-macosx
ndk.dir=/Users/your_unix_name/android-ndk/android-ndk-r10e
Download links for Android NDK
Mac OS (64-bit) - http://dl.google.com/android/repository/android-ndk-r10e-darwin-x86_64.zip
Linux (64-bit) - http://dl.google.com/android/repository/android-ndk-r10e-linux-x86_64.zip
Windows (64-bit) - http://dl.google.com/android/repository/android-ndk-r10e-windows-x86_64.zip
Windows (32-bit) - http://dl.google.com/android/repository/android-ndk-r10e-windows-x86.zip
You can find further instructions on the official page.

https://facebook.github.io/react-native/docs/android-building-from-source.html

 

react-native 重複的問題

前面全部問題解決之後還可能會遇到下面的問題

:app:processDebugResources FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task 	':app:processDebugResources'.
> Error: more than one library with package 	name 'com.facebook.react'

解決辦法: 在your_project_root/android/app/build.gradle裏面添加以下配置(放在dependency同一層級便可)

configurations.all {
	exclude group: 'com.facebook.react', module: 'react-native'
}

Boost 下載失敗的問題。

首先,你能夠嘗試更新 gradle-download-task 到 3.1.2,這能夠解決gradle-download-task 2.0.0下載時拋403的問題。

而後,若是你網絡比較差,常常下到一半超時斷線,你能夠在瀏覽器裏面把boost下載下來,而後,命令行裏面boost開始下載之後CTRL+C中斷,而後用瀏覽器裏面下載的boost覆蓋目標boost. 我這邊是

node_modules/react-native/ReactAndroid/build/downloads/boost_1_57_0.zip

再次運行react-native run-android

編譯成功!

而後你的app跑起來的時候可能會遇到下面的問題, 心累!:

Shutting down VM
 FATAL EXCEPTION: main
 Process: com.dealglobe, PID: 2162
 java.lang.UnsatisfiedLinkError: couldn't find DSO to load: libyoga.so
 	at com.facebook.soloader.SoLoader.loadLibraryBySoName(SoLoader.java:314)
 	at com.facebook.soloader.SoLoader.loadLibrary(SoLoader.java:247)
 	at com.facebook.csslayout.YogaNode.<clinit>(YogaNode.java:24)
 	at com.facebook.react.uimanager.ReactShadowNode.<init>(ReactShadowNode.java:82)
 	at com.facebook.react.uimanager.UIImplementation.createRootShadowNode(UIImplementation.java:84)
 	at com.facebook.react.uimanager.UIImplementation.registerRootView(UIImplementation.java:120)
 	at com.facebook.react.uimanager.UIManagerModule.addMeasuredRootView(UIManagerModule.java:198)
 	at com.facebook.react.XReactInstanceManagerImpl.attachMeasuredRootViewToInstance(XReactInstanceManagerImpl.java:803)
 	at com.facebook.react.XReactInstanceManagerImpl.setupReactContext(XReactInstanceManagerImpl.java:778)
 	at com.facebook.react.XReactInstanceManagerImpl.access$700(XReactInstanceManagerImpl.java:110)
 	at com.facebook.react.XReactInstanceManagerImpl$ReactContextInitAsyncTask.onPostExecute(XReactInstanceManagerImpl.java:224)
 	at com.facebook.react.XReactInstanceManagerImpl$ReactContextInitAsyncTask.onPostExecute(XReactInstanceManagerImpl.java:193)
 	at android.os.AsyncTask.finish(AsyncTask.java:632)
 	at android.os.AsyncTask.access$600(AsyncTask.java:177)
 	at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
 	at android.os.Handler.dispatchMessage(Handler.java:102)
 	at android.os.Looper.loop(Looper.java:135)
 	at android.app.ActivityThread.main(ActivityThread.java:5221)
 	at java.lang.reflect.Method.invoke(Native Method)
 	at java.lang.reflect.Method.invoke(Method.java:372)
 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

經證明,這個是由於react-native代碼不穩定形成的,切換到0.40-stable問題就消失了。

http://blog.ilibrary.me/2016/12/04/%E7%BC%96%E8%AF%91%E7%A7%81%E6%9C%89react-native%E4%BB%A3%E7%A0%81

相關文章
相關標籤/搜索