将React Native集成至Android原生应用

Android Studio 2.1 Preview 4生成的空项目
react-native 环境 0.22.2

初次编译后apk有1.1M,还算可以接受。 默认依赖的lib如下图所示:

1.app/build.gradle里添加如下代码:

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

再次编译后apk竟然有10.3M,太夸张了,我们来看看倒底都是什么占用了这么大的空间,仔细看一下其中包含:

我们一起来认识一下这个库是起什么作用的:

  • android-jsc-r174650:Android 里的 jsc 引擎
  • appcompat-v7-23.0.1:appcompat v7 支持库
  • bolts-android-1.1.4:Facebook 开发的 Android 的底层库集合,主要是处理 Task
  • drawee-0.8.1:fresco 控件中的一个负责显示的底层库,包含在 fresco 里
  • fbcore-0.8.1:Facebook 内核库
  • fresco-0.8.1:Facebook 开发的一款强大的 Android 图片处理库
  • imagepipeline-0.8.1:负责完成加载图片(网络、本地文件,本地资源),包含在fresco里
  • imagepipeline-okhttp-0.8.1:负责完成加载图片前的网络请求,包含在 fresco 里
  • jackson-core-2.2.3:负责处理 JSON 数据
  • jsr-305:供检查软件缺陷用的注解
  • library-2.4.0:nineoldandroids 开源动画库
  • okhttp-2.5.0:强大的网络请求库
  • okhttp-ws-2.5.0:okhttp 的 web sockets 功能库
  • okio-1.5.0:Square 公司开发的补充 java.io 和 java.nio 的不足,用于更加方便,快速的访问、存储和处理你的数据
  • react-native-0.20.1:react native 库,上面和下面这些库都是被带进来的 :)
  • recyclerview-v7-23.0.1:Android 5.0 v7 RecyclerView 扩展库
  • stetho-1.2.0:Facebook 开发的 Chrome Developer 工具,用来调试React Native程序
  • stetho-okhttp-1.2.0:stetho 的网络请求支持库
  • support-annotations-23.0.1:帮助 Android Studio 检测代码中可能存在的错误
  • support-v4-23.0.1:Android v4 支持库

如果原Android项目应用了这些插件,那恭喜你,可以复用了,反之就要算办法精减(我也还在研究)。

2.在MainActivity里添加跳转至ReactNativeActivity的代码(模拟业务场景)

3.添加ReactNativeActivity页面,向里面添加代码(官网那些代码太老了,这个版本是最曼妙的)

4.向AndroidManifest.xml里添加 .ReactNativeActivity 和 com.facebook.react.devsupport.DevSettingsActivity

5.拷贝如下文件夹及文件到Android项目根目录

  • node_modules(文件夹。从之前 init React Native 项目里拷一份过来。因为 npm install 成功率很低,就算是用taobao的源,也很慢)

  • .flowconfig (JavaScript 静态类型检查工具配置文件)

  • .watchmanconfig(Facebook 开发的用来监视文件并且记录文件的改动情况,当文件变更就触发一些操作, 如:Enable Live Reload的功能)

  • index.android.js(文件。操作方式同上,注意 class 名称与下面 register 时名称要一致)

  • package.json(文件。操作方式同上,注意文件内容里的 name 和 react-native 版本号)

6.修改如下文件

  • .gitignore(在该文件里添加排除项,node_modules/ 和 npm-debug.log)

  • app/build.gradle (将 'com.android.support:appcompat-v7:23..1' 改为 'com.android.support:appcompat-v7:23..1')

  • gradle.properties (在文件末尾添加,android.useDeprecatedNdk=true)

注意:小坑一个,如果遇到。请按第6项修改,并且要保证 react-native 版本是0.21.0以上

歪果朋友也深受其害,https://github.com/facebook/react-native/issues/6152#issuecomment-200759453

java.lang.IllegalAccessError: Method 'void android.support.v4.net.ConnectivityManagerCompat.()' is inaccessible to class 'com.facebook.react.modules.netinfo.NetInfoModule' (declaration of 'com.facebook.react.modules.netinfo.NetInfoModule' appears in /data/app/package.name-2/base.apk)

at com.facebook.react.modules.netinfo.NetInfoModule.(NetInfoModule.java:55)

at com.facebook.react.shell.MainReactPackage.createNativeModules(MainReactPackage.java:62)

at com.facebook.react.ReactInstanceManagerImpl.processPackage(ReactInstanceManagerImpl.java:751)

at com.facebook.react.ReactInstanceManagerImpl.createReactContext(ReactInstanceManagerImpl.java:688)

at com.facebook.react.ReactInstanceManagerImpl.access$600(ReactInstanceManagerImpl.java:84)

代码地址:https://github.com/Kennytian/embedded,欢迎star

