不積跬步,無以致千里;python
不積小流,無以成江海。算法
出自荀子《勸學篇》編程
一、概念解釋微信
OTA是何物? 英文解釋爲 Over The Air,既空中下載的意思,具體指遠程無線方式,OTA 技術能夠理解爲一種遠程無線升級技術;網絡
FOTA:Firmware OverThe Air/固件空中升級,經過雲端爲具備連網功能的設備:例如手機、平板電腦、移動互聯網設備等提供固件升級服務,手機中的固件升級便可稱爲 FOTA;app
在3G、4G網絡廣泛的今天,不少時候仍是要考慮流量限制,若是步入5G時代,雖然流量已不在是瓶頸,可是由於功能小可是重要的版本升級相比總體固件升級來講仍是至關不錯的選擇。函數
二、基礎知識工具
作了有一段時間的OTA升級了,主要是基於Android的差分及全量升級,計劃對當前掌握的知識在作一個系統的梳理與總結,在進行正式的流程講解前我會先對OTA的一些原始包結構、目標包結構作詳細說明,本節算是一個基礎章節,爲理解、消化後面的主要流程作鋪墊。優化
包結構ui
製做升級包具備必定的格式,生成它須要原始包,原始包也有固定的格式,基本都是經過系統工程編譯出來,結構以下:
目錄說明
升級包結構
目錄說明
生成升級包的工具
用於生成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函數的基本過程
一、ota_from_target_files-main大體流程,這裏主要是作了一些準備工做,核心工做在最後一個函數中:
二、ota_from_target_files - WriteIncrementalOTAPackage()
這裏參數有4個,分別是:
input_zip -> 基礎包
source_zip -> 目標包
output_zip -> 升級包(即將生成)
OPTIONS.fota -> fota標記
WriteIncrementalOTAPackage--流程以下:
重點說明:
一、updater-script 的生成:是由script(列表)而來,此列表的內容來自於各類生成過程當中不斷的添加,每一條是一條執行命令。
二、ComputePatch計算差分:這裏對若是文件類型是一些壓縮文件,如:.img、.apk、.jar、.zip、.gz,會使用imgdiff可執行文件來計算,若是是普通文件則會使用到bsdiff進行計算。
三、文件的權限問題: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
四、update-binary:來自於目標包中位置以下 OTA/bin/updater
五、sha值從何而來:原始文件與目標文件是經過has1值去匹配的 在LoadSystemFiles 函數中計算而來
通過以上步驟就能夠生成一個差分包,結構以下(樣例):
對應的updater-script以下(樣例):
以上就是使用腳本進行OTA差分包製做的所有過程。
本人自己不是作專業python,有些地方講解的可能不是很合理,還但願同行高人批評指點。對於bsdiff與imgdiff算法並無仔細研究過。當前重點關注主要流程。
瞭解了以上內容,就能夠對此工具進行個性化的修改了,如添加其餘新文件到升級包中、添加流程關鍵字說明等等。可是知道了這些內容,不少人仍是對OTA升級比較困惑,
那咱們下一節就能夠基於本章內容進行OTA升級過程的詳細講解,下一章以後你們就會明白,升級包中的每個文件的做用及存在的意義,以及recovery使用核心組件updater-script
與update-binary完成整個差分包的升級,敬請期待。。。
關注微信公衆號【嵌入式C部落】,獲取更多精華文章,海量編程資料,讓咱們一塊兒進步,一塊兒成長。