React Native系列(6) - 编译安卓私有React-Native代码

简介: 为何要自己编译React Native安卓私有代码 我们在开发中遇到一个HTTP2的问题,React Native安卓客户端在和HTTP2支持的服务器通讯的过程中会有crash,见 React-Native HTTP2 issue How to build private build 由于时间紧急,发布期限已经拖了好久了,没法等待官方解决方案,只能在本地做修复然后发布。

 

为何要自己编译React Native安卓私有代码

我们在开发中遇到一个HTTP2的问题,React Native安卓客户端在和HTTP2支持的服务器通讯的过程中会有crash,见

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

由于时间紧急,发布期限已经拖了好久了,没法等待官方解决方案,只能在本地做修复然后发布。

编译私有React-Native

针对android,React-Native有官方指导说明.

过程中遇到不少坑,记录如下:

boost下载失败

说明文档里面指定的 gradle-download-task版本有问题, 要用最新版,老版的2.0.0会抛403下载失败,导致编译通不过。测试de.undercouch:gradle-download-task:3.1.2可以工作。

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

NDK版本不对导致编译失败

文档里面指定NDK是android-ndk-r10e, 我用brew搜不到r10e,于是装了一个13b, 结果编译错误,只能乖乖手动下载r10e的包然后解压,然后在.zshrc里面设置ANDROID_NDK路径

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

用android-ndk-r13b编译抛错如下:

	: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 重复的问题解决后这个问题会自动解决,可以跳过, 还是要手动改依赖)

ndk的问题解决以后,react-native-fetch-blob编译又失败了.提示okhttp3找不到。

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

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

 

相关文章
|
30天前
|
Ubuntu 网络协议 Java
【Android平板编程】远程Ubuntu服务器code-server编程写代码
【Android平板编程】远程Ubuntu服务器code-server编程写代码
|
2月前
|
Android开发
安卓SO层开发 -- 编译指定平台的SO文件
安卓SO层开发 -- 编译指定平台的SO文件
29 0
|
2月前
|
开发框架 前端开发 JavaScript
探索前端开发中的跨平台框架React Native
本文将介绍前端开发中一种备受关注的跨平台框架React Native,通过比较原生应用与React Native的优缺点,探讨其在实际项目中的应用以及未来发展趋势。
|
2月前
|
开发框架 前端开发 JavaScript
从零开始学习React Native开发
React Native是一种基于React框架的移动端开发框架,使用它可以快速地构建出高性能、原生的移动应用。本文将从零开始,介绍React Native的基础知识和开发流程,帮助读者快速入门React Native开发,并实现一个简单的ToDo应用程序。
|
3月前
|
前端开发 JavaScript Android开发
跨端技术栈综合考察:深入剖析 UniApp、Flutter、Taro 和 React Native 的优势与限制
跨端技术栈综合考察:深入剖析 UniApp、Flutter、Taro 和 React Native 的优势与限制
|
1月前
|
前端开发 开发者
React Hooks:提升前端开发效率和代码可维护性
传统的 React 类组件在处理状态管理和生命周期函数时存在一些限制,而引入的 React Hooks 技术可以帮助前端开发者更高效地管理组件状态和逻辑,提升代码的可读性和可维护性。本文将介绍 React Hooks 的基本用法及其在实际项目中的应用场景。
|
2月前
|
存储 前端开发 JavaScript
从零开始学习React Native开发
【2月更文挑战第1天】React Native是一种跨平台的移动应用程序框架,可以使用JavaScript和React来构建Android和iOS应用程序。本文将带您从零开始学习React Native开发,涵盖了基础知识、组件、样式、布局、API等方面。
|
2月前
|
前端开发 IDE 小程序
【社区每周】React Native 初探;应用中支持添加应用管理员(2月第一期)
【社区每周】React Native 初探;应用中支持添加应用管理员(2月第一期)
32 0
|
2月前
|
Ubuntu 网络协议 Linux
【Linux】Android平板上远程连接Ubuntu服务器code-server进行代码开发
【Linux】Android平板上远程连接Ubuntu服务器code-server进行代码开发
45 0
|
3月前
|
移动开发 前端开发 JavaScript
探究移动端混合开发技术:React Native、Weex、Flutter的比较与选择
移动端混合开发技术在移动应用开发领域日益流行,为开发者提供了更高效的跨平台开发方案。本文将比较三种主流混合开发技术:React Native、Weex和Flutter,从性能、生态系统和开发体验等方面进行评估,以帮助开发者在选择适合自己项目的技术时做出明智的决策。