WriteIncrementalOTAPackage制作OTA包流程

def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip):
  target_has_recovery_patch = HasRecoveryPatch(target_zip)  //檢查目標(biāo)文件包是否存在SYSTEM/recovery-from-boot.p
  source_has_recovery_patch = HasRecoveryPatch(source_zip)  //檢查源文件包是否存在SYSTEM/recovery-from-boot.p

  if (OPTIONS.block_based and
      target_has_recovery_patch and
      source_has_recovery_patch):
    //如果傳入?yún)?shù)指定了使用塊模式制作OTA,則調(diào)用WriteBlockIncrementalOTAPackage進(jìn)行制作
    return WriteBlockIncrementalOTAPackage(target_zip, source_zip, output_zip)

  //獲取源文件包和目標(biāo)文件包的recovery_api_version
  source_version = OPTIONS.source_info_dict["recovery_api_version"]
  target_version = OPTIONS.target_info_dict["recovery_api_version"]

  //如果source_version等于0陕习,則生成一個(gè)不能進(jìn)行安裝的updater-script腳本蹲盘,這個(gè)腳本是由edify_generator模塊生成的
  if source_version == 0:
    print ("WARNING: generating edify script for a source that "
           "can't install it.")
  script = edify_generator.EdifyGenerator(
      source_version, OPTIONS.target_info_dict,
      fstab=OPTIONS.source_info_dict["fstab"])

  oem_props = OPTIONS.info_dict.get("oem_fingerprint_properties")
  recovery_mount_options = OPTIONS.source_info_dict.get(
      "recovery_mount_options")
  oem_dict = None
  if oem_props is not None and len(oem_props) > 0:
    if OPTIONS.oem_source is None:
      raise common.ExternalError("OEM source required for this build")
    script.Mount("/oem", recovery_mount_options)
    oem_dict = common.LoadDictionaryFromLines(
        open(OPTIONS.oem_source).readlines())
  //創(chuàng)建一個(gè)元數(shù)據(jù)字典來存儲一些相關(guān)的值
  metadata = {
      "pre-device": GetOemProperty("ro.product.device", oem_props, oem_dict,
                                   OPTIONS.source_info_dict),
      "post-timestamp": GetBuildProp("ro.build.date.utc",
                                     OPTIONS.target_info_dict),
  }
  初始化device_specific
  device_specific = common.DeviceSpecificParams(
      source_zip=source_zip,
      source_version=source_version,
      target_zip=target_zip,
      target_version=target_version,
      output_zip=output_zip,
      script=script,
      metadata=metadata,
      info_dict=OPTIONS.source_info_dict)
  //比較system分區(qū)的差異
  system_diff = FileDifference("system", source_zip, target_zip, output_zip)


FileDifference類的初始化函數(shù)

