Android 增量更新 (二)更新流程

接上一节的内容,通过使用 Bsdiff 可以成功实现拆分和合并了。这个时候就要想一下如何完成整个更新的过程。

必须想清楚的问题

这个时候要注意不再是增量拆分,而是如何平滑得实现应用的更新。

  • 优先级问题
    当检查更新时,存在最新版本的补丁时,优先使用增量更新;如若没有,采用完整更新。
  • 拆分次数问题
    随着版本不断迭代,由于 Bsdiff 的拆分效能低,不能也没必要做到每个新版本提供以前所有版本的补丁。
    试想一下,一个版本越久远越是可能与新版本存在较大差异,补丁包大小逐渐接近完整包大小,再者,App随着apk的Size也随之增加,拆分所需的时间、空间也随之增大,发布新版本的处理时间越来越长,增量更新的优势不复存在了,这是不能接受的。
    在更新版本的时候给予设置向前比较次数,我以3个月为期,对于每月更新的APP可以设为3次。
  • 唯一性问题
    通常情况下,APP 的版本标识是 包名或者是 application id ,版本号,版本号,我则增加一个类型属性,可以理解为渠道名,这是为了解决一些现实的问题,同一APP给不同客户群体使用,例如测试人员和正式用户,测试人员可以收到内部快速迭代的更新包,而不会影响到正式用户,这样可以给特定用户群开放不同的版本功能,并且能够实现阶段性切换产品线。
  • 完整性检验
    通过SHA1校验码确认合并前后文件都是一致的,保障合并的成功率
  • 级联删除
    可以单独删除补丁包数据,相应版本只支持完整更新了;删除完整包数据,就要附带删除所有相关的补丁包数据,避免导致更新系统混乱。

界面设计

目前在用的系统也是由这个雏形发展而来,而我现在并不在负责这个部分的编码,这里公布部分界面以及逻辑原理。


    1. 产品管理
      这里的产品管理是以移动产品为标准划分。
      产品ID:自动UUID,在各个系统??橹型ㄓ?,这里仅用于更新???,也可用于广告投放模块。
      产品名称: 必填
      产品说明:一个公司里面可能存在很多类似的产品,用于区分细节。
      包名:如果上传的是APK包,则和应用市场类似,可以不填,自动获取第一次上传的application id ,以后通过新增版本页面上传是会对比这个参数,不符合就会上传失败,避免脑抽了,出现严重的问题。
      云端下载:自身系统的带宽有限,通过把包放到阿里云或者七牛等地方,减低带宽压力。
  • 2)版本管理
    如图所示。这里会在完整包信息之间插入补丁包信息。补丁包信息必须先于版本信息入库,避免出现查询异常。
    产品名称:必选
    版本类型:必选
    包名:自动获取,产品存在包名,将会进行对比,否则记入产品信息中。
    版本名:给普通用户查看的版本信息(字符串)。
    版本号:int类型,用于升级的版本信息,新上传的版本号必须大于上一版本。
    备注:填入升级信息。
    向前对比版本数量:月更新产品,建议设为3次,意思是向上对比不多于3个版本号;周更新产品自己酌情处理。
    SHA1:当前文件的SHA1校验码。
    旧版本SHA1:之前版本的完整包校验码,用于更新查询接口。

提交新版本过程

版本提交流程

接口设计

检查更新接口拥有4个请求参数,如下

参数名 参数描述
productId 产品ID
versionCode 当前版本号
type 版本类型
oldsha1code 当前版本的校验码

返回参数:

参数名 参数描述
name 产品ID
updateType 更新类型有三种,inc(增量)、full(完整)、noupdate(无更新)
versionCode 最新版本号
versionName 最新版本名
size long类型,更新包大小
sizeOriginal 在增量更新有效时,表示最新包大小
newSHA 最新包的SHA1校验码
increaseSHA 补丁包的SHA1校验码
url 下载链接
updateList 更新信息

