方案
使用腾讯的tinker,对于加固的apk(360和应用宝2个渠道)不支持
不加固的apk:
1、支持热更新的手机
使用热更新方案自动下载加载补丁包,无需安装,共用一个补丁包
2、不支持热更新的手机
检测到加载补丁失败,提醒用户下载对应渠道新的完整apk,重新安装
加固的apk:
提醒用户下载对应渠道新的完整apk,重新安装
Web
为了保证不支持热更新的手机,也能升级修复bug,并保证版本号不变,所以每次热更新,后台都必选管理所有渠道的apk,也即每次热更新都必须提供所有渠道的apk。
每次更新后台补丁时,都需要提供的文件:
1、通用补丁文件
2、不加固的渠道,所有渠道的apk文件(为了保证不支持热更新的手机,也能通过下载完整apk的方式升级)
3、加固的渠道,所有渠道的apk文件(加固的apk不支持热更新)
重点:
所有渠道的apk文件,都要有!!!
通讯
新增checkPatchVersion接口(新增,检测并获取最新版本补丁信息)
URL | product/checkPatchVersion |
参数 | String channel 渠道(必须) Integer version 当前软件版本号(必须) Integer patchVersion 当前补丁版本号(必须) String deviceName 设备型号 String sdkLevel 系统版本 |
返回值 | Integer flag:1-是最新补丁,0-不是最新补丁 info:最新版本补丁信息(当flag=0时有值,flag为1时为空) |
描述 | 通讯: 根据版本号、补丁号、渠道名,确定是否有热更新 1、如果是加固的渠道,只返回apk信息 2、如果是非加固渠道,返回补丁和apk信息 终端: if(info.patchFileId > 0){ //有补丁文件返回,下载补丁文件,弹窗提醒用户,已经下载完成补丁,需要重启加载 //加载抛异常就是不支持热更新,然后弹窗提醒用户下载apk安装更新补丁 }else{ //没有补丁文件 if(info.apkFileId > 0){ //弹窗提醒用户下载apk安装更新补丁 } } |
PatchInfo 补丁信息:
patchVersion | Integer | 补丁版本号 |
version | Integer | 版本号 |
versionName | String | 版本名称(如V5.0.2) |
channel | String | 渠道 |
description | String | 补丁描述 |
releaseTime | Long | 发布时间 |
|
|
|
patchFileId | Long | 补丁文件下载id,如果没有返回0 |
patchFileSize | Long | 补丁文件大小(单位:Byte),如果没有返回0 |
patchMd5Code | String | 补丁文件MD5文件校验码 |
apkFileId | Long | apk补丁文件下载id,如果没有返回0 |
apkFileSize | Long | apk补丁文件大小(单位:Byte),如果没有返回0 |
apkMd5Code | String | apk补丁文件MD5文件校验码 |
终端
代码逻辑:
完整流程:
手机重新运行 读取缓存的PatchInfo ,检测是否有对应当前版本的补丁文件(文件名称需要包含版本号-补丁号,补丁文件的补丁号需要>程序读取到的补丁号,不要已经通过apk的方式安装补丁了还走加载补丁的流程) 1、有补丁文件,加载补丁文件(需要捕获异常) 1.1 加载成功 进入“检测市场版本流程” 1.2 加载失败 根据PatchInfo里面的apk信息,进入“下载apk安装流程”
2、没有补丁文件 进入“检测市场版本流程” |
检测市场版本流程:
此流程是程序启动都必须走一遍的 先通过checkApkVersion,获取是否有市场版本升级 1.1 如果有市场版本升级 通过getUpgradeApkInfo获取具体升级信息,提醒下载升级市场版本 1.1.1 选择下载更新,进入“下载apk安装流程” 1.1.2 选择忽略当前版本,进入“检测补丁文件流程” 1.2 如果没有市场版本升级 进入“检测补丁文件流程” |
检测补丁文件流程:
通过checkPatchVersion获取是否有热更新,如果flag==0(不是最新补丁), if(info.patchFileId > 0){ //有补丁文件返回,下载补丁文件,弹窗提醒用户,补丁已经下载完成,修复了哪些问题,需要重启加载 }else{ //没有补丁文件 if(info.apkFileId > 0){ //进入“下载apk安装流程” } } |
下载apk安装流程:
弹窗提醒用户下载apk安装更新补丁 ...... |
测试
热更新必要验证流程:
至少要验证的版本:
5.1.5-520-0(市场版本)
准备文件:
5.1.5-520-0-baidu7.apk(不加固)、5.1.5-520-0-36012.apk(加固)
5.1.5-520-1(热更新版本)
准备文件:
通用补丁包、5.1.5-520-1-baidu7.apk(不加固)、5.1.5-520-1-36012.apk(加固)
5.1.5-520-2(热更新版本)
准备文件:
通用补丁包、5.1.5-520-2-baidu7.apk(不加固)、5.1.5-520-2-36012.apk(加固)
5.1.6-530-2(市场版本)
准备文件:
5.1.6-530-2-baidu7.apk(不加固)、5.1.6-530-2-36012.apk(加固)
准备手机:
三星android-21(5.0)机型或其他不支持补丁的手机A、手机B、手机C、手机D
保证验证的流程:
1、市场版本,升级下一个补丁包是否正常(例如5.1.5-520-0升级到5.1.5-520-1)
2、某些不支持补丁的手机(手机A),加载补丁包失败后,是否会提醒下载安装apk(例如手机A从5.1.5-520-0升级到5.1.5-520-1,加载插件失败,应该提醒下载apk并安装)
3、补丁版本,升级下一个补丁版本是否正常(例如5.1.5-520-1升级到5.1.5-520-2)
4、某些不支持补丁的手机(手机A),apk升级到补丁版本之后,再升级下一个补丁版本是否正常(例如手机A通过apk升级到5.1.5-520-1后,是否能正常升级到5.1.5-520-2)
5、热更新版本,是否能正常升级到下一个市场版本(例如5.1.5-520-2,是否能正常升级到5.1.6-530-2)
6、对于加固的版本,是否能如不支持补丁的手机一样,提醒下载apk并安装
手机保证修改:
1、关于户外助手与帮助里面,显示版本名-版本号-补丁版本
2、每次发布补丁,至少修改下代码、布局(这个也不算太重要,要是不支持的也没办法了)
测试流程:
1、发布5.1.5-520-0(市场版本)
测试:
手机A安装baidu7渠道,验证5.1.5-520-0版本特征及是否是baidu7渠道
手机B安装baidu7渠道,验证5.1.5-520-0版本特征及是否是baidu7渠道
手机C安装baidu7渠道,验证5.1.5-520-0版本特征及是否是baidu7渠道
手机D安装36012渠道,验证5.1.5-520-0版本特征及是否是36012渠道
2、发布5.1.5-520-1(热更新版本)
测试:
手机A是否能检测到有更新,并提醒下载补丁apk并安装,并安装流程升级到5.1.5-520-1,验证5.1.5-520-1版本特征及是否是baidu7渠道;
手机B是否能自动加载补丁包然后完成升级,验证5.1.5-520-1版本特征及是否是baidu7渠道;
手机C是否能自动加载补丁包然后完成升级,验证5.1.5-520-1版本特征及是否是baidu7渠道(验证完全手机设置里面杀死进程,不要运行升级到5.1.5-520-2,为了验证5.1.5-520-1跳过5.1.5-520-2升级到5.1.6-530-2);
手机D是否能检测到有更新,并提醒下载补丁apk并安装,并安装流程升级到5.1.5-520-1,验证5.1.5-520-1版本特征及是否是36012渠道;
3、发布5.1.5-520-2(热更新版本)
测试:
手机A是否能检测到有更新,并提醒下载补丁apk并安装,并安装流程升级到5.1.5-520-2,验证5.1.5-520-2版本特征及是否是baidu7渠道;
手机B是否能自动加载补丁包然后完成升级,验证5.1.5-520-2版本特征及是否是baidu7渠道;
手机D是否能检测到有更新,并提醒下载补丁apk并安装,并安装流程升级到5.1.5-520-2,验证5.1.5-520-2版本特征及是否是36012渠道;
4、发布5.1.6-530-2(市场版本)
测试:
手机A是否能检测到有更新,并提醒下载apk并安装,并安装流程升级到5.1.6-530-2,验证5.1.6-530-2版本特征及是否是baidu7渠道;
手机B是否能检测到有更新,并提醒下载apk并安装,并安装流程升级到5.1.6-530-2,验证5.1.6-530-2版本特征及是否是baidu7渠道;
手机C是否能检测到有更新,并提醒下载apk并安装,并安装流程升级到5.1.6-530-2,验证5.1.6-530-2版本特征及是否是baidu7渠道;
手机D是否能检测到有更新,并提醒下载apk并安装,并安装流程升级到5.1.6-530-2,验证5.1.6-530-2版本特征及是否是36012渠道;