class FileDifference(object):
  def __init__(self, partition, source_zip, target_zip, output_zip):
    self.deferred_patch_list = None
    //讀取目標(biāo)文件包中system分區(qū)的文件沸伏,保存這些文件的信息
    print "Loading target..."
    self.target_data = target_data = LoadPartitionFiles(target_zip, partition)
    //讀取源文件包中system分區(qū)的文件,保存這些文件的信息
    print "Loading source..."
    self.source_data = source_data = LoadPartitionFiles(source_zip, partition)

    self.verbatim_targets = verbatim_targets = []
    self.patch_list = patch_list = []
    diffs = []
    self.renames = renames = {}
    known_paths = set()
    largest_source_size = 0

    matching_file_cache = {}
    for fn, sf in source_data.items():
      assert fn == sf.name
      matching_file_cache["path:" + fn] = sf
      if fn in target_data.keys():
        AddToKnownPaths(fn, known_paths)
      # Only allow eligibility for filename/sha matching
      # if there isn't a perfect path match.
      if target_data.get(sf.name) is None:
        matching_file_cache["file:" + fn.split("/")[-1]] = sf
        matching_file_cache["sha:" + sf.sha1] = sf
    //比較源文件包和目標(biāo)文件包的路徑結(jié)構(gòu)援岩,找出經(jīng)過重命名的文件
    for fn in sorted(target_data.keys()):
      tf = target_data[fn]
      assert fn == tf.name
      sf = ClosestFileMatch(tf, matching_file_cache, renames)
      if sf is not None and sf.name != tf.name:
        print "File has moved from " + sf.name + " to " + tf.name
        renames[sf.name] = tf

      if sf is None or fn in OPTIONS.require_verbatim:
        # This file should be included verbatim
        if fn in OPTIONS.prohibit_verbatim:
          raise common.ExternalError("\"%s\" must be sent verbatim" % (fn,))
        print "send", fn, "verbatim"
        tf.AddToZip(output_zip)
        verbatim_targets.append((fn, tf.size, tf.sha1))
        if fn in target_data.keys():
          AddToKnownPaths(fn, known_paths)
      elif tf.sha1 != sf.sha1:
        # File is different; consider sending as a patch
        diffs.append(common.Difference(tf, sf))      //將需要比較差異的文件保存起來
      else:
        # Target file data identical to source (may still be renamed)
        pass

    common.ComputeDifferences(diffs)

    for diff in diffs:
      tf, sf, d = diff.GetPatch()
      path = "/".join(tf.name.split("/")[:-1])
      if d is None or len(d) > tf.size * OPTIONS.patch_threshold or \
          path not in known_paths:
        # patch is almost as big as the file; don't bother patching
        # or a patch + rename cannot take place due to the target
        # directory not existing
        tf.AddToZip(output_zip)
        verbatim_targets.append((tf.name, tf.size, tf.sha1))
        if sf.name in renames:
          del renames[sf.name]
        AddToKnownPaths(tf.name, known_paths)
      else:
        common.ZipWriteStr(output_zip, "patch/" + sf.name + ".p", d)
        patch_list.append((tf, sf, tf.size, common.sha1(d).hexdigest()))
        largest_source_size = max(largest_source_size, sf.size)

    self.largest_source_size = largest_source_size
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末逗概,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子朋截,更是在濱河造成了極大的恐慌,老刑警劉巖吧黄,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件部服,死亡現(xiàn)場離奇詭異,居然都是意外死亡拗慨,警方通過查閱死者的電腦和手機(jī)廓八,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胆描,“玉大人,你說我怎么就攤上這事仗阅〔玻” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵减噪,是天一觀的道長短绸。 經(jīng)常有香客問我,道長筹裕,這世上最難降的妖魔是什么醋闭? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮朝卒,結(jié)果婚禮上证逻,老公的妹妹穿的比我還像新娘。我一直安慰自己抗斤,他們只是感情好囚企,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著瑞眼,像睡著了一般龙宏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上伤疙,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天银酗,我揣著相機(jī)與錄音,去河邊找鬼。 笑死黍特,一個(gè)胖子當(dāng)著我的面吹牛蛙讥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播衅澈,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼键菱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了今布?” 一聲冷哼從身側(cè)響起经备,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎部默,沒想到半個(gè)月后侵蒙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡傅蹂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年纷闺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片份蝴。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡犁功,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出婚夫,到底是詐尸還是另有隱情浸卦,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布案糙,位于F島的核電站限嫌,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏时捌。R本人自食惡果不足惜怒医,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望奢讨。 院中可真熱鬧稚叹,春花似錦、人聲如沸拿诸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽佳镜。三九已至僚稿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蟀伸,已是汗流浹背蚀同。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工缅刽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蠢络。 一個(gè)月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓衰猛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親刹孔。 傳聞我的和親對象是個(gè)殘疾皇子啡省,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 初始化(Initilization)是設(shè)置類型的實(shí)例的操作。它為每個(gè)存儲屬性給定了一個(gè)初始值, 并且可能會牽涉其它...
    焉知非魚閱讀 3,193評論 0 1
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,519評論 1 51
  • 123.繼承 一個(gè)類可以從另外一個(gè)類繼承方法,屬性和其他特征髓霞。當(dāng)一個(gè)類繼承另外一個(gè)類時(shí), 繼承類叫子類, 被繼承的...
    無灃閱讀 1,395評論 2 4
  • C++文件 例:從文件income. in中讀入收入直到文件結(jié)束卦睹,并將收入和稅金輸出到文件tax. out。 檢查...
    SeanC52111閱讀 2,789評論 0 3
  • 初始化(Initialization) 初始化是類方库、結(jié)構(gòu)體结序、枚舉類型的準(zhǔn)備過程。這個(gè)過程涉及到所有存儲屬性的初始化...
    泗哥閱讀 5,635評論 0 3