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

问题描述 投票:0回答:2

我正在为我的自定义 Android 10 版本构建 OTA 更新,如下所示:

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

可以根据 update_engine_client 的 android 文档,通过提取 Payload.bin 和 Payload_properties.txt 来应用生成的 ota.zip。

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

这一切都有效,所以我从这个结果中非常确定我已经正确创建了 OTA,但是,我希望能够下载元数据并验证有效负载是否可以应用,然后再让客户端下载整个内容有效负载。

查看 update_engine_client --help 选项,似乎可以按如下方式验证元数据:

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

这就是我未能达到预期结果的地方。 我收到一条错误消息,表示无法解析有效负载标头。 它失败了,当我阅读源代码时,

kDownloadInvalidMetadataMagicString
似乎是元数据的前 4 个字节。 显然我创建的metadata.txt不适合验证工具。

因此,我希望有人能够为我指明正确的方向,以正确生成元数据或告诉我如何正确使用该工具。

updates android-source ota
2个回答
2
投票

原来 ota 工具生成的元数据是人类可读的格式。 verify 方法需要一个二进制文件。该文件不是作为唯一文件的 zip 内容的一部分。相反,它被添加到payload.bin 的前面。 所以payload.bin的第一个字节实际上是payload_metadata.bin,这些字节将与update_engine_client的verify方法正确配合来确定payload是否适用。

我正在将 Payload_metadata.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


0
投票
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.