android OTA 公升級包含增量公升級

2021-06-22 16:45:12 字數 3737 閱讀 6012

**:

ota 

全稱over the air ,

ota 

公升級是android 

系統提供的標準軟體公升級方式。

它功能強大,提供了完全公升級、增量公升級模式,可以通過

sd 卡公升級,也可以通過

網路公升級。

這裡,首先介紹sd卡公升級,網路公升級原理和sd卡大致一樣.下面我們將介紹這一過程.

在公升級前,我們要準備公升級包,所有編譯好的包都命名為update.zip

,不管是增量公升級還

是完全公升級.

./mk prj new

./mk prj otapackage

編譯完成之後,將在\out\target\product\prj\目錄下生成

prj-ota-eng.root.zip,這個

zip將是我們公升級用的包,我們要把他改名為update.zip ,然後copy

到sd卡的根目錄下.

在執行上面指令的過程中,同時會在

out\target\product\prj\obj\packaging\target_files_intermediates\

目錄下生成

prj-target_files-eng.root.zip

這個檔案非常重要,我們將他儲存為old.zip

它是我們做增量包的基礎檔案.

當**有更新時,我們更新新的**.同樣執行./mk prj otapackage

產生**更改後的完全公升級包.

這時同樣會在out\target\product\prj\obj\packaging\target_files_intermediates\

目錄下生成

prj-target_files-eng.root.zip

我們把它重新命名為new.zip,接下來我們完成生成增量包的最後一步.

執行./build/tools/releasetools/ota_from_target_files-i

old.zip new.zip diff.zip ,產生new.zip

到old.zip

的增量包diff.zip ,同樣我們要把它命名為update.zip ,可以copy

到sd卡的更目錄下,做增量

式公升級使用.

(備註:如果公升級有特殊的要求,比如格式化data

分割槽,更新uboot等分割槽,需要修改ota_from_target_files.py

這個指令碼)

上面的內容介紹了如何準備update.zip 公升級檔案.接下來介紹公升級過程.先說一下正常開機過程,

按power

鍵開機,uboot 在執行完之後,將把boot

分割槽的內容boot.img 檔案載入到記憶體,然後跳轉到boot中

linux核心的開始位置,執行linux

核心**,在核心的最後執行正常啟動時的init.rc 

檔案,掛載system分割槽

到/system

目錄下,掛載data 分割槽到/data

目錄下.啟動虛擬機器等相關的一下服務.

要公升級程式

,開機的時候,需要按住power

和下vol 鍵,這樣uboot

在執行完之後將載入recovery分割槽

的recovery.img

檔案到記憶體.現在我們看一下,recovery.img 

這個映象裡面有什麼內容.詳細的內容我們

可以檢視build/core/makefile

檔案,在這個檔案裡面我們查詢 recovery image ,從這裡開始的內容,主要

是打包recovery.img

的內容.關於recovery.img的具體內容,說的簡單點,就是linux

核心和將\out\target\

product\prj\recovery目錄打包成ramdisk

的乙個映象的集合.對比正常開機的boot.img映象,區別為boot.img

裡面的ramdisk映象是out\target\product\prj\root

打包來的.其核心檔案是同乙個檔案. recovery.img

映象裡面的ramdisk

檔案系統包含的用於資料公升級相關的bin檔案,比如gzip,recovery

等重要的程式.

在機器載入recovery.img ,執行完核心後,執行recovery

模式下的init.rc 該檔案在bootable\recovery\etc\

目錄下,我們拿它和正常開機的init.rc

檔案相比.發現recovery 模式的init.rc

僅僅新建了幾個目錄,包括sdcard,

用於sd卡的掛載點.啟動了2個service,乙個ueventd,乙個recovery的主選單程式recovery(該檔案是bootable\recovery\recovery.c

程式設計而成),內容非常簡單.在recovery

的主介面,選擇更新程式後,recovery將會

解壓update.zip

檔案,執行其中的\meta-inf\com\google\android\updater-script ,recovery會對指令碼進行解析.

下面是這個指令碼的部分摘錄.

show_progress(0.500000, 0);

format("yaffs2", "mtd", "system");

mount("yaffs2", "mtd", "system", "/system");

package_extract_dir("recovery", "/system");

package_extract_dir("system", "/system");

symlink("toolbox", "/system/bin/cat", "/system/bin/chmod",

"/system/bin/chown", "/system/bin/cmp", "/system/bin/date",

.......

"/system/bin/wipe");

set_perm_recursive(0, 0, 0755, 0644, "/system");

........

show_progress(0.200000, 10);

assert(package_extract_file("boot.img", "/tmp/boot.img"),

write_raw_image("/tmp/boot.img", "boot"),

delete("/tmp/boot.img"));

show_progress(0.100000, 0);

unmount("/system"); (

以上指令碼為系統自動生成)

從指令碼可以看到,首先格式化system區分,然後把updata.zip

裡面的system目錄的內容解壓到system 

分割槽.接著修改system分割槽下檔案的許可權.最後將boot.img

映象寫回到boot 分割槽.

從以上的介紹,可以看到android

的功能非常強大,在recovery 模式下,linux

已經已經完全跑

了起來.除了apk,jar

不能執行之外,你可以做任何你想做的事情.上面的例子中,更新了system分割槽

和boot分割槽,如果需要還可以更新uboot分割槽,logo分割槽,格式化data

分割槽等等.

關於ota的網路實現,實際上是檢查網路上的更新,或者網路通知更新.把更新包(update.zip)

遮蔽android ota公升級包時間戳比較

我們在recovery公升級的時候,經常提示這樣的錯誤 installing update.can t install this package tue jun 27 12 29 30 cst 2017 over newer build mon jun 26 17 20 32 cst 2017 e ...

Ubuntu常用公升級包

在ubuntu上用公升級的方法可以迅速地安裝gcc sudo apt get install g 輸入管理員密碼後,就可以安裝g 了 安裝完成後,執行 gcc v 可以看到安裝的gcc的版本號。同樣地安裝mysql sudo apt get install mysql server sudo apt...

pip 批量公升級包

pip 可以使用如下指令檢視並公升級舊版本包 列出所有的舊版本包 pip list outdated 公升級指定的包 pip install upgrade somepackge然而pip install upgrade somepackge只能公升級乙個包,無法批量操作。實際上,可以借助pip r...