updates - 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 不适合验证工具。
所以我希望有人能指出正确的方向来正确生成元数据或告诉我如何正确使用该工具。
解决方案
原来 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
推荐阅读
- javascript - 动态展平嵌套的对象数组javascript
- ios - 如何登录用户扔 Facebook 并将用户数据保存在 Cloud Firestore 中
- php - PHP数组过滤并根据过滤数组的结果创建新数组
- oracle - 将 PostgreSQL 函数转换为 PostgreSQL 存储过程
- c# - `DataTable` 不包含 'Fill' 的定义 - c#
- r - R脚本根据特定列中的值拆分由字符串和数字组成的行
- java - Java中的日期排序
- c# - File.AppendAllText 抛出 FileNotFoundException
- python - Pygame 将文本与另一个文本交换
- codeigniter - 在codeigniter中将结果打印为数组,如1,2,3