**:
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...