React Native植入原生Android应用的流程解析
引言React Native是现在移动开发新的可选方案,也带来了原属于Web领域的React的优秀开发特性。另一方面,React Native的技术栈一经掌握,可以用于iOS、Android及Windows(见此)多个平台,即所说的“learn once,write anywhere”。 开始使用React Native的问题如何使用React Native?参照官方指南,你会发现官方告诉你的是:请用
但是,以Android为例,一个普通原生项目的根目录结构却是这样(Android Studio 2.1.2):
可以看到,Android原生项目(上图的 这就是React Native植入原生应用的问题。显然, 在本文的时间点,React Native的最新版是0.27。官方对此已给出植入原生Android应用的指南,但它不够准确,也缺少一些细节。因此,本文将提供一个React Native植入原生Android应用的更详细一点的流程。 如果你想了解iOS版的,可以阅读这篇文章。 植入Android流程基本环境这篇流程是windows及Android Studio,如果你已经是一个Android Studio原生应用开发者,以及Node.js用户,那么所需的环境你基本已经有了。详情请参考windows环境搭建文字教程以及开始使用React Native,什么都没有也没关系,正好从头搭建。 此外,Android模拟器使用了Genymotion,注册后就可以供个人使用,会比官方模拟器性能要好一些。 新建Android项目让我们从一个全新的Android原生应用开始。 用Android Studio创建一个新项目,注意Minimum SDK应设置为API 16及以上(React Native要求Android4.1以上的环境):
添加npm组件到Android原生项目的根目录(也可以新建一个目录,但根目录比较常用)新建一个文件 { "name": "react-native-module","version": "0.0.1","private": true,"scripts": { "start": "node node_modules/react-native/local-cli/cli.js start" },"dependencies": { "react": "^15.1.0","react-native": "^0.27.2" } } 下面的 然后,在这个 npm install 安装好所需的npm组件。 添加index.android.js文件同样在根目录,增加一个文件 import React,{ Component } from 'react'; import { AppRegistry,StyleSheet,Text,View } from 'react-native'; class App extends Component { render() { return ( <View style={styles.container}> <Text style={styles.note}> acgtofe.com with react native </Text> </View> ); } } const styles = StyleSheet.create({ container: { flex: 1,justifyContent: 'center',alignItems: 'center',},note: { fontSize: 20 } }); AppRegistry.registerComponent('react-native-module',() => App); 注意上面代码最后的 在Android应用内添加依赖回到Android Studio,到 dependencies { compile fileTree(dir: 'libs',include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.4.0' compile "com.facebook.react:react-native:0.27.2" } 最后一行的 运行一次Gradle Sync,你必然会得到这个错误:
这是因为Android项目默认的依赖包的源 allprojects { repositories { jcenter() maven { // All of React Native (JS,Android binaries) is installed from npm url "$projectDir/../node_modules/react-native/android" } } } 这里的 你可能在很多别的地方看到的都是这样的写法: compile "com.facebook.react:react-native:+" 不太建议这样做,因为没有明确的版本号,你无法让系统帮你判断前面的 新建React Native的Activity新建一个继承自 public class LiveActivity extends ReactActivity { @Override protected String getMainComponentName() { return "react-native-module"; } @Override protected boolean getUseDeveloperSupport() { return BuildConfig.DEBUG; } @Override protected List<ReactPackage> getPackages() { return Arrays.<ReactPackage>asList( new MainReactPackage() ); } }
清单文件添加声明到Android清单文件 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.acgtofe.drill"> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> <application ... > ... <activity android:name=".LiveActivity" /> <activity android:name="com.facebook.react.devsupport.DevSettingsActivity" /> </application> </manifest> 前面的权限都是React Native开发环境需要用到的。后面的
它也是开发版所必需的。 启动packager server到 react-native start 也可以用
运行起来这是最后一步了。build这个Android项目,安装到模拟器里,然后打开应用,切换到 按
就说明完成了!对应的,packager server里应该可以看到每一次请求的记录:
接下来,你就可以开始React Native的开发了,改动保存后,重新 建议及改进建议使用Android 5.0+的设备(包括模拟器),它们支持直接USB传输packager server返回的那个bundle js文件。如果是Android 5.0+,可以USB连接电脑后(如果是模拟器,那就等于已经连接)运行以下命令: adb reverse tcp:8081 tcp:8081 然后就可以省略掉前面流程里设置本机ip地址那一步,直接 相对于前面设置本机ip地址的方式,这帮你免去了同一WiFi环境、代理等麻烦。 不顺利的情况虽然流程看起来轻松愉快,但并不怎么能一次成功。下面是我在流程中碰到过的一些问题及其记录,可以用作参考。 版本不匹配错误提示如下:
参照github上的issue,这个错误的引发原因是packager server的React Native版本和Android应用内的不一致。比如应用内的gradle依赖写的是 因此,建议用 404
这是说 这可能是由不正确的缓存引起,我的解决方法:关闭server,删除 无法连接到server
先按照 windows下删除 500
这个问题需要具体看server的输出,我这里的错误信息是: 有用的调试方法流程中可能碰到的问题可以分为两类,Android应用(client)和server。如果看到错误,打开浏览器访问 没有Flow和Nuclide你可能在开始用React Native的过程中听说了Flow和Nuclide,它们分别是JavaScript类型检查工具及React Native的推荐IDE。 但请注意,在本文的时间点,它们还没有windows版。我是用Atom来开发React Native的。 发布正式版React Native的开发版是需要有一个packager server来随时发送更新后的bundle js文件的。但如果要得到真正签名的正式版( 参照官方的发行APK包指南,你只需要这样几步:
react-native bundle --platform android --dev false --entry-file index.android.js --bundle-output app/src/main/assets/index.android.bundle --assets-dest app/src/main/res/
官方有提到使用 正式版的即时更新看起来正式版把bundle js文件保存到了apk内,这好像就丢失了React Native的即时更新?对的,但仍然有办法实现它,你可以看看React-Native-Remote-Update,这个项目已经过时了,但里面贴出的原理很值得参考。 现在,你可以用react-native-auto-updater来帮助你实现React Native的即时更新。 参考资料集我在写本文的过程中参考了下面三个资料集合,觉得非常棒,在此也贴出来:
结语React Native的Android版本是去年9月(2015.9.15)才推出,此前只有iOS版。相对来说,Android的相关教程要比iOS少很多。因此,我觉得有这样一份windows + React Native for Android的组合流程会很有帮助。 来尝试新的移动开发方案吧! (重新编辑自我的博客,原文地址:http://acgtofe.com/posts/2016/06/react-native-embedding-android) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |