React Native系列(6) - 编译安卓私有React-Native代码
为何要自己编译React Native安卓私有代码
我们在开发中遇到一个HTTP2的问题,React Native安卓客户端在和HTTP2支持的服务器通讯的过程中会有crash,见
由于时间紧急,发布期限已经拖了好久了,没法等待官方解决方案,只能在本地做修复然后发布。
编译私有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
React Native系列(6) - 编译安卓私有React-Native代码的更多相关文章
- C++的性能C#的产能?! - .Net Native 系列《三》:.NET Native部署测试方案及样例
之前一文<c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATIVE初窥> 获得很多朋友支持和鼓励,也更让我坚定做这项技术的推广者,希望能让更多的朋友了解这项技术,于是先从官方 ...
- C++的性能C#的产能?! - .Net Native 系列《二》:.NET Native开发流程详解
之前一文<c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATIVE初窥> 获得很多朋友支持和鼓励,也更让我坚定做这项技术的推广者,希望能让更多的朋友了解这项技术,于是先从官方 ...
- C++的性能C#的产能?! - .Net Native 系列《一》:.NET Native安装和配置
之前一文<c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATIVE初窥> 获得很多朋友支持和鼓励,也更让我坚定做这项技术的推广者,希望能让更多的朋友了解这项技术,于是先从官方 ...
- React 深入系列1:React 中的元素、组件、实例和节点
文:徐超,<React进阶之路>作者 授权发布,转载请注明作者及出处 React 深入系列,深入讲解了React中的重点概念.特性和模式等,旨在帮助大家加深对React的理解,以及在项目中 ...
- React 深入系列2:组件分类
文:徐超,<React进阶之路>作者 授权发布,转载请注明作者及出处 React 深入系列2:组件分类 React 深入系列,深入讲解了React中的重点概念.特性和模式等,旨在帮助大家加 ...
- React 深入系列3:Props 和 State
文:徐超,<React进阶之路>作者 授权发布,转载请注明作者及出处 React 深入系列3:Props 和 State React 深入系列,深入讲解了React中的重点概念.特性和模式 ...
- React 深入系列4:组件的生命周期
文:徐超,<React进阶之路>作者 授权发布,转载请注明作者及出处 React 深入系列4:组件的生命周期 React 深入系列,深入讲解了React中的重点概念.特性和模式等,旨在帮助 ...
- React 深入系列5:事件处理
文:徐超,<React进阶之路>作者 授权发布,转载请注明作者及出处 React 深入系列5:事件处理 React 深入系列,深入讲解了React中的重点概念.特性和模式等,旨在帮助大家加 ...
- C++的性能C#的产能?! - .Net Native 系列五:.Net Native与反射
此系列系小九的学堂原创翻译,翻译自微软官方开发向导,一共分为六个主题.本文是第五个主题:.Net Native与反射. 向导文链接:<C++的性能C#的产能?! - .Net Native 系列 ...
随机推荐
- Linux常用命令(第二版) --Shell应用技巧
Shell应用技巧 小技巧: 1.命令补全功能: <Tab>键 2.清屏: Ctrl+l 3.删除光标前所有内容: Ctrl+u 4.命令历史记录: history 这时: !histo ...
- MongoDB之Java测试代码(DAO层)
MongoInit.java是数据库初始化及连接类 MongoUtils.java是对mongodb的各种操作方法 MongoInit.java package com.wlwcloud.datate ...
- 关于UIView用户交互相关的属性和方法
UIView除了负责展示内容给用户外还负责响应用户事件 1.交互相关的属性 userInteractionEnabled 默认是YES ,如果设置为NO则不响应用户事件,并且把当前控件从事件队列中删除 ...
- Windows核心编程读书笔记1
今天特别困啊,这是为什么?!!刚刚把第一章看了一下,困到不行,所以写blog清醒一下. 第一章标题是“错误处理”,看了之后吓了一跳,难道第一章就讲这么高大上的东西?!不是不是,我现在的理解是,这章主要 ...
- Cocoa编程之IBAction和IBOutlet含义
IBAction / IBOutlet / IBOutletCollection 时间 2014-05-05 15:00:00 NSHipster原文 http://nshipster.com/i ...
- 面向对象(this的问题二)
<!DOCTYPE HTML><html><head><meta http-equiv="Content-Type" content=&q ...
- 深入了解Collections
在 Java集合类框架里有两个类叫做Collections(注意,不是Collection!)和Arrays,这是JCF里面功能强大的工具,但初学者往往会忽视.按JCF文档的说法,这两个类提供了封装器 ...
- 转载 jQueryEasyUI Messager基本使用
http://www.cnblogs.com/libingql/archive/2011/07/17/2109020.html 一.jQueryEasyUI下载地址 http://www.jeasyu ...
- 用Socket编写的聊天小程序
Socket是什么? 是套接字,除此之外我也不太清楚,先略过 直接上实例,首先服务端: ; //自定义端口号 private string ServerUser = "Tracy" ...
- 【转】地球坐标系 (WGS-84) 到火星坐标系 (GCJ-02) 的转换算法
// // Copyright (C) 1000 - 9999 Somebody Anonymous // NO WARRANTY OR GUARANTEE // using System; name ...