为何要自己编译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.cppmake: [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 directorymake: /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.cppmake: /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 directorymake: /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 directorymake: *** [/Users/andrewy/sourcecode/github/dgandroid3/ReactNative/dgAndroid/node_modules/react-native/ReactAndroid/build/tmp/buildReactNdkLib/local/armeabi-v7a/objs/reactnativejni/Dummy.o] Error 1make: *** 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 1make: *** [/Users/andrewy/sourcecode/github/dgandroid3/ReactNative/dgAndroid/node_modules/react-native/ReactAndroid/build/tmp/buildReactNdkLib/local/armeabi-v7a/objs/reactnativejnifb/CatalystInstanceImpl.o] Error 1make: *** [/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.cppmake: /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 directorymake: *** [/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 FAILEDFAILURE: 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 FAILEDFAILURE: 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 VMFATAL EXCEPTION: mainProcess: com.dealglobe, PID: 2162java.lang.UnsatisfiedLinkError: couldn't find DSO to load: libyoga.soat 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

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

  1. React 深入系列3:Props 和 State

    文:徐超,<React进阶之路>作者 授权发布,转载请注明作者及出处 React 深入系列3:Props 和 State React 深入系列,深入讲解了React中的重点概念.特性和模式 ...

  2. React 深入系列4:组件的生命周期

    文:徐超,<React进阶之路>作者 授权发布,转载请注明作者及出处 React 深入系列4:组件的生命周期 React 深入系列,深入讲解了React中的重点概念.特性和模式等,旨在帮助 ...

  3. web前端高级React - React从入门到进阶之初识React

    第一部分:React入门 系列文章目录 第一章:React从入门到进阶之初识React 第一章:React从入门到进阶之JSX简介 第三章:React从入门到进阶之元素渲染 第四章:React从入门到 ...

  4. Facebook 开源安卓版 React Native,开发者可将相同代码用于网页和 iOS 应用开发

    转自:http://mt.sohu.com/20150915/n421177212.shtml Facebook 创建了React Java 库,这样,Facebook 的工程团队就可以用相同的代码给 ...

  5. android 网络时区 错误,React native 安卓机器上调试代码报错:网络请求出错TypeError: Network request failed...

    React native 安卓机器上调试代码报错:网络请求出错TypeError: Network request failed 安卓机器 usb连接调试 报错信息 TypeError: Networ ...

  6. 【REACT NATIVE 系列教程之十三】利用LISTVIEW与TEXTINPUT制作聊天/对话框获取组件实例常用的两种方式...

    本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/react-native/2346.html ...

  7. 【REACT NATIVE 系列教程之十二】REACT NATIVE(JS/ES)与IOS(OBJECT-C)交互通信

    一用到跨平台的引擎必然要有引擎与各平台原生进行交互通信的需要.那么Himi先讲解React Native与iOS之间的通信交互. 本篇主要分为两部分讲解:(关于其中讲解的OC语法等不介绍,不懂的请自行 ...

  8. 【一起进大厂】7天掌握react基础系列(1)

    导读 本教程适合初学者入门,以及很久没有开发过react项目的同学温故知新.由于本人所在公司,大多数同学原来多数是vue技术栈, 在一次项目组会上分享上面,分享了react的项目,因为大厂基本都用re ...

  9. react dispatch_React系列自定义Hooks很简单

    React系列-Mixin.HOC.Render Props(上) React系列-轻松学会Hooks(中) React系列-自定义Hooks很简单(下) 我们在第二篇文章中介绍了一些常用的hooks ...

最新文章

  1. 计算机打印机用户,如何:在 Windows 窗体中选择连接到用户计算机的打印机
  2. 短视频APP开发:短视频特效SDK功能火爆来袭!
  3. Jfinal 文件上传
  4. jquery对文本赋值和取值_jQuery对表单元素的取值和赋值操作代码
  5. Html5与CSS3权威指南 百度云下载
  6. 特斯拉亚洲最大超级充电站正式运营,可同时提供20辆车的快充服务
  7. 实例验证WEB浏览器智能应对节点失效
  8. 添加SAP_ALL权限
  9. python解决字符串替换问题
  10. Centos7安装iNode客户端
  11. wi7计算机桌面删除,如何删除win7系统桌面IE图标|win7删除桌面IE图标的方法
  12. 如何使用 Python 将 Nifti 文件转换为 Dicom 系列
  13. k8s入坑之报错(4)报错:repomod.xml signature could not be verified
  14. 流量负载_指挥流量:揭开互联网规模负载平衡的神秘面纱
  15. Win10双网卡不双待攻略
  16. ZOJ 3328 Wu Xing(游戏)
  17. 计算机网络应用模拟试卷,《计算机网络应用基础》模拟试卷(八)(附答案)
  18. vmwaretools是灰色的 典型安装
  19. android 雷达搜索动画,Android实现微信雷达辐射搜索好友实例(逻辑清晰实现简单)...
  20. java实现文件加密(word、excel、pdf、ppt)

热门文章

  1. Windows 公共控件库研究
  2. Oracle表空间离线在线切换和数据库关闭启动操作图解
  3. ivew 封装删除 对话框
  4. kubernetes实战篇之通过api-server访问dashboard
  5. dp_c_区间dp_g
  6. Linux之编译安装MySQL
  7. [Android] 开发第六天
  8. Exception in thread AWT-EventQueue-0 java.lang.IllegalThreadStateException
  9. python绘图模块pandas_python绘图:matplotlib和pandas的应用
  10. 机器学习书籍资料(自己正在读的)---self-reading ML booklist ( To be continued )