研发背景
安卓集成react-native加载多个插件bundle包,由于公司项目业务需求,将项目进行架构分为主app和业务插件。而与网上的搜到的情况不同,app的所有代码都是rn开发,要求插件包能够在app不升级上架的情况下,能够正常的加载不同的插件业务包。这样一来,网上的拆分包打包加载无法实现项目效果。最后选择使用在原生通过加载不同的bundle资源包,在rn中调用原生方法跳转页面然后加载不同bundle资源包和ReactNativeHost来进行插件化开发。
开发过程
1、打包
通过命令行分别将主app代码和插件业务代码进行打包。相当于打两个不同的app资源包
主app代码进行打包与正常rn项目安卓打包方式一致即可,因项目为rn项目,所以主app的业务代码不需要单独进行打包处理,命令行如下:
./gradlew assembleRelease
插件业务代码进行打包,打包命令如下:
node ./node_modules/react-native/local-cli/cli.js bundle --entry-file ./入口文件 --platform android --dev false --bundle-output ./bundles/业务代码.bundle --assets-dest ./bundles
其中--entry-file参数后输入的是业务包的注册入口文件,与主app中的index.js文件相同,为注册业务代码入口;--bundle-output参数后输入的是打包后输出的bundle包位置; --assets-dest参数后输入的是代码中相应的图片等资源的输出目录。
注意:插件业务代码打包生成的bundle包和资源目录要放在同级目录下使用。
2、插件包的加载
安卓原生加载rn的bundle包有两种方式。在CatalystInstanceImpl类中的loadScriptFromAssets方法和loadScriptFromFile方法
安卓加载rn资源的两种方法
一种是直接加载asset中资源文件,一般asset中的资源文件会在项目打包过程中与apk一起发布。
一种是加载file中的文件,在本项目中,插件的业务包使用加载file的方式。
3、安卓原生代码实现
先创建一个application类,然后实现主app的ReactNativeHost,再创建一个接口,用来提供加载插件的ReactNativeHost方法供外部其他页面调用,具体实现代码如下:
MyReactApplication接口给外部提供一个获取ReactNativeHost方法
代码语言:javascript复制 import com.facebook.react.ReactNativeHost;
public interface MyReactApplication {
ReactNativeHost getReactNativeMyHost();
}
application实现类
自定义application类-1