接上一節(jié)的內(nèi)容需了,通過(guò)使用 Bsdiff 可以成功實(shí)現(xiàn)拆分和合并了还栓。這個(gè)時(shí)候就要想一下如何完成整個(gè)更新的過(guò)程锦庸。
必須想清楚的問(wèn)題
這個(gè)時(shí)候要注意不再是增量拆分,而是如何平滑得實(shí)現(xiàn)應(yīng)用的更新闰非。
- 優(yōu)先級(jí)問(wèn)題
當(dāng)檢查更新時(shí)魔策,存在最新版本的補(bǔ)丁時(shí),優(yōu)先使用增量更新河胎;如若沒(méi)有闯袒,采用完整更新。 - 拆分次數(shù)問(wèn)題
隨著版本不斷迭代游岳,由于 Bsdiff 的拆分效能低政敢,不能也沒(méi)必要做到每個(gè)新版本提供以前所有版本的補(bǔ)丁。
試想一下胚迫,一個(gè)版本越久遠(yuǎn)越是可能與新版本存在較大差異喷户,補(bǔ)丁包大小逐漸接近完整包大小,再者访锻,App隨著apk的Size也隨之增加褪尝,拆分所需的時(shí)間、空間也隨之增大期犬,發(fā)布新版本的處理時(shí)間越來(lái)越長(zhǎng)河哑,增量更新的優(yōu)勢(shì)不復(fù)存在了,這是不能接受的龟虎。
在更新版本的時(shí)候給予設(shè)置向前比較次數(shù)璃谨,我以3個(gè)月為期,對(duì)于每月更新的APP可以設(shè)為3次。 - 唯一性問(wèn)題
通常情況下佳吞,APP 的版本標(biāo)識(shí)是 包名或者是 application id 拱雏,版本號(hào),版本號(hào)底扳,我則增加一個(gè)類(lèi)型屬性铸抑,可以理解為渠道名,這是為了解決一些現(xiàn)實(shí)的問(wèn)題衷模,同一APP給不同客戶(hù)群體使用鹊汛,例如測(cè)試人員和正式用戶(hù),測(cè)試人員可以收到內(nèi)部快速迭代的更新包算芯,而不會(huì)影響到正式用戶(hù),這樣可以給特定用戶(hù)群開(kāi)放不同的版本功能凳宙,并且能夠?qū)崿F(xiàn)階段性切換產(chǎn)品線(xiàn)熙揍。 - 完整性檢驗(yàn)
通過(guò)SHA1校驗(yàn)碼確認(rèn)合并前后文件都是一致的,保障合并的成功率 - 級(jí)聯(lián)刪除
可以單獨(dú)刪除補(bǔ)丁包數(shù)據(jù)氏涩,相應(yīng)版本只支持完整更新了届囚;刪除完整包數(shù)據(jù),就要附帶刪除所有相關(guān)的補(bǔ)丁包數(shù)據(jù)是尖,避免導(dǎo)致更新系統(tǒng)混亂意系。
界面設(shè)計(jì)
目前在用的系統(tǒng)也是由這個(gè)雛形發(fā)展而來(lái),而我現(xiàn)在并不在負(fù)責(zé)這個(gè)部分的編碼饺汹,這里公布部分界面以及邏輯原理蛔添。
- 產(chǎn)品管理
這里的產(chǎn)品管理是以移動(dòng)產(chǎn)品為標(biāo)準(zhǔn)劃分。
產(chǎn)品ID:自動(dòng)UUID兜辞,在各個(gè)系統(tǒng)模塊中通用迎瞧,這里僅用于更新模塊,也可用于廣告投放模塊逸吵。
產(chǎn)品名稱(chēng): 必填
產(chǎn)品說(shuō)明:一個(gè)公司里面可能存在很多類(lèi)似的產(chǎn)品凶硅,用于區(qū)分細(xì)節(jié)。
包名:如果上傳的是APK包扫皱,則和應(yīng)用市場(chǎng)類(lèi)似足绅,可以不填,自動(dòng)獲取第一次上傳的application id 韩脑,以后通過(guò)新增版本頁(yè)面上傳是會(huì)對(duì)比這個(gè)參數(shù)氢妈,不符合就會(huì)上傳失敗,避免腦抽了段多,出現(xiàn)嚴(yán)重的問(wèn)題允懂。
云端下載:自身系統(tǒng)的帶寬有限,通過(guò)把包放到阿里云或者七牛等地方衩匣,減低帶寬壓力蕾总。
- 產(chǎn)品管理
- 2)版本管理
如圖所示粥航。這里會(huì)在完整包信息之間插入補(bǔ)丁包信息。補(bǔ)丁包信息必須先于版本信息入庫(kù)生百,避免出現(xiàn)查詢(xún)異常递雀。
產(chǎn)品名稱(chēng):必選
版本類(lèi)型:必選
包名:自動(dòng)獲取,產(chǎn)品存在包名蚀浆,將會(huì)進(jìn)行對(duì)比缀程,否則記入產(chǎn)品信息中。
版本名:給普通用戶(hù)查看的版本信息(字符串)市俊。
版本號(hào):int類(lèi)型杨凑,用于升級(jí)的版本信息,新上傳的版本號(hào)必須大于上一版本摆昧。
備注:填入升級(jí)信息撩满。
向前對(duì)比版本數(shù)量:月更新產(chǎn)品,建議設(shè)為3次绅你,意思是向上對(duì)比不多于3個(gè)版本號(hào)伺帘;周更新產(chǎn)品自己酌情處理。
SHA1:當(dāng)前文件的SHA1校驗(yàn)碼忌锯。
舊版本SHA1:之前版本的完整包校驗(yàn)碼伪嫁,用于更新查詢(xún)接口。
提交新版本過(guò)程
接口設(shè)計(jì)
檢查更新接口擁有4個(gè)請(qǐng)求參數(shù)偶垮,如下
參數(shù)名 | 參數(shù)描述 |
---|---|
productId | 產(chǎn)品ID |
versionCode | 當(dāng)前版本號(hào) |
type | 版本類(lèi)型 |
oldsha1code | 當(dāng)前版本的校驗(yàn)碼 |
返回參數(shù):
參數(shù)名 | 參數(shù)描述 |
---|---|
name | 產(chǎn)品ID |
updateType | 更新類(lèi)型有三種张咳,inc(增量)、full(完整)似舵、noupdate(無(wú)更新) |
versionCode | 最新版本號(hào) |
versionName | 最新版本名 |
size | long類(lèi)型晶伦,更新包大小 |
sizeOriginal | 在增量更新有效時(shí),表示最新包大小 |
newSHA | 最新包的SHA1校驗(yàn)碼 |
increaseSHA | 補(bǔ)丁包的SHA1校驗(yàn)碼 |
url | 下載鏈接 |
updateList | 更新信息 |
在系統(tǒng)中啄枕,版本37的SHA1 是 bbc3be08...4f72f41婚陪,最新版本是39,SHA1是d53eca....46474811f,從37到39的補(bǔ)丁包的SHA1 是56efbfce....8628频祝。
1)情況一 :可能當(dāng)前版本和最新版本不存在補(bǔ)丁包泌参,也可能是當(dāng)前版本的檢驗(yàn)碼與服務(wù)器記錄不符,要求完整更新
參數(shù):
productId:b6d9f85e...64ef
versionCode:37
type:official
oldsha1code:1c5cae2551....964fcab
接口結(jié)果:
{
"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.【新增】?jī)?yōu)化月租續(xù)期繳費(fèi)常空,新增自然月續(xù)期\n2.【優(yōu)化】?jī)?yōu)化附近車(chē)場(chǎng)列表加載速度\n3.【優(yōu)化】?jī)?yōu)化修復(fù)車(chē)位申請(qǐng)異常信息提示\n我們始終努力改善您的體驗(yàn)沽一,提高穩(wěn)定性以及性能優(yōu)化"
},
{
"versionCode": 38,
"versionName": "1.3.2",
"updateContent": "1.【新增】預(yù)約車(chē)位增加車(chē)庫(kù)位置信息和線(xiàn)路導(dǎo)航;\r\n2.【新增】車(chē)場(chǎng)列表新增地區(qū)選擇和條件排序漓糙;\r\n3.【優(yōu)化】?jī)?yōu)化附近車(chē)場(chǎng)信息和顯示铣缠;\r\n4.【優(yōu)化】?jī)?yōu)化月租到期續(xù)費(fèi);\r\n我們始終努力改善您的體驗(yàn),提高穩(wěn)定性以及性能優(yōu)化蝗蛙。"
}
]
}
}
2) 情況二:增量更新
請(qǐng)求參數(shù):
productId:b6d9f85e...64ef
versionCode:37
type:official
oldsha1code:bbc3be08...4f72f41
接口結(jié)果:
{
"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.【新增】?jī)?yōu)化月租續(xù)期繳費(fèi)蝇庭,新增自然月續(xù)期\n2.【優(yōu)化】?jī)?yōu)化附近車(chē)場(chǎng)列表加載速度\n3.【優(yōu)化】?jī)?yōu)化修復(fù)車(chē)位申請(qǐng)異常信息提示\n我們始終努力改善您的體驗(yàn),提高穩(wěn)定性以及性能優(yōu)化"
},
{
"versionCode": 38,
"versionName": "1.3.2",
"updateContent": "1.【新增】預(yù)約車(chē)位增加車(chē)庫(kù)位置信息和線(xiàn)路導(dǎo)航捡硅;\r\n2.【新增】車(chē)場(chǎng)列表新增地區(qū)選擇和條件排序哮内;\r\n3.【優(yōu)化】?jī)?yōu)化附近車(chē)場(chǎng)信息和顯示;\r\n4.【優(yōu)化】?jī)?yōu)化月租到期續(xù)費(fèi)壮韭;\r\n我們始終努力改善您的體驗(yàn)北发,提高穩(wěn)定性以及性能優(yōu)化。"
}
]
}
}
3)情況三:無(wú)更新,有兩種原因觸發(fā)喷屋,一是最新版本檢查更新時(shí)出現(xiàn)琳拨,也可能是測(cè)試版本出現(xiàn)版本號(hào)比發(fā)布系統(tǒng)上的新。
請(qǐng)求參數(shù):
productId:b6d9f85e...64ef
versionCode:39
type:official
oldsha1code:d53eca....46474811f
接口結(jié)果:
{
"code": 1000,
"updateInfo": {
"name": "b6d9f85e...64ef",
"updateType": "noupdate"
}
}
注意:不要在同一文件夾下存放過(guò)多文件屯曹,會(huì)導(dǎo)致磁盤(pán)查找緩慢狱庇。可以利用像上面的方式利用SHA1來(lái)分散存儲(chǔ)是牢。
服務(wù)器這邊的情況大致就是這樣了僵井,這個(gè)只要和后臺(tái)開(kāi)發(fā)說(shuō)明白了陕截,很快就能完成驳棱,這個(gè)接口除了黑盒測(cè)試之外,需要仔細(xì)過(guò)一遍白盒測(cè)試农曲,如果存在潛在的問(wèn)題社搅,會(huì)在往后的發(fā)布過(guò)程中暴露出來(lái),導(dǎo)致嚴(yán)重的更新事故乳规。
第三部分本來(lái)想寫(xiě)APP的更新過(guò)程的形葬,細(xì)想一下,這些年我換了幾種網(wǎng)絡(luò)框架暮的,大致的邏輯也沒(méi)什么變化笙以,唯有網(wǎng)絡(luò)框架變化導(dǎo)致代碼重構(gòu)。除非有迫切的原因冻辩,這個(gè)部分暫時(shí)不會(huì)寫(xiě)了猖腕。