Android5.0的更新包中system.new.dat檔案的打包,system.new.dat

來源:互聯網
上載者:User

Android5.0的更新包中system.new.dat檔案的打包,system.new.dat

Android 5.0開始,ota包採用了一種新的system.img的壓縮方式。對於這種方式,如果是完整地升級,在ota的zip包中放的基本上就是一個ext4格式的image,但是它不是完整的ext4鏡像,而是一個扣除了很多全零資訊的包。如果是針對一個基礎鏡像做差值得到的差量包,也可以用這種方式進行稀疏描述。

這裡主要介紹如何從system的來源目錄產生最後的ota的zip包。對於從ota包中解包得到檔案的方式可以參見我的另一篇博文:Android5.0的更新包中system.new.dat檔案的解包。http://blog.csdn.net/howellzhu/article/details/41967523

 如果想產生一個ota完整包,一般會放置boot、system以及其他一些image,後面的一般跟裝置有關,比如radio,slb等。Boot的產生其實也跟裝置相關,比如有的需要dt(device tree)什麼的。這裡主要介紹一下system的打包:如何產生system.new.dat等檔案。

 

1.      第一步,利用system目錄和file_contexts產生system.img

其實製作system.img非常簡單簡單,請參考另一篇博文:android中system.img的打包過程。

http://blog.csdn.net/howellzhu/article/details/42804191

 

2.利用system.img得到system.new.dat、system.patch.dat和system.transfer.list檔案

這是本文的重點。

這個過程的主要目的是降低ota.zip的大小,將system.img轉換成為稀疏數組描述。

我們先看看android的原始碼工具是如何工作的。

在blockimgdiff.py檔案中,blockimgdiff.py:BlockImageDiff::WriteTransfers()函數中,會將self.transfers中的所有xf寫入transfer.list檔案中。

參見如下的調用棧:

[call stack]build/tootls/releasetools/blockimgdiff.py:BlockImageDiff::ComputePatches&BlockImageDiff::WriteTransfersbuild/tootls/releasetools/blockimgdiff.py:BlockImageDiff::Computebuild/tootls/releasetools/common.py:BlockDifference::__init__build/tootls/releasetools/ota_from_target_files:WriteFullOTAPackagebuild/tootls/releasetools/ota_from_target_files:main()/build/core/Makefile:$(INTERNAL_OTA_PACKAGE_TARGET):$(BUILT_TARGET_FILES_PACKAGE) $(DISTTOOLS)

其實BlockImageDiff的是一個sparse_img.SparseImage對象和一個None對象。

用下面的img2sdat.py指令碼就可以在目前的目錄下產生system.new.dat、system.transfer.list和空的system.patch.dat檔案:

</pre><pre name="code" class="python">#!/usr/bin/env pythonimport sysimport blockimgdiffimport sparse_imgfrom rangelib import *def main(argv):  tgt = sparse_img.SparseImage("system.img");  bif = blockimgdiff.BlockImageDiff(tgt, None)  bif.Compute("system")if __name__ == '__main__':  main(sys.argv[1:])


為了簡化工作,我將上述的一些python指令碼進行打包,形成一個python包檔案:img2sdat.zip,並提供在文章最後提到的mkotazip工具包中。利用該包對system.img的處理就非常簡單了,就是如下的命令:

$ python img2sdat.zip

這樣就會在目前的目錄下產生system.new.dat、system.patch.dat和system.transfer.list檔案。

 

3. 準備升級指令檔和升級執行檔案

升級執行檔案由Android提供,名字是update-binary,需要放在壓縮包中如下目錄:META-INF/com/google/android

為了方便,我已經將該檔案打包在最後提到的壓縮檔中了。

另一個檔案就是自己要編寫修改的updater-script指令檔了,也需要放在壓縮包中和update-binary一個目錄。這裡提供一個hammerhead的參考:

show_progress(0.05, 0);getprop("ro.product.device") =="hammerhead" || abort("This package is for\"hammerhead\" devices; this is a \"" +getprop("ro.product.device") + "\".");show_progress(0.75, 10);block_image_update("/dev/block/platform/msm_sdcc.1/by-name/system",package_extract_file("system.transfer.list"),"system.new.dat", "system.patch.dat");show_progress(0.20, 2);package_extract_file("boot.img","/dev/block/platform/msm_sdcc.1/by-name/boot");

4. 將上面準備的檔案打包產生一個zip檔案。

這一步非常簡單,利用zip、minizip或者7zip等工具都可以實現。為了方便,在mkotazip工具中提供了一個install.sh指令碼,將前面產生的那些檔案放到合適的目錄下,然後打包。該指令碼接受一個參數,即存放ota包的目的目錄。如果不指定,在目前的目錄下建立一個otazip目錄,然後作為目標目錄。

 

5.對該zip檔案進行簽名[可選]

這部分內容就不說了,網上有很多類似的文章。

 

總結一下上面的步驟。

1.      下載博文中提到的工具包mkotazip.zip(參見文章最後)解壓;

2.      利用mkext4_fs工具產生system.img;

3.      利用命令python img2sdat.zip得到system.new.dat等檔案;

4.      修改updater-script檔案;

5.      運行install.sh指令碼,產生ota.zip檔案。

Ok

 

附錄:mkotazip.zip檔案:

mkotazip工具工具中包含的檔案:


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.