Android OTA升級原理和流程分析(一)
這篇及以後的篇幅將通過分析update.zip包在具體Android系統升級的過程,來理解Android系統中Recovery模式服務的工作原理。我們先從update.zip包的製作開始,然後是Android系統的啟動模式分析,Recovery工作原理,如何從我們上層開始選擇system update到重啟到Recovery服務,以及在Recovery服務中具體怎樣處理update.zip包升級的,我們的安裝指令碼updater-script怎樣被解析並執行的等一系列問題。分析過程中所用的Android原始碼是gingerbread0919(tcc88xx開發板標配的),測試開發板是tcc88xx。這是在工作中總結的文件,當然在網上參考了不少內容,如有雷同純屬巧合吧,在分析過程中也存在很多未解決的問題,也希望大家不吝指教。
|----boot.img
|----system/
|----recovery/
`|----recovery-from-boot.p
`|----etc/
`|----install-recovery.sh
|---META-INF/
`|CERT.RSA
`|CERT.SF
`|MANIFEST.MF
`|----com/
`|----google/
`|----android/
`|----update-binary
`|----updater-script
`|----android/
`|----metadata
二、 update.zip包目錄結構詳解
以上是我們用命令make otapackage 製作的update.zip包的標準目錄結構。
1、boot.img是更新boot分割槽所需要的檔案。這個boot.img主要包括kernel+ramdisk。
2、system/目錄的內容在升級後會放在系統的system分割槽。主要用來更新系統的一些應用或則應用會用到的一些庫等等。可以將Android原始碼編譯out/target/product/tcc8800/system/中的所有檔案拷貝到這個目錄來代替。
3、recovery/目錄中的recovery-from-boot.p是boot.img和recovery.img的補丁(patch),主要用來更新recovery分割槽,其中etc/目錄下的install-recovery.sh是更新指令碼。4、update-binary是一個二進位制檔案,相當於一個指令碼直譯器,能夠識別updater-script中描述的操作。該檔案在Android原始碼編譯後out/target/product/tcc8800/system bin/updater生成,可將updater重新命名為update-binary得到。
該檔案在具體的更新包中的名字由原始碼中bootable/recovery/install.c中的巨集ASSUMED_UPDATE_BINARY_NAME的值而定。
5、updater-script:此檔案是一個指令碼檔案,具體描述了更新過程。我們可以根據具體情況編寫該指令碼來適應我們的具體需求。該檔案的命名由原始碼中bootable/recovery/updater/updater.c檔案中的巨集SCRIPT_NAME的值而定。
6、 metadata檔案是描述裝置資訊及環境變數的元資料。主要包括一些編譯選項,簽名公鑰,時間戳以及裝置型號等。
7、我們還可以在包中新增userdata目錄,來更新系統中的使用者資料部分。這部分內容在更新後會存放在系統的/data目錄下。
8、update.zip包的簽名:update.zip更新包在製作完成後需要對其簽名,否則在升級時會出現認證失敗的錯誤提示。而且簽名要使用和目標板一致的加密公鑰。加密公鑰及加密需要的三個檔案在Android原始碼編譯後生成的具體路徑為:
out/host/linux-x86/framework/signapk.jar
build/target/product/security/testkey.x509.pem
build/target/product/security/testkey.pk8 。
我們用命令make otapackage製作生成的update.zip包是已簽過名的,如果自己做update.zip包時必須手動對其簽名。
具體的加密方法:$ java –jar gingerbread/out/host/linux/framework/signapk.jar –w gingerbread/build/target/product/security/testkey.x509.pem gingerbread/build/target/product/security/testkey.pk8 update.zip update_signed.zip以上命令在update.zip包所在的路徑下執行,其中signapk.jar testkey.x509.pem以及testkey.pk8檔案的引用使用絕對路徑。update.zip 是我們已經打好的包,update_signed.zip包是命令執行完生成的已經簽過名的包。
9、MANIFEST.MF:這個manifest檔案定義了與包的組成結構相關的資料。類似Android應用的mainfest.xml檔案。
10、CERT.RSA:與簽名檔案相關聯的簽名程式塊檔案,它儲存了用於簽名JAR檔案的公共簽名。
11、CERT.SF:這是JAR檔案的簽名檔案,其中字首CERT代表簽名者。
另外,在具體升級時,對update.zip包檢查時大致會分三步:①檢驗SF檔案與RSA檔案是否匹配。②檢驗MANIFEST.MF與簽名檔案中的digest是否一致。③檢驗包中的檔案與MANIFEST中所描述的是否一致。
三、 Android升級包update.zip的生成過程分析
1) 對於update.zip包的製作有兩種方式,即手動製作和命令生成。
第一種手動製作:即按照update.zip的目錄結構手動建立我們需要的目錄。然後將對應的檔案拷貝到相應的目錄下,比如我們向系統中新加一個應用程式。可以將新增的應用拷貝到我們新建的update/system/app/下(system目錄是事先拷貝編譯原始碼後生成的system目錄),打包並簽名後,拷貝到SD卡就可以使用了。這種方式在實際的tcc8800開發板中未測試成功。簽名部分未通過,可能與具體的開發板相關。
第二種製作方式:命令製作。Android原始碼系統中為我們提供了製作update.zip刷機包的命令,即make otapackage。該命令在編譯原始碼完成後並在原始碼根目錄下執行。 具體操作方式:在原始碼根目錄下執行
①$ . build/envsetup.sh。
②$ lunch 然後選擇你需要的配置(如17)。
③$ make otapackage。
在編譯完原始碼後最好再執行一遍上面的①、②步防止執行③時出現未找到對應規則的錯誤提示。命令執行完成後生成的升級包所在位置在out/target/product/full_tcc8800_evm_target_files-eng.mumu.20120309.111059.zip將這個包重新命名為update.zip,並拷貝到SD卡中即可使用。
這種方式(即完全升級)在tcc8800開發板中已測試成功。
2) 使用make otapackage命令生成update.zip的過程分析。在原始碼根目錄下執行make otapackage命令生成update.zip包主要分為兩步,第一步是根據Makefile執行編譯生成一個update原包(zip格式)。第二步是執行一個python指令碼,並以上一步準備的zip包作為輸入,最終生成我們需要的升級包。下面進一步分析這兩個過程。
第一步:編譯Makefile。對應的Makefile檔案所在位置:build/core/Makefile。從該檔案的884行(tcc8800,gingerbread0919)開始會生成一個zip包,這個包最後會用來製作OTA package 或者filesystem image。先將這部分的對應的Makefile貼出來如下:
|