1.增量升级概述

在游戏开发中,为满足用户需求,产品运营需求,改动的特别多,升级是件极其频繁的事情(没办法,一切以用户为中心),如果一个游戏APP又同时是个集合类型的(内置多个游戏),做完这个游戏只有一个感觉:再也不会爱了。。。

我们的游戏是用Lua写的,所以Android客户端分为:

  1. APK 升级(细分为 1.完整升级;2.增量升级;3.第三方升级);

  2. Lua升级(细分为 1.大厅升级;2各个游戏升级),同时Lua的游戏采用的是热更新机制;

同时涉及 各个游戏->大厅->Apk的依赖关系,难度较大,代码逻辑实现相对复杂,前端,后端维护成本较大(不过既然集合都做过了,做单个类型游戏的升级功能那就不在话下)。。。

本篇主要讲 APK 升级中的 增量更新如何实现。

1.1 APK 增量升级过程

增量升级的原理很简单,即首先将应用的旧版本Apk与新版本Apk做差分,得到更新的部分的补丁,例如旧版本的APK有20M,新版的有21M,更新的部分则可能只有1M左右,这里需要说明的是,得到的差分包大小并不是简单的相减,因为需要包含一些上下文相关的东西,使用差分升级的好处显而易见,那么你不需要下载完整的21M文件,只需要下载更新部分就可以,而更新部分的差分包很小,可以很大程度上减少流量的损失。

  1. 在服务器上生成一个patch。
  2. 下载patch到手机中。
  3. 通过补丁获取一个已安装应用的新的安装apk。
  4. 安装应用的新版本并删掉旧的版本和patch。

1.2 如何生成差分包

通常使用bspatch来制作差分包。

bsdiff oldfile newfile patchfile

差分包通常在服务器端生成,然后下发到客户端。源代码是C语言实现的。

bsdiff源码下载地址:

https://github.com/mendsley/bsdiff
http://www.daemonology.net/bsdiff/bsdiff-4.3.tar.gz

可以通过jni在java代码中调用bspatchC代码,生成差分包

1.3 如何合成新的升级包

bspatch的命令格式为:

bspatch oldfile newfile patchfile

android在data/app目录下会有原APK的备份,用原apk的备份和服务器的patch包可以合成新的apk。但是要注意版本控制,patch包一定是最终要合成的apk与原apk的差分包。原来的版本不同,升级后的版本不同,使用的差分包肯定也不是一个。

2. 代码实现

github上有个很好的开源项目,SmartAppUpdate已经对bsdiffbspatch做了很好的封装,可以直接使用。

GitHub地址:

https://github.com/cundong/SmartAppUpdates

android-xBuild 是一项集成了apk差分与合成,zip差分与合成,lua打包,apk打包,png/jpg图片压缩五大功能的开源项目

GitHub地址:

https://github.com/zz7zz7zz/android-xBuild

2.1 bsdiff的改进

google chrome项目中对bsdiff进行了改进

代码实现地址:

https://chromium.googlesource.com/chromium/src/courgette/+/master

数据对比

Here are the sizes in bytes for the recent 190.1->190.4 update on the developer channel:
Full update                     10,385,920
bsdiff update                   704,512
Courgette update                78,848

3. 增量升级的不足

增量升级并非完美无缺的升级方式,至少存在以下两点不足:

  1. 增量升级是以两个应用版本之间的差异来生成补丁的,你无法保证用户每次的及时升级到最新,所以你必须对你所发布的每一个版本都和最新的版本作差分,以便使所有版本的用户都可以差分升级,这样操作相对于原来的整包升级较为繁琐,不过可以通过自动化的脚本批量生成。
  2. 增量升级成功的前提是,用户手机端必须有能够让你拷贝出来且与你服务器用于差分的版本一致的apk,这样就存在,例如,系统内置的apk无法获取到,无法进行增量升级;对于某些与你差分版本一致,但是内容有过修改的(比如破解版apk),这样也是无法进行增量升级的,为了防止合成补丁错误,最好在补丁合成前对旧版本的apk进行sha1sum校验,保证基础包的一致性。

