代码之家  ›  专栏  ›  技术社区  ›  Dennis

AOSP如何通过元数据验证OTA更新

  •  0
  • Dennis  · 技术社区  · 5 年前

    我正在为我的定制Android 10构建一个OTA更新,如下所示:

    ./build/make/tools/releasetools/ota_from_target_files \
      --output_metadata_path metadata.txt \
      target-files.zip \
      ota.zip
    

    update_engine_client --payload=file:///<wherever>/paypload.bin \
       --update \
       --headers=<Contents of payload_properties.txt>
    

    所有这些都可以工作,因此我非常确定从这个结果来看,我已经正确地创建了OTA,但是,我希望能够下载元数据,并在让客户端下载整个负载之前验证负载是否可以应用。

    update_engine_client --verify --metadata=<path to metadata.txt from above>
    

    这就是我没能达到预期效果的地方。我得到一个错误,说它无法解析有效负载头。它失败了 kDownloadInvalidMetadataMagicString 当我读取源代码时,它似乎是元数据的前4个字节。显然元数据.txt我创建的不是正确的验证工具。

    0 回复  |  直到 5 年前
        1
  •  0
  •   Dennis    5 年前

    原来ota工具生成的元数据是人类可读的格式。verify方法需要一个二进制文件。该文件不是作为唯一文件的zip内容的一部分。相反,它是在有效载荷.bin. 所以有效载荷.bin实际上是有效载荷_元数据.bin,这些字节将与update\u engine\u client的verify方法一起正确工作,以确定有效负载是否适用。

    我正在提取有效载荷_元数据.bin在makefile中,如下所示:

    $(DEST)/%.meta: $(DEST)/%.zip
        unzip $< -d /tmp META-INF/com/android/metadata 
        python -c 'import re; meta=open("/tmp/META-INF/com/android/metadata").read(); \
                  m=re.match(".*payload_metadata.bin:([0-9]*):([0-9]*)", meta); \
                  s=int(m.groups()[0]); l=int(m.groups()[1]); \
                  z=open("$<","rb").read(); \
                  open("$@","wb").write(z[s:s+l])'
        rm -rf /tmp/META-INF