经过了上一讲Android-RN混合开发系列(一、Android项目内RN的环境)的介绍,相信对于RN混合开发项目有了一定的了解了,这一讲标题RN项目中分离出Android项目,换个思路,我们其实就是初始化一个Android项目,并在里面配置RN即可。
首先要思考清楚一个问题,假设公司已经有很多个完整的大型App了,那很显然,我们不可能初始化一个RN项目,以RN项目为主体来进行开发,这样的话Android和Ios项目需要修改的地方就太多了,比如git仓库就得大改,其次每一个项目都要配置RN环境等等。本着简约原则,这里我提供一个思路(我现在公司的开发方式):
1.初始化一个新的Android项目,配置RN环境。
2.当有一个App(假设是一个叫WU的App)需要使用到RN模块的时候,在上述新初始化的项目中新建一个library。
3.在library中写完交互逻辑之后,打包成aar文件并上传到公司或者私有的maven库上。
4.在WU项目内像引入三方库一样引入即可。
根据一贯的尿性,这里我只会讲第1点。2,3,4我会在后续文章中讲解。
1.Android项目中配置RN本地环境
首先用AndroidStudio打开刚刚RN项目里面的android项目,直接运行,发现竟然运行成功了,这是什么情况???
仔细思考一下,Android项目跟RN项目之间的关联,好像就只有Android项目的build.gradle这一个文件夹中的一个配置有关,其中引用了react-native的三方库,so,我们初始化一个Android项目,加入RN项目里面Android项目的两个build.gradle的那两个配置,这里再放一下代码别搞错了:
app模块的build.gradle
api ('com.facebook.react:react-native:0.55.2') {
exclude group: 'com.android.support'
}
项目的build.gradle
maven {
// All of React Native (JS, Android binaries) is installed from npm
url "$rootDir/../node_modules/react-native/android"
}
这里注意一下,在项目的build.gradle中添加本地maven库的配置的时候,@rootDir代表的是Android的根目录,然后去原来的RN项目里面,将node_nodules/react-native/android目录下面的那个react-native的库拷贝过来就好了,然后路径自己改一下,能引用到即可。
2.Android项目中配置RN的远程环境
为什么要说配置远程环境呢???
因为神奇的facebook,对于rn的远程maven环境,只维护到0.20.1版本,后面竟然不再维护了。好吧,开发没一点难度怎么行呢?
对于遇到的各种bug我就不这说了,坑都是前人踩的,后来的人直接跳过去就好了。
心里立马有了思路,我们进入reactnative的本地环境库,看到有一个aar,一个jar,一个pom,那么很自然地就想到了将aar传到maven上面(后面会有专门一节讲解如何打包aar已经如何上传到maven的方式),再引入不就好了,这里我只能说呵呵了。我遇到的问题:
1.报Soloader找不到,这个库怎么会没有呢?
看了一个react-native库下面的pom文件,里面是有引入soloader的啊,如下图
既然这样不行,那我单独给它引入行不?
加入以下一句:
implementation 'com.facebook.soloader:soloader:0.1.0'
编译没问题了,运行之后跳转到RN模块时候,又报libjsc.so库找不到,肯定哪里出现了问题,这样一直处理何时是个头啊。。。经过了我无数次的尝试,发现本地RN环境库内的pom文件列出的那些三方库,在我将他们上传到远程库之后,根本没有下载成功,意味着这种方式,缺少很多三方库,那自然会报很多错了。
最终在无数次的反编译react-native.0.55.2.aar和react-native.0.55.2.sources.jar之后惊讶的发现,aar里面有一个classes.jar文件,竟然跟react-native.0.55.2.sources.jar解压之后长得几乎一模一样,aar直面只缺少了一个soloader库,嗯,到这里就感觉自己恍然大悟了。这说明我们可以抛弃jar,直接使用aar就好了,只不过要加上implementation 'com.facebook.soloader:soloader:'这么一句话,至于这个库的版本自己在pom文件内查看。
当然我尝试了将aar和pom文件传到maven库上无数次之后发现,是有问题的,pom文件内的三方库基本都是下载失败的,翻墙也不行。就算编译成功了,最后运行也是各种报错。
最终,我只将aar传到了maven上面(这个放在本地也可以,只是我不想看到任何一个aar出现在我的项目目录里面),然后打开pom文件,将里面所有的三方库手动引入,再之后,将当前Android库打包成aar上传到maven上面。一个RN的远程库就这样给完成了。搞了好几天,每天各种尝试,终于给解决了。
下面是我远程环境库的配置(有详细介绍):
最终我的项目结构是这样的:
1.app模块作为一个测试库
2.rncommon作为RN环境库
3.多个交互库(每一个交互库对应一个App)
每一个库都是修改完直接上传到maven上面,互相之间互不影响无关联。
当App想要用到某个交互库的时候,直接引入即可,不需要在APP内配置任何RN环境。
到此为止已经配置完成了。下一节讲一下交互的代码(官方文档上面有讲解,看官方文档也可以)。
有疑问的可以在评论里面问我,虽然不敢说自己技术有多牛,但是毕竟配这个环境解决了很多坑,还是有一些心得可以借鉴的。