| 版权声明:本文为博主原创文章,未经博主允许不得转载。
一、简介
通过前面几篇文章我们已经实现了全量热更新,这仅仅是实现了热更新的第一步,全量更新的bundle包会稍显大一些,差量更新就是给bundle包做瘦身。
大致思路如下:
发布APP版本前,保留发布版APP的bundle包;等再次更新的时候,手动打bundle包,将生成的bundle包和保存的原始版本做差量动作,生成差量包;将生成的bundle差量包上传至服务器,修改bundle版本号;用户端APP下载差量包,将差量包与APP本地正使用的bundle包进行合并,生成新的bundle;RN重新加载指定路径的bundle包。
这里讨论的差量指的是代码文件的差量,即index.android.bundle文件的差量计算。图片目前还是全量更新,如果做差量,需要修改RN源码,如果APP RN的版本需要升级,升级完成之后仍然需要再次修改RN源码,后续文章我们会讲到。
二、代码实现
1. 生成差量包
- 需将新旧bundle包转换成String类型的数据
/**
* 将文件转换成字符串
* FileReader
* BufferedReader
*
* @param path 文件路径
* @return
*/
public String readFileToString(String path) {
String results = "";
try {
FileReader reader = new FileReader(path);
BufferedReader bufferedReader = new BufferedReader(reader);
int result = bufferedReader.read();
StringBuilder sb = new StringBuilder();
while(result != -1) {
sb.append((char) result);
result = bufferedReader.read();
}
bufferedReader.close();
reader.close();
results = sb.toString();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return results;
}
- 使用Google diff_match_patch算法库,从官网下载最新的代码文件,从中选择java版本
/**
* 生成差异补丁包
*
* @param oldSource
* @param newSource
* @return
*/
public String createPatch (String oldSource, String newSource) {
diff_match_patch dmp = new diff_match_patch();