Android 增量升级原理及实现方式分享相关推荐

  1. Android差分升级原理和实现方式

    增量升级概述 增量升级的原理很简单,即首先将应用的旧版本Apk与新版本Apk做差分,得到更新的部分的补丁,例如旧版本的APK有20M,新版的有21M,更新的部分则可能只有1M左右,这里需要说明的是,得 ...

  2. Android增量升级

           Android的增量升级原理就是做apk版本之间的差分数据包,得到这个补丁包以后,在客户端合并旧的apk和补丁包,得到一个新的apk,最终通过新的apk实现升级. Android的增量升 ...

  3. Android Recovery升级原理

    文章目录 Android Recovery升级原理 声明 摘要 1. Recovery相关概念 2. Android系统的启动模式 2.1 Android 各个分区介绍 2.2 Android的启动模 ...

  4. Android OTA升级原理和流程分析(五)---update.zip包从上层进入Recovery服务

    转载自:http://blog.chinaunix.net/uid-22028566-id-3533854.html 文章开头我们就提到update.zip包来源有两种: 一个是OTA在线下载(一般下 ...

  5. Android应用市场省流量更新(增量升级)原理解析

    一.前言 最近在看热修复相关的框架,之前我们已经看过了阿里的Dexposed和AndFix这两个框架了,不了解的同学可以点击这里进行查看:Dexposed框架原理解析 和 AndFix热修复框架原理解 ...

  6. android包名更换后升级方案,Android增量升级方案

    背景 随着业务的发展,安装包的体积也在不断的增大,这时候,如果要版本更新,用户不得不去下载完整的安装包.但是如果使用增量升级方案,用户只需要下载新旧版本的差异包,然后在本地合成就行,这样省时省力.我们 ...

  7. Android OTA升级原理 - 实现流程(整理一)

    Android OTA实现流程分析 OTA升级概述 制作升级包 自动生成update.zip升级包 手动生成update升级包 增量包目录结构 升级包写入设备分区 Android的三种工作模式 Rec ...

  8. android ota升级涉及的分区,Android OTA升级原理 - 实现流程(整理一)

    Android OTA实现流程分析 OTA升级概述 制作升级包 自动生成update.zip升级包 手动生成update升级包 增量包目录结构 升级包写入设备分区 Android的三种工作模式 Rec ...

  9. android差分升级原理,BigNews Android 增量更新框架差分包升级 @codeKK c开源站

    支持增量包/差分包/升级包 原理:在服务器端使用 bsdiff 工具将新老安装包的差异打包为一个体积较小的差分包/升级包,然后在 App 端通过 bspatch 工具(和 bsdiff 配套的)用差分 ...

最新文章

  1. 使用Docker实现丝般顺滑的持续集成
  2. java高效遍历匹配,使用cypher或遍历api仅匹配路径极端的单个节点
  3. hadoop(4)——用python代码结合hadoop完成一个小项目
  4. CABasicAnimation fillMode和removedOnCompletion
  5. 电工结业试卷_电工技术基础结业考试试卷
  6. 【clickhouse】数据仓库中的拉链表(Clickhouse 实现)
  7. excel设置默认值_职场办公必备的7个Excel应用技巧解读,易学易懂,收藏备用!...
  8. 《趣学JavaScript——教孩子学编程》——1.5 本章小结
  9. STM32的JTAG下载模式
  10. linux查看字体并安装字体
  11. Python中scipy.signal.stft函数详解
  12. cmd下批量pingIP地址
  13. 递归,举几个简单的例子
  14. 全面理解Web3.0时代
  15. 【游戏客户端】剧情系统
  16. 螃蟹WiFi驱动中的Band Steering功能
  17. android中注册的账号密码储存在,android SharedPreferences实现用户的注册和保存账号密码...
  18. Android SystemUI 架构详解
  19. termux目录_Termux 入门与实践
  20. 洛谷P1786 帮贡排序(冒泡排序法)

热门文章

  1. 库卡工业机器人负载曲线图_KUKA/库卡工业机器人 KR6 R700 负载6KG 机械臂 臂展7.067M...
  2. 全国地级市面板Excel数据(1990-2019年)
  3. 项目延期,要制定有效的进度管理计划
  4. 常见咳嗽种类、治疗方法和忌食大全
  5. 《Java》Java教程
  6. 旅行世界登陆显示服务器繁忙,原神登陆系统繁忙 原神无法登录怎么办
  7. 帆船指南-原则-安全第一
  8. GPU与深度学习和药物开发
  9. pcs7加热炉画面流程组态_毕业设计(论文)-基于PCS7的管式加热炉控制系统设计.doc...
  10. 超详细,win7虚拟机安装