Android9超过2G升级包无法升级问题排查与解决方案

当Android9系统的升级包超过2G时,升级失败,原因是update_engine解析出的payload.bin偏移量错误。问题源于metadata中偏移量与实际压缩包偏移量不符,主要是由于文件大小判断导致的zip64格式计算差异。解决方案包括直接修正偏移量计算公式或移植AOSP官方修复代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

Android9系统,当升级包大小超过2G的时候,升级失败。

原因分析

update_engine报错

04-27 11:09:50.511 2293 2293 E update_engine:[0427/110950.511596:ERROR:payload_metadata.cc(74)] Bad payload format -- invalid delta magic.
04-27 11:09:50.511 2293 2293 E update_engine:[0427/110950.511679:ERROR:download_action.cc(337)] Error ErrorCode::kDownloadInvalidMetadataMagicString (21) in DeltaPerformet's Write method when processing the received payload -- Terminating processing

通过日志可以看出update_engine报错错误码kDownloadInvalidMetadataMagicString(21),通过查阅update_engine源码得知,在update_engine中是因为解析出来的payload.bin前面的元数据不是’CrAU’(Android源码定义的就是CrAU)导致;

升级包偏移量

通过参考资料得知:

  • .zip文件的文件格式中,会在生成一定的头部信息,然后内部的文件会按一定规则顺序排列在后面;
  • 压缩包内容中,头部有30个字节是固定的,然后后面就到文件名(可变长度)、拓展区(可变长度),这些加起来就是头部内容的长度。

参考: Android A/B System OTA分析(六)如何获取 payload 的 offset 和 size_packageoffset size_洛奇看世界的博客-CSDN博客

metadata数据中的偏移量与升级包实际的偏移量对不上,这个偏移量其实指的是压缩包内文件数据(payload.bin)在文件(升级包)中的偏移量。系统打包的时候会将这个偏移量解析出来写在metadata中,而update_engine会根据metadata文件中定义的这个偏移量提取payload.bin,并判断payload.bin的前4个字节是不是’CrAU’,如果提取出来的payload.bin的前4个字节与’CrAU’不匹配,则证明偏移量错误,导致提取的payload.bin文件不正确;

既然得知这原理,后面主要是看针对一个问题:

一个问题:为什么metadata中的偏移量和实际压缩包的偏移量对应不上? --> metadata的偏移量是如何生成的?

metadata的偏移量是如何生成?

从打包的python脚本ota_from_target_files.py入手,具体的排查过程不赘述。

最终排查到这个偏移量的计算有两处:其中一处是用于解析偏移量,一处是用来做重新计算校验的(因为解析之后经过了一些签名之类的处理,所以重新校验)。这里能校验过,是因为解析和校验用的接口和公式是一致的。

    payload_offset
### 使用 AutoGPTQ 库量化 Transformer 模型 为了使用 `AutoGPTQ` 对 Transformer 模型进行量化,可以遵循如下方法: 安装所需的依赖包是必要的操作。通过 pip 安装 `auto-gptq` 可以获取最新版本的库。 ```bash pip install auto-gptq ``` 加载预训练模型并应用 GPTQ (General-Purpose Tensor Quantization) 技术来减少模型大小和加速推理过程是一个常见的流程。下面展示了如何利用 `AutoGPTQForCausalLM` 类来进行这一工作[^1]。 ```python from transformers import AutoModelForCausalLM, AutoTokenizer from auto_gptq import AutoGPTQForCausalLM model_name_or_path = "facebook/opt-350m" quantized_model_dir = "./quantized_model" tokenizer = AutoTokenizer.from_pretrained(model_name_or_path) model = AutoModelForCausalLM.from_pretrained(model_name_or_path) # 加载已经量化的模型或者创建一个新的量化器对象用于量化未压缩过的模型 gptq_model = AutoGPTQForCausalLM.from_pretrained(quantized_model_dir, model=model, tokenizer=tokenizer) ``` 对于那些希望进一步优化其部署环境中的模型性能的人来说,`AutoGPTQ` 提供了多种配置选项来自定义量化参数,比如位宽(bit-width),这有助于平衡精度损失运行效率之间的关系。 #### 注意事项 当处理特定硬件平台上的部署时,建议查阅官方文档以获得最佳实践指导和支持信息。此外,在实际应用场景之前应该充分测试经过量化的模型以确保满足预期的质量标准。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LokiCode

谢谢您买的奶茶

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值