将React Native集成至Android原生应用的更多相关文章

  1. Angular团队公布路线图,并演示怎样与React Native集成

    本文来源于我在InfoQ中文站翻译的文章,原文地址是:http://www.infoq.com/cn/news/2015/06/angular-2-react-native-roadmap 前不久在旧 ...

  2. React Native – 使用 JavaScript 开发原生应用

    前不久,Facebook 在F8开发者大会上正式开源了 React Native 项目.不过目前只有 iOS 版,Android 版还需要再等一段时间,这是最新的用 JavaScript 语言开发原生 ...

  3. React Native App设置&Android版发布

    React Native系列 <逻辑性最强的React Native环境搭建与调试> <ReactNative开发工具有这一篇足矣> <解决React Native un ...

  4. React Native hot reloading & Android & iOS

    React Native hot reloading & Android & iOS https://facebook.github.io/react-native/docs/debu ...

  5. 关于React Native项目在android上UI性能调试实践

    我们尽最大的努力来争取使UI组件的性能如丝般顺滑,但有的时候这根本不可能做到.要知道,Android有超过一万种不同型号的手机,而在框架底层进行软件渲染的时候是统一处理的,这意味着你没办法像iOS那样 ...

  6. 将React Native 集成进现有OC项目中(过程记录) 、jsCodeLocation 生成方式总结

    将RN集成到现有OC项目应该是最常见的,特别是已经有OC项目的,不太可能会去专门搞个纯RN的项目.又因为RN不同版本,引用的依赖可能不尽相同,所以特别说明下,本文参考的文档是React Native ...

  7. React Native集成Redux框架讲解与应用

    学过React Native的都知道,RN的UI是根据相应组件的state进行render的,而页面又是由大大小小的组件构成,导致每个组件都必须维护自身的一套状态,因此当页面复杂化的时候,管理stat ...

  8. React Native 4 for Android源码分析 一《JNI智能指针之介绍篇》

    文/ Tamic: http://blog.csdn.net/sk719887916/article/details/53455441 原文:http://blog.csdn.net/eewolf/a ...

  9. React Native工程修改Android包名

    默认初始化的React Native工程,生成Android工程的时候,包名默认是React Native工程的名字,跟一般Android工程com.company.xxx不一样. 这时候就需要手动修 ...

随机推荐

  1. Dev控件删除按钮的两种方式

    测试版本15.2.10:在Dev控件中删除按钮空间有两种方式:1.鼠标右键出现Delete选项,这种删除是不完全的删除,只是删除了按钮的显示,实际上按钮还是存在于代码中的.2.用键盘上的Delete键 ...

  2. hdu 4349 求C(n,0),C(n,1),C(n,2)...C(n,n).当中有多少个奇数 (Lucas定理推广)

    Lucas定理:把n写成p进制a[n]a[n-1]a[n-2]...a[0],把m写成p进制b[n]b[n-1]b[n-2]...b[0],则C(n,m)与C(a[n],b[n])*C(a[n-1], ...

  3. USACO 5.3 Milk Measuring

    Milk MeasuringHal Burch Farmer John must measure Q (1 <= Q <= 20,000) quarts of his finest mil ...

  4. Docker简介与安装(一)

    Docker简介 Docker 是 Docker.Inc 公司开源的一个基于 LXC技术之上构建的Container容器引擎, 源代码托管在 GitHub 上, 基于Go语言并遵从Apache2.0协 ...

  5. 001 Java 深拷贝、浅拷贝及Cloneable接口

    原本写过,后来在阅读的时候,感觉自己都不是太明白了,删除后参考人家的又重新写了一份. 一:开篇 1.复制一个变量 举例是int类型. 其他其中七种原始数据类型同样适用. 原始类型:boolean,ch ...

  6. mysql 错误解决:Plugin 'FEDERATED' is disabled. /usr/sbin/mysqld: Table 'mysql.plugin' doesn't exist

    今天安装完Mysql后,开启发生了错误: 1.打开相应文件夹,查看错误信息: 2.打开错误信息文件,查看错误原因是:Plugin 'FEDERATED' is disabled. /usr/sbin/ ...

  7. 关于php上传文件过大的表单回填

    也许标题有点绕口,有点无法让人理解.请原谅博主,语文学的不好,都赖体育老师. 问题场景重现:在某次迭代中,接到这样一个需求:当新建或编辑一个Bug(包含附件以及其他字段)上传附件过大时,退回到编辑页面 ...

  8. 验证码60s倒计时前端效果

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. codevs 1365 浴火银河星际跳跃

    1365 浴火银河星际跳跃 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 小 K 又在玩浴火银河了...不过这次他的目的不是跑运输 ...

  10. mysql_connect的$new_link参数

    假设在127.0.0.1上有test1和test2两个库, 其中库test1库中有test1表,test2中有test2表 $servername = "127.0.0.1"; $ ...