APP技術(shù)之熱補(bǔ)丁與增量更新

5 評論 7590 瀏覽 52 收藏 7 分鐘

熱補(bǔ)丁與增量更新技術(shù)在APP中是比較常見的,作為移動端產(chǎn)品的產(chǎn)品經(jīng)理,應(yīng)該對這些技術(shù)有一些大致的了解。

熱補(bǔ)丁技術(shù)

定義

熱補(bǔ)丁修復(fù)技術(shù)可以做到線上推送一段修補(bǔ) BUG 的代碼,終端無需更新版本直接運(yùn)行,可以做到在用戶無感知的情況下,修復(fù)問題。

該技術(shù)避免了當(dāng)App發(fā)布之后,突然發(fā)現(xiàn)bug需要進(jìn)行緊急修復(fù)時(shí)需要完成的重新打包App、測試、向各個(gè)應(yīng)用市場和渠道換包、提示用戶升級、用戶下載、覆蓋安裝等一系列復(fù)雜的操作。

原理

Android

熱補(bǔ)丁修復(fù)技術(shù)基于的是android dex分包方案。我們都知道andriod的安裝文件是APK文件,APK文件中包含了軟件的信息(版本號等)、dex文件(就是程序員的代碼)、res文件夾(設(shè)計(jì)師的文件,包括切圖、動效等)。

那么為什么dex分包呢?當(dāng)一個(gè)APP的功能越來越復(fù)雜,代碼量越來越多時(shí)程序的編譯會出現(xiàn)錯(cuò)誤,會出現(xiàn)APK文件無法安裝的情況。出現(xiàn)這些問題主要是因?yàn)橐粋€(gè)dex文件最多只支持65536個(gè)方法,如果一個(gè)復(fù)雜的APP全部寫在一個(gè)dex文件中,肯定會超載。所以要對dex進(jìn)行分包,dex文件就是代碼的集合。

熱補(bǔ)丁原理,簡單的概括一下,就是把多個(gè)dex文件塞入到APP的Classloader(通過這個(gè)類來實(shí)現(xiàn)dex的分包,大家都知道什么叫類吧~)之中。每個(gè)dex文件是一個(gè)對象,多個(gè)dex文件排列成一個(gè)有序的數(shù)組,當(dāng)程序執(zhí)行的時(shí)候,會按順序遍歷dex文件,然后從當(dāng)前遍歷的dex文件中找相應(yīng)功能的類,如果找則返回,如果找不到從下一個(gè)dex文件繼續(xù)查找。

那么這樣的話,可以在這個(gè)數(shù)組中的第一個(gè)元素放置格式為.jar的文件,里面包含修復(fù)過功能的類,這樣的話,當(dāng)程序遍歷的時(shí)候,修復(fù)過功能的類就會被率先查找到,從而替代有bug的類。

原理如下圖:

iOS

iOS主要是使用JSPatch來實(shí)現(xiàn)熱補(bǔ)丁修復(fù),在項(xiàng)目中引入JSPathc,然后在發(fā)現(xiàn)bug時(shí)下發(fā)JS腳本補(bǔ)丁,替換原生方法,以此實(shí)現(xiàn)無需更新APP即時(shí)修復(fù)bug。

主要實(shí)現(xiàn)流程:當(dāng)客戶端出現(xiàn)bug時(shí),iOS開發(fā)人員需要開發(fā)一段JS腳本用于修復(fù)bug,腳本開發(fā)完成后,服務(wù)端開發(fā)人員根據(jù)iOS開發(fā)人員提供的JS腳本部進(jìn)行一定的安全策略部署服務(wù)端腳本,iOS客戶端通過腳本版本檢測接口,判斷是否需要下載JS腳本,下載腳本成功后,進(jìn)行加載,運(yùn)行,進(jìn)而修復(fù)APP的bug。

APP端流程如下:

其中,客戶端與服務(wù)端在獲取JS腳本時(shí)會進(jìn)行安全校驗(yàn),防止過程中被攻擊替換代碼,安全校驗(yàn)的簡單流程:a.服務(wù)端對JS腳本文件生成一個(gè)MD5(文件的唯一標(biāo)識)值并加密——b.將加密的MD5值與JS腳本傳給客戶端——c.客戶端對拿到的腳本文件計(jì)算MD5值,且對加密的MD5值進(jìn)行解密——d.客戶端對比計(jì)算出的MD5值與解密后的MD5值——e.兩個(gè)MD5數(shù)值相等則通過校驗(yàn)。

