OTA升級詳解(一)
不積跬步,無以至千里;
不積小流,無以成江海。
出自荀子《勸學篇》
1、概念解釋
OTA是何物? 英文解釋為 Over The Air,既空中下載的意思,具體指遠端無線方式,OTA 技術可以理解為一種遠端無線升級技術;
FOTA:Firmware OverThe Air/韌體空中升級,通過雲端為具有連網功能的裝置:例如手機、平板電腦、移動網際網路裝置等提供韌體升級服務,手機中的韌體升級即可稱為 FOTA;
在3G、4G網路普遍的今天,很多時候還是要考慮流量限制,如果步入5G時代,雖然流量已不在是瓶頸,但是因為功能小但是重要的版本升級相比整體韌體升級來說還是相當不錯的選擇。
2、基礎知識
做了有一段時間的OTA升級了,主要是基於Android的差分及全量升級,計劃對當前掌握的知識在做一個系統的梳理與總結,在進行正式的流程講解前我會先對OTA的一些原始包結構、目標包結構做詳細說明,本節算是一個基礎章節,為理解、消化後面的主要流程做鋪墊。
包結構
製作升級包具有一定的格式,生成它需要原始包,原始包也有固定的格式,基本都是通過系統工程編譯出來,結構如下:
目錄說明
升級包結構
目錄說明
生成升級包的工具
用於生成OTA差分包的需要使用到python指令碼、C原始碼編譯的可執行檔案,這些都是開源的,如下
檔案功能
ota_from_target_files:為一個python指令碼,做包入口從這裡開始,生成包的主要工作也是在這裡完成。
bsddiff:此可執行檔案主要使用者計算非壓縮的檔案的差異,比如我們計算rootfs檔案的差異,就使用的此指令碼。
imgdiff:此可執行檔案主要使用者計算壓縮檔案的差異,支援的格式有*.gz,*.zip,*.apk,*.jar,*.img。
fs_config:此可執行檔案主要使用者計算原始檔案的gid、uid、mode,但是此種方式有一個弊端就是,fs_config其實是硬編碼的,如果我們新增一個檔案,有可能在進行新增後,不能將其許可權進行新增。
common.py:主要定義了一些公用的函式,如:獲取分割槽型別、計算檔案差分、生成patch檔案等。
edify_generator.py:主要是生成updater-script檔案的內容,還包括將檔案新增到升級包中。
以上就是OTA升級所要了解的基本知識,下一章我會詳細講解如何由兩個不同的基本包使用指令碼生成差分升級包,敬請關注哦。。。
青,取之於藍,而青於藍;
冰,水為之,而寒於水。
出自荀子《勸學篇》
本章說明
上篇 OTA升級詳解(一)主要講到OTA的一些基本知識,本篇主要內容為詳解OTA升級包的製作過程,梳理做包關鍵細節,由於做包指令碼較長,檔案較多。暫不按照指令碼註釋的方式進行展示,主要按照呼叫函式順序圖+關鍵步驟文字描述的方式來講解,重複內容會自動省略。講解中的腳步是基於 Android OTA Update 進行的,如果流程與讀者所有的有差異,不要著急,整體流程就是下面的樣子,增加的只是一些細節優化而已,按照實際腳步流程為準就好。
製作流程說明
製作升級包 ota_from_target_files為入口,可以傳入引數,如:是否是差分包,原始包、目標版本包(包結構在一中有詳細講解,以zip包的形式傳入)。以下是main函式的基本過程
1、ota_from_target_files-main大致流程,這裡主要是做了一些準備工作,核心工作在最後一個函式中:
2、ota_from_target_files - WriteIncrementalOTAPackage()
這裡引數有4個,分別是:
input_zip -> 基礎包
source_zip -> 目標包
output_zip -> 升級包(即將生成)
OPTIONS.fota -> fota標記
WriteIncrementalOTAPackage--流程如下:
重點說明:
1、updater-script 的生成:是由script(列表)而來,此列表的內容來自於各種生成過程中不斷的新增,每一條是一條執行命令。
2、ComputePatch計算差分:這裡對如果檔案型別是一些壓縮檔案,如:.img、.apk、.jar、.zip、.gz,會使用imgdiff可執行檔案來計算,如果是普通檔案則會使用到bsdiff進行計算。
3、檔案的許可權問題:system分割槽來說,它是有檔案系統的,要對檔案系統下的每個檔案計算的差分,在zip包中並沒有儲存新增或者變更檔案的gid、uid、mode等屬性,所以需要對新增檔案、或者許可權變更檔案進行許可權修改。保證系統正常執行或者app擁有執行許可權。兩種檔案許可權的獲取方式一種是fs_config(是一種硬編碼方式,比較死板),讀取檔案絕對路徑,獲取這些資訊,另一種方式是來自於原始包中,位於META/filesystem_config.txt,這就要求在生成原始包時,將檔案的許可權儲存到此檔案中,檔案格式與使用fs_config生成的一致。最後使用set_perm_recursive/set_perm對目錄與檔案來進行許可權恢復。
格式: 絕對路徑 gid uid mode
樣例: system/etc/dbus.conf 1000 1000 440
4、update-binary:來自於目標包中位置如下 OTA/bin/updater
5、sha值從何而來:原始檔案與目標檔案是通過has1值去匹配的 在LoadSystemFiles 函式中計算而來
經過以上步驟就可以生成一個差分包,結構如下(樣例):
對應的updater-script如下(樣例):
以上就是使用指令碼進行OTA差分包製作的全部過程。
本人本身不是做專業python,有些地方講解的可能不是很合理,還希望同行高人批評指點。對於bsdiff與imgdiff演算法並沒有仔細研究過。當前重點關注主要流程。
瞭解了以上內容,就可以對此工具進行個性化的修改了,如新增其他新檔案到升級包中、新增流程關鍵字說明等等。但是知道了這些內容,很多人還是對OTA升級比較困惑,
那我們下一節就可以基於本章內容進行OTA升級過程的詳細講解,下一章之後大家就會明白,升級包中的每一個檔案的作用及存在的意義,以及recovery使用核心元件updater-script
與update-binary完成整個差分包的升級,敬請期待。。。
關注微信公眾號【嵌入式C部落】,獲取更多精華文章,海量程式設計資料,讓我們一起進步,一起成長。
<