system.transfer.list深度解析

system.transfer.list  system.new.dat
很明顯,通過名字我們就知道這兩個文件的作用,system.new.dat爲數據部分,system.transfer.list爲轉換的描述列表,我們可以通過這兩個文件完成升級。

我們打開一個升級包的升級腳本META-INF\com\google\android\updater-script
block_image_update("/dev/block/system", package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat");
調用的是block_image_updater接口,傳入system.transfer.list及system.new.dat文件來實現升級。

block_image_updater的代碼實現在
bootable/recovery/updater/blockimg.cpp中:
void RegisterBlockImageFunctions() {
  RegisterFunction("block_image_verify", BlockImageVerifyFn);
  RegisterFunction("block_image_update", BlockImageUpdateFn);
  RegisterFunction("block_image_recover", BlockImageRecoverFn);
  RegisterFunction("check_first_block", CheckFirstBlockFn);
  RegisterFunction("range_sha1", RangeSha1Fn);
}
想了解具體實現的過程,可以另行深入研究,本文不再探討。

我們來看看system.transfer.list:
3
133943
0
0
new 48,0,32770,32897,32899,33411,65535,65536,65538,98304,98306,98433,98435,98947,131071,131072,131074,163840,163842,163969,163971,164483,195737,196608,196610,229376,229378,229505,229507,230019,235652,262144,262146,294912,294914,295041,295043,327680,327682,360448,360450,393216,393218,425984,425986,458752,458754,491520,491522
zero 70,32770,32897,32899,33411,65535,65536,65538,66050,97792,98304,98306,98433,98435,98947,131071,131072,131074,131586,163328,163840,163842,163969,163971,164483,195737,196608,196610,197122,228864,229376,229378,229505,229507,230019,235652,236164,261632,262144,262146,262658,294400,294912,294914,295041,295043,295555,327168,327680,327682,328194,359936,360448,360450,360962,392704,393216,393218,393730,425472,425984,425986,426498,458240,458752,458754,459266,491008,491520,491522,492034
erase 24,66050,97792,131586,163328,197122,228864,236164,261632,262658,294400,295555,327168,328194,359936,360962,392704,393730,425472,426498,458240,459266,491008,492034,524288


其中:
3 : 爲transfer的版本,目前已經支持從1-4版本
133943:爲總共new的block數量。
0: stash slots沒有使用,所以這裏兩個都是0
0:
new:需要寫入的block塊範圍總數:總共48個範圍,【0-32770】 【32897-32899】【33411-65535】......
zero:需要填充0的block塊範圍總數:總共70個範圍,【32770-32897】 【32899-33411】.......
erase:需要擦除的block塊範圍總數:總共24個範圍,【66050-97792】 【131586-163328】.......


system.transfer.list是由build/tools/releasetools/blockimgdiff.py生成的,我們來驗證下前面幾個參數:
    out.insert(0, "%d\n" % (self.version,))   # format version number
    out.insert(1, "%d\n" % (total,))
    # v3+: the number of stash slots is unused.
    out.insert(2, "0\n")
    out.insert(3, str(max_stashed_blocks) + "\n")

    with open(prefix + ".transfer.list", "wb") as f:
      for i in out:
        f.write(i)
第一行是版本,第二行是total的block數量,由於沒有使用stash,第三行四行爲0。


我們再次驗證下總共寫入的total是否正確。
1.我們先確認block的大小,blockimg.cpp中定義爲4K
static constexpr size_t BLOCKSIZE = 4096;

2.確認升級包中system.new.dat的大小,其值爲548630528
$ ls -l system.new.dat
-rwxr--r-- 1 xxxxxx.xx szsoftware 548630528 Mar 19 16:37 system.new.dat

3.我們再來計算下總共需要寫入的total
total=system.new.dat/block=548630528/4096=133943,剛好即爲寫入的總的total。


我們再來看看這些所有的new zero erase的描述區間
【0-32770】【32770-32897】【32897-32899】...【66050-97792】...【492034-524288】
   new                      zero                     new                      erase                      erase

總共524288個block需要處理
524288*4096=2147483648byte=2048Mb=2G
正好爲我們ext4 system 分區的大小,也就是我們把整個2G的system分區按照4096的大小分割,然後給每個block賦予了new/zero/erase的屬性,然後保存到transfer.list文件,把所有需要new的數據,生成了new.dat文件。

在最新的version=4的版本中,我們發現system.new.dat文件不見了,增加了vendor.new.dat.br文件,並且計算的時候,發現了vendor.new.dat.br文件打大小變小了,原來是最新的版本,加入了壓縮功能,vendor.new.dat.br爲採用壓縮後的block數據部分。

發佈了74 篇原創文章 · 獲贊 49 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章