熱補(bǔ)丁技術(shù)不僅可以用來修復(fù)bug打補(bǔ)丁,還可以在線更新代碼添加新需求哦!

增量更新技術(shù)

定義

增量更新是指在進(jìn)行更新操作時(shí),只更新需要改變的地方,不需要更新或者已經(jīng)更新過的地方則不會重復(fù)更新。也就是,只將App中有發(fā)生改變的部分發(fā)送給用戶,而不是每次都重新下載一個(gè)完整的安裝包。

原理

  1. 生成差異包。將 App 的最新安裝包(V2)與歷史發(fā)布版本的安裝包(V1)進(jìn)行差分對比,得到一個(gè)差異包(V2-V1)。
  2. 下發(fā)差異包。當(dāng)某個(gè)老版本(V1)的 App 開始檢查更新的時(shí)候,需要將自己當(dāng)前的版本信息發(fā)送給服務(wù)端,然后服務(wù)端判斷后,選擇對應(yīng)的差異包(V2-V1)下發(fā)。
  3. 合成新包。
  4. 校驗(yàn)完整性。校驗(yàn)當(dāng)前歷史包的Hash值以及差異包的Hash(哈希值是一段數(shù)據(jù)唯一的數(shù)值表示形式)值,合成新包后,也要校驗(yàn)新包的Hash值,只有這三個(gè)Hash值都與預(yù)期匹配,才可以確認(rèn)新包是完整的。

增量更新的注意點(diǎn):

  • 增量更新是以兩個(gè)應(yīng)用版本之間的差異來生成補(bǔ)丁的,無法保證用戶每次及時(shí)升級到最新,所以必須對所發(fā)布的每一個(gè)版本都和最新的版本作差分,以使所有版本的用戶都可以差分升級,這樣操作較為繁瑣,不過可以通過腳本批量生成。
  • 增量更新成功的前提是,用戶手機(jī)端必須有能夠被拷貝出來且與服務(wù)器用于差分的版本一致的APK文件,這樣就會造成一些情況,例如,系統(tǒng)內(nèi)置的APK無法獲取到,則無法進(jìn)行增量更新。

以上,就是對熱補(bǔ)丁修復(fù)技術(shù)與增量更新技術(shù)的小總結(jié),希望對大家能有所幫助。

 

作者:流年,互聯(lián)網(wǎng)產(chǎn)品設(shè)計(jì)師,4年互聯(lián)網(wǎng)產(chǎn)品設(shè)計(jì)經(jīng)驗(yàn)。

本文由 @流年 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理。未經(jīng)許可,禁止轉(zhuǎn)載。

題圖來自unsplash,基于CC0協(xié)議

更多精彩內(nèi)容,請關(guān)注人人都是產(chǎn)品經(jīng)理微信公眾號或下載App
評論
評論請登錄
  1. ios端,開發(fā)是上傳差異包,還是合成新包后發(fā)送新包給蘋果?差異包的大小是蘋果官方計(jì)算的還是開發(fā)給出的

    來自浙江 回復(fù)
  2. 非技術(shù)出身產(chǎn)品經(jīng)理的技術(shù)溝通秘籍!15天補(bǔ)齊程序/代碼、前端、后端、數(shù)據(jù)庫4大模塊基礎(chǔ)技術(shù)知識。
    詳情戳>http://996.pm/7daXE 或咨詢起點(diǎn)學(xué)院蘑菇(wx:qdxymg)

    來自廣東 回復(fù)
  3. 有個(gè)問題,JSPatch的熱更已被蘋果禁止,直接拒包

    來自廣東 回復(fù)
    1. 游戲是可以的吧

      來自浙江 回復(fù)
  4. 有個(gè)問題,雖然APP版本不變,那么對于終端來講,Hotfix的補(bǔ)丁包還是要網(wǎng)絡(luò)請求下載的吧

    來自四川 回復(fù)