首页 > 解决方案 > AOSP 如何通过元数据验证 OTA 更新

问题描述

我正在为我的自定义 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 不适合验证工具。

所以我希望有人能指出正确的方向来正确生成元数据或告诉我如何正确使用该工具。

标签: updatesandroid-sourceota

解决方案


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

我在makefile中提取payload_metadata.bin,如下所示:

$(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


推荐阅读