当前位置: 首页 > news >正文

大型网站的技术架构问题湘潭专业网站建设湘潭振企专业

大型网站的技术架构问题,湘潭专业网站建设湘潭振企专业,超越时空网上书城网站建设方案,个人网站备案不通过背景随着业务的发展#xff0c;安装包的体积也在不断的增大#xff0c;这时候#xff0c;如果要版本更新#xff0c;用户不得不去下载完整的安装包。但是如果使用增量升级方案#xff0c;用户只需要下载新旧版本的差异包#xff0c;然后在本地合成就行#xff0c;这样省…背景随着业务的发展安装包的体积也在不断的增大这时候如果要版本更新用户不得不去下载完整的安装包。但是如果使用增量升级方案用户只需要下载新旧版本的差异包然后在本地合成就行这样省时省力。我们可以看下某产品使用增量升级时的数据xxx.2.4.0000.apk 32MBxxx.2.5.0000.apk 28MB差异包 6.3MB其中增量包就是上文提到的差异包可见用户每次升级只需下载差异包就行省时省力。原理其原理就是我们在服务器端先拿新版本安装包和旧版本安装包进行对比在生成差异包之后下发之后客户端根据对应的差异包和本地旧版本安装包合成便生成了新版本安装包实现0x01 下载编译差分合并工具:apk文件的差分和合并都是使用的开源的二进制比较工具 bsdiff实现值得注意的是该工具依赖bizp2这个库。在下载完毕后直接make便可以编译工具不过我在一台苹果机器上编译的时候出现了一点问题那时候make文件没法正确的读取所以我修改了make文件读者编译的时候(仅限mac, linux)只需要运行install.sh脚本就行。这部分的代码我已经单独抽出来作为一个repo读者喜欢可以自行star然后下载编译 repo0x02 生成差异包如果你刚刚编译成了bsdiff在命令行里面输入bsdiff或者bspatch就会出现如下的信息其中bsdiff用于比较新旧文件的差异部分并生成差异包bspatch根据之前差异包和旧文件生成新文件我们可以从这两个可执行文件的报错信息看出该命令如何使用。我们这里有两个文件new.so 和 old.so之后我们运行 diff old.so new.so patch.so便生成了差异包patch.so0x03 合成新版本通过刚刚的介绍我们已经在Android端实现了相关的库只需要简单的调用YPatch.patch(oldFilePath, newFilePath, patchFilePatch)便可以将新版本存放到newFilePath指定的目录下结合Small框架上面好像都是在讲原理没有具体的实践讲解的话估计读者还是不懂我们现在就结合Small框架来看看如何做到增量更新。对于我们的Small框架我们要知道它把每个插件都编译成.so文件然后存放到app的native目录下不过如果它发现自己的download目录有新的插件那么就会去加载download目录下的插件并且这种加载优先权是最大的也就是说它会优先加载download目录下的插件。所以如果我们要做增量更新旧文件就从app的native目录进行读取然后从服务器端下载增量包最后合成的文件存放到download目录下这样每次插件启动都会到download目录下加载新的插件。实现://其中pluginUri对应的是bundle.json中插件对应的uri//下文有介绍String packageName  parsePackageName(context, pluginUri);        if (TextUtils.isEmpty(packageName)) {Log.e(TAG, cant parse plugins package name, check if assets/bundle.json is deleted);            return;}        // small框架的约定就是插件名字是以lib包名.so明明的// 比如如果我们插件的包名是com.chan.app.setting// 那么对于插件名就是libcom_chan_app_setting.sofinal String soName  lib  packageName.replaceAll(\\., _)  .so;        //找到旧版本的插件安装包final File oldPlugin  new File(context.getApplicationInfo().nativeLibraryDir, soName);        //新版本都存放到small指定的download目录下final File newPlugin  new File(FileUtils.getDownloadBundlePath(), soName);        //开始下载patchOkHttpClient okHttpClient  new OkHttpClient();Request request  new Request.Builder().url(uri).build();Call call  okHttpClient.newCall(request);call.enqueue(new Callback() {            Overridepublic void onFailure(Request request, IOException e) {}            Overridepublic void onResponse(Response response) throws IOException {                //保存从服务器端下载的增量包File patch  new File(FileUtils.getDownloadBundlePath(), patch.so);FileOutputStream fileOutputStream  new FileOutputStream(patch);                byte[] content  response.body().bytes();fileOutputStream.write(content);fileOutputStream.flush();fileOutputStream.close();                //合成的新插件安装包存放文职有new Plugin指定YPatch.patch(oldPlugin.getAbsolutePath(), newPlugin.getAbsolutePath(), patch.getAbsolutePath());}});可以看到这个函数中出现的pluginUri它其实对应的是bundle.json中插件的uri{version: 1.0.0,bundles: [{uri: main,pkg: com.chan.app.main,rules: {item: .ItemActivity}    },{uri: setting,pkg: com.chan.app.setting,rules: {index: .MainActivity}    }]}也就是这里的main, setting而这个bundle.json就是宿主中asset下的small配置文件示例代码OkSmall.merge(LaunchActivity.this, setting, http://192.168.1.100:8080/patch.so);Toast.makeText(LaunchActivity.this, 重启应用后更新生效, Toast.LENGTH_SHORT).show();至此所有的内容已经介绍完毕要踩的坑更新插件的时候要记得把插件的versionCode加大比如 我们这里的setting插件要记得加大11行的数值不然加载还是不成功的引用
http://www.zqtcl.cn/news/301423/

相关文章:

  • 萍乡网站建设行吗南康建设局官方网站
  • 一键部署wordpress爱站seo工具
  • 大连网站建设服务做进料加工在哪个网站上做
  • 南昌行业网站建设网站版权信息修改
  • 百度网站关键词排名助手低成本做网站 白之家
  • 怎么查询网站是谁做的部队网站建设报告
  • 租房网站开发专业网站建设品牌策划方案
  • 电子商务网站建设方案书软件开发工具图片
  • 案例建网站宿松网站建设公司
  • 秦皇岛网站开发wordpress免费国内主题
  • seo网站推广推荐阳江房管局查询房产信息网
  • php服装商城网站建设个人网站免费空间
  • 做内贸注册什么网站广州市建设交易中心网站
  • 点样用外网访问自己做的网站北京市网站设计公司网址
  • 用备案的网站做违法网站wordpress个性404
  • 中国制造网官方网站下载安装我国做民宿的网站
  • 英文网站seo广州市软件开发有限公司
  • 锦州网站建设渠道山西做网站的公司有哪些
  • 4线城市搞网站开发丹灶网站建设公司
  • 青岛网站建设seo优化wordpress分类标题自定义
  • 网站开发本地环境在海南注册公司需要多少钱
  • 济南网站开发去哪儿旅行app下载安装
  • 大城 网站北京做网站男生工资
  • 赣州网站建设百家号免费软件网
  • 在合肥做网站多少钱网站开发外包平台
  • 百度指数查询平台网站建设SEO优化哪家好
  • 网站怎么在成都备案中企动力如何
  • 免费数据统计网站app推广拉新一手渠道
  • 网站推广效果不好原因zac seo博客
  • 高端网站设计合肥网站建设个人网站建设公