ReactNative热更新思路
一、简介
热更新技术是ReactNative框架的一大特色。简单的说,热更新技术就是在无需用户重新下载APP SDK的情况下,更新已安装的APP除Native之外的功能,并且绝大部分情况是在用户不知道的状态下更新成功。最常见的使用场景就是一些电商类的APP在活动日替换符合活动日主题的页面,新增功能(不涉及Native功能)等等。也常用于解决APP现存的一些bug,不必频繁的发布新版本。热更新技术也是ReactNative框架备受关注的原因之一。
热更新的技术限制:只能更新js代码,图片等静态资源。原生代码,原生配置都不能(其实能通过jspatch之类的技术能实现,但苹果现在会扫描代码,碰到jspatch会打回)
热更新的政策限制:明面上,苹果,谷歌都不允许热更新,所以提交AppStore和play store审核的时候都不能使用热更新,甚至不能出现检查版本之类的字眼。审核通过后可以开启热更新。但是另一方面,所有的大厂都在明目张胆地进行热更新(微信的小程序不是热更是什么?),所以……总的来说都是睁一只眼闭一只眼,只要不太过分玩换皮,热更新是官方不欢迎但也不拒绝的存在。
二、热更新的大致流程
1c86e3a72dfa5b8ef502f0014d12f385_68795-c035e2064202c45f.png首先抛出热更新的实现思路:用户每次打开APP客户端,在APP启动的过程中请求服务器获取最新bundle版本号,同时从本地获取当前已安装APP的bundle版本号,将两者进行对比,如若一致,则无需更新继续执行其他逻辑;如果不一致,从服务器获取当前最新版本的bundle包下载到本地。解压缩最新版本的bundle包(服务器端存放的bundle包一般均为压缩文件)。如果采用全量更新方法,解压缩之后的bundle文件可直接使用;如果使用的是差量更新方法,解压缩之后还需要与当前本地使用的bundle包进行合并,合并成功之后方可使用。这里还有一个隐藏的技术点:修改ReactNative默认读取加载bundle包的路径,将之改成你自定义的bundle包路径。也就是你解压新bundle包的路径(全量更新方法)或你合并bundle包的路径(差量更新方法)。最后是查看APP的更新效果,如果是冷加载,必须是在APP被彻底杀死,重新启动之后才能看到;如果是热加载,调用ReactNative重新加载bundle方法。
三、思路节点分析(冷加载,Android)
1.创建服务器
2.Android平台封装ReactNative的Native Module技术。包含:
当前bundle版本提取;
获取服务器端bundle版本号;
文件或者目录的创建;
bundle文件下载;
bundle文件解压缩;
bundle文件与差量包的合并;
文件的删除等等。
四、技术节点分析
-
JAVA IO流操作;
-
Android的BuildConfig操作;(参考URL:http://blog.csdn.net/aotian16/article/details/51776051)
-
文件操作:解压缩,取差量,合并;
-
RN手动打包;
-
RN打包的文件中包含:RN源码,第三方库,业务逻辑代码;
-
RN的运行机制;
-
修改ReactNative读取bundle文件的路径;