OTA升級詳解(一)
- 2019 年 11 月 1 日
- 筆記
不積跬步,無以至千里;
不積小流,無以成江海。
出自荀子《勸學篇》
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部落】,獲取更多精華文章,海量編程資料,讓我們一起進步,一起成長。