在系统中,版本37的SHA1 是 bbc3be08...4f72f41,最新版本是39,SHA1是d53eca....46474811f,从37到39的补丁包的SHA1 是56efbfce....8628。
1)情况一 :可能当前版本和最新版本不存在补丁包,也可能是当前版本的检验码与服务器记录不符,要求完整更新
参数:

productId:b6d9f85e...64ef
versionCode:37
type:official
oldsha1code:1c5cae2551....964fcab

接口结果:

{
    "code": 1000,
    "updateInfo": {
        "name": "b6d9f85e...64ef",
        "updateType": "full",
        "versionCode": 39,
        "versionName": "1.3.3",
        "size": 20185438,
        "newSHA": "d53eca....46474811f",
        "url": "http://xxx.com/files/d53/d53ec/xxxx_1.3.3_39.apk",
        "updateList": [
            {
                "versionCode": 39,
                "versionName": "1.3.3",
                "updateContent": "1.【新增】优化月租续期缴费,新增自然月续期\n2.【优化】优化附近车场列表加载速度\n3.【优化】优化修复车位申请异常信息提示\n我们始终努力改善您的体验,提高稳定性以及性能优化"
            },
            {
                "versionCode": 38,
                "versionName": "1.3.2",
                "updateContent": "1.【新增】预约车位增加车库位置信息和线路导航;\r\n2.【新增】车场列表新增地区选择和条件排序;\r\n3.【优化】优化附近车场信息和显示;\r\n4.【优化】优化月租到期续费;\r\n我们始终努力改善您的体验,提高稳定性以及性能优化。"
            }
        ]
    }
}

2) 情况二:增量更新
请求参数:

productId:b6d9f85e...64ef
versionCode:37
type:official
oldsha1code:bbc3be08...4f72f41

接口结果:

{
    "code": 1000,
    "updateInfo": {
        "name": "b6d9f85e...64ef",
        "updateType": "inc",
        "versionCode": 39,
        "versionName": "1.3.3",
        "size": 4049580,
        "sizeOriginal": 20185438,
        "newSHA": "d53eca....46474811f",
        "increaseSHA": "56efbfce....8628",
        "url": "http://xxx.com/files/d53/d53ec/xxxx_37_39.patch",
        "updateList": [
            {
                "versionCode": 39,
                "versionName": "1.3.3",
                "updateContent": "1.【新增】优化月租续期缴费,新增自然月续期\n2.【优化】优化附近车场列表加载速度\n3.【优化】优化修复车位申请异常信息提示\n我们始终努力改善您的体验,提高稳定性以及性能优化"
            },
            {
                "versionCode": 38,
                "versionName": "1.3.2",
                "updateContent": "1.【新增】预约车位增加车库位置信息和线路导航;\r\n2.【新增】车场列表新增地区选择和条件排序;\r\n3.【优化】优化附近车场信息和显示;\r\n4.【优化】优化月租到期续费;\r\n我们始终努力改善您的体验,提高稳定性以及性能优化。"
            }
        ]
    }
}

3)情况三:无更新,有两种原因触发,一是最新版本检查更新时出现,也可能是测试版本出现版本号比发布系统上的新。
请求参数:

productId:b6d9f85e...64ef
versionCode:39
type:official
oldsha1code:d53eca....46474811f

接口结果:

{
    "code": 1000,
    "updateInfo": {
        "name": "b6d9f85e...64ef",
        "updateType": "noupdate"
    }
}

注意:不要在同一文件夹下存放过多文件,会导致磁盘查找缓慢??梢岳孟裆厦娴姆绞嚼肧HA1来分散存储。

服务器这边的情况大致就是这样了,这个只要和后台开发说明白了,很快就能完成,这个接口除了黑盒测试之外,需要仔细过一遍白盒测试,如果存在潜在的问题,会在往后的发布过程中暴露出来,导致严重的更新事故。

第三部分本来想写APP的更新过程的,细想一下,这些年我换了几种网络框架,大致的逻辑也没什么变化,唯有网络框架变化导致代码重构。除非有迫切的原因,这个部分暂时不会写了。

最后编辑于
?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容