Android OTA

一、OTA运行原理

Android 平台提供 Google diff arithmetic 差分机制,升级包支持完整升级以及差分升级,OTA 运行原理图如下所示。

1. OTA Server 负责对更新包进行上传,下载以及版本的管理。

2. 开发者在修改 Android 系统后,通过差分制作工具制作出差分包,并使用客户端进行更新包上传和版本管理。

3. 设备通过 wifi 网络进行连接和下载,最后完成更新工作。

二、非安全固件 OTA 升级方法

1、生成初始镜像与旧包

(1)正常编译 SDK,pack 命令打包 img(在 longan out 目录)

(2)执行 pack4dist 生成 target_file(在 out 目录)

(3)烧镜像到机器

(4)把 target_file 重命名成 old_target_files.zip,放到 SDK 根目录下

2、生成新镜像与 OTA 包

(1)正常编译 SDK,pack 命令打包 img(在 longan out 目录)

(2)执行 pack4dist 生成完整包 full-ota 包,差分包 inc-ota(在 out 目录)

(3)adb push xxx_full_ota.zip /sdcard/update.zip

(4)adb shell chmod 777 /sdcard/update.zip

(5)打开 Local Update 应用 -> OTA System Update -> 选择 update.zip 包升级

三、升级问题

Update应用显示在升级到20%的时候,OTA升级失败

OTA时通过logcat获取升级的相关日志信息

locat|grep update_engine

日志信息如下: 

03-11 11:18:26.803   422   422 I update_engine: [INFO:delta_performer.cc(113)] Completed 0/? operations, 16384/931308852 bytes downloaded (0%), overall progress 0%
03-11 11:18:26.810   422   422 I update_engine: [INFO:delta_performer.cc(344)] Manifest size in payload matches expected value from Omaha
03-11 11:18:26.814   422   422 I update_engine: [INFO:delta_performer.cc(884)] Verifying using certificates: /system/etc/security/otacerts.zip
03-11 11:18:26.824   422   422 I update_engine: [INFO:payload_verifier.cc(102)] signature blob size = 267
03-11 11:18:26.827   422   422 I update_engine: [INFO:payload_verifier.cc(118)] Truncating the signature to its unpadded size: 256.
03-11 11:18:26.840   422   422 I update_engine: [INFO:payload_verifier.cc(191)] Failed to verify the signature with 1 keys.
03-11 11:18:26.845   422   422 E update_engine: [ERROR:payload_verifier.cc(137)] None of the 1 signatures is correct. Expected hash before padding:
03-11 11:18:26.849   422   422 I update_engine: [INFO:utils.cc(414)] Logging array of length: 32
03-11 11:18:26.851   422   422 I update_engine: [INFO:utils.cc(431)] 0x00000000 : ca d3 dc 62 f8 d6 09 8a c1 99 dc e8 46 b8 5a 7d
03-11 11:18:26.856   422   422 I update_engine: [INFO:utils.cc(431)] 0x00000010 : 62 47 c5 ab 28 64 b1 56 81 8f c0 e0 d9 2b f6 e0
03-11 11:18:26.859   422   422 E update_engine: [ERROR:payload_verifier.cc(140)] But found RSA decrypted hashes:
03-11 11:18:26.863   422   422 I update_engine: [INFO:utils.cc(414)] Logging array of length: 256
03-11 11:18:26.867   422   422 I update_engine: [INFO:utils.cc(431)] 0x00000000 : 2e d3 37 87 ae bd b3 7d 5f fc 7c b2 de 46 d4 6e
03-11 11:18:26.869   422   422 I update_engine: [INFO:utils.cc(431)] 0x00000010 : 55 33 cd d7 cc e9 12 2a 6d 5a 6c 82 0a 12 60 28
03-11 11:18:26.872   422   422 I update_engine: [INFO:utils.cc(431)] 0x00000020 : 31 1f bb ae 29 e0 72 19 d9 f4 29 4a 69 55 4b c2
03-11 11:18:26.874   422   422 I update_engine: [INFO:utils.cc(431)] 0x00000030 : 7a a6 cd 04 63 15 02 64 40 9f a7 3a 67 a9 5f 69
03-11 11:18:26.877   422   422 I update_engine: [INFO:utils.cc(431)] 0x00000040 : 86 db cf ca 19 1f 67 43 7d 21 9f e1 a0 a4 e4 9f
03-11 11:18:26.880   422   422 I update_engine: [INFO:utils.cc(431)] 0x00000050 : c4 b9 7e 13 68 8c f2 a8 40 1e 6d 56 ab ec cf 61
03-11 11:18:26.883   422   422 I update_engine: [INFO:utils.cc(431)] 0x00000060 : 2e 67 f9 3c 76 a9 e7 b2 ee 54 fa e7 00 ed 59 1d
03-11 11:18:26.886   422   422 I update_engine: [INFO:utils.cc(431)] 0x00000070 : 6c ad 8c 27 9d 57 1f d9 f5 79 ff 89 13 dd ac c9
03-11 11:18:26.889   422   422 I update_engine: [INFO:utils.cc(431)] 0x00000080 : 3a 3b 93 3c 37 93 20 b4 4d 37 5f 5e ff a6 31 c6
03-11 11:18:26.893   422   422 I update_engine: [INFO:utils.cc(431)] 0x00000090 : aa b7 5b 1b a6 29 e3 d4 7b 06 84 60 3d 0e 80 68
03-11 11:18:26.895   422   422 I update_engine: [INFO:utils.cc(431)] 0x000000a0 : 14 0e 5a a2 3a fb 21 ef 42 26 ea fc 17 69 64 b3
03-11 11:18:26.898   422   422 I update_engine: [INFO:utils.cc(431)] 0x000000b0 : e1 16 63 36 7a 95 c3 4c fc fd 81 57 8a 33 c2 97
03-11 11:18:26.900   422   422 I update_engine: [INFO:utils.cc(431)] 0x000000c0 : 69 6c 44 d0 f6 fe b2 81 d2 d0 c3 fd c6 1c 5a f9
03-11 11:18:26.902   422   422 I update_engine: [INFO:utils.cc(431)] 0x000000d0 : 6e c7 b5 2c e2 fb bc db 83 34 4a f8 ba e7 90 e9
03-11 11:18:26.905   422   422 I update_engine: [INFO:utils.cc(431)] 0x000000e0 : f3 aa 5a b5 02 e3 0d 3d 3d ee ab 8e 8e 9d c9 2d
03-11 11:18:26.910   422   422 I update_engine: [INFO:utils.cc(431)] 0x000000f0 : 1f 60 69 1b a4 90 fe 69 31 d6 31 5f 22 b2 4f fb
03-11 11:18:26.913   422   422 E update_engine: [ERROR:payload_metadata.cc(214)] Manifest hash verification failed.
03-11 11:18:26.917   422   422 E update_engine: [ERROR:delta_performer.cc(372)] Mandatory metadata signature validation failed

1、问题原因

搜索update_engine,可以发现OTA签名不一致,导致OTA升级失败。固件是非签名的,OTA包是签名的,导致固件和OTA包的签名不匹配,OTA升级失败。

2、解决方案

(1)查看当前机器的固件是否是签名固件。

fingerprint末尾为release‑keys则是签名固件,test‑keys则是非签名固件

getprop | grep fingerprint

release‑keys
签名固件
# getprop |grep fingerprint
[ro.build.fingerprint]: [Allwinner/a523_pro_arm64/a523‑pro:14/UP1A.231105.001.A1/eng.dailyb.20231121.043505:
userdebug/release‑keys]test‑keys
非签名固件
# getprop | grep fingerprint
[ro.build.fingerprint]: [Allwinner/a523_pro_arm64/a523‑pro:13/TQ2A.230405.003.B2/eng.20231117.112010:userdebug/
test‑keys

根据命令输出结果可以得知我们当前机器的固件为非签名固件

getprop |grep fingerprint
[ro.product.build.fingerprint]: [Allwinner/t527_sany_v7_arm64/t527-sany_v7:13/TQ2A.230405.003.B2/xiath03111103:userdebug/test-keys]
[ro.system.build.fingerprint]: [Allwinner/t527_sany_v7_arm64/t527-sany_v7:13/TQ2A.230405.003.B2/xiath03111103:userdebug/test-keys]
[ro.system_dlkm.build.fingerprint]: [Allwinner/t527_sany_v7_arm64/t527-sany_v7:13/TQ2A.230405.003.B2/xiath03111103:userdebug/test-keys]
[ro.system_ext.build.fingerprint]: [Allwinner/t527_sany_v7_arm64/t527-sany_v7:13/TQ2A.230405.003.B2/xiath03111103:userdebug/test-keys]
[ro.vendor.build.fingerprint]: [Allwinner/t527_sany_v7_arm64/t527-sany_v7:13/TQ2A.230405.003.B2/xiath04251013:userdebug/test-keys]
[ro.vendor_dlkm.build.fingerprint]: [Allwinner/t527_sany_v7_arm64/t527-sany_v7:13/TQ2A.230405.003.B2/xiath03111103:userdebug/test-keys]

(2)获取不带签名的OTA包

1、pack4dist命令是判断sdk中 vendor/security/app_keys目录是否存在,然后去生成签名的OTA包。

2、Android 11及以上版本,vendor/security/app_keys目录是默认存在的,所以pack4dist命令生成的OTA包都是默认带签名的。

3、如果不想生成签名的OTA包,可以删掉vendor/security/app_keys目录

删掉vendor/security/app_keys目录得到不带签名的OTA包,重新编译后测试

编译内核:

cd longan./build.sh config (根据实际情况选择对应平台)

编译Android

cd ..source ./build/envsetup.shlunch xxxmake

打包

pack

生成OTA包

pack4dist

四、OTA

重新编译后正常

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/79377.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Untiy基础学习(三)Untiy中编写脚本的基本规则

一、怎么创建脚本 在Project窗口下,右键Create C#Script 即可创建脚本 创建脚本的注意事项 : 1)类名和文件名必须一致,不然不能挂载(因为反射机制创建对象,会通过文件名去找Type) 2)没有特殊需…

VBA宏即根据第一列的内容和第二列的数字,按照数字数量生成对应内容并依次放在第三列、第四列等

打开你的 Excel 工作表。按下 Alt F11 组合键,打开 VBA 编辑器。在 VBA 编辑器中,点击 插入 -> 模块。在模块窗口中,输入以下 VBA 代码: Sub GenerateItems()Dim lastRow As LongDim i As Long, j As LongDim item As String…

深度学习系统学习系列【1】之基本知识

文章目录 说明基础知识人工智能、机器学习、深度学习的关系机器学习传统机器学习的缺陷选择深度学习的原因深度学习的关键问题深度学习的应用深度学习的加速硬件GPU环境搭建主流深度学习框架对比 说明 文章属于个人学习笔记内容,仅供学习和交流。内容参考深度学习原…

论文笔记-基于多层感知器(MLP)的多变量桥式起重机自适应安全制动与距离预测

《IET Cyber-Systems and Robotics》出版山东大学 Tenglong Zhang 和 Guoliang Liu 团队的研究成果,文章题为“Adaptive Safe Braking and Distance Prediction for Overhead Cranes With Multivariation Using MLP”。 摘要 桥式起重机的紧急制动及其制动距离预测是…

DeepSeek实战--各版本对比

1.对比 版本参数量优势劣势使用场景竞品DeepSeek-V36710亿(MoE架构,激活370亿)开源、高效推理(60 TPS)、低成本(API费用低)、中文处理能力突出(90%准确率多模态能力有限通用任务&am…

从0开始建立Github个人博客(hugoPaperMod)

从0开始建立Github个人博客(hugo&PaperMod) github提供给每个用户一个网址,用户可以建立自己的静态网站。 一、Hugo hugo是一个快速搭建网站的工具,由go语言编写。 1.安装hugo 到hugo的github标签页Tags gohugoio/hugo选择一个版本&#xff0c…

【AI论文】WebThinker:赋予大型推理模型深度研究能力

摘要:大型推理模型(LRMs),如OpenAI-o1和DeepSeek-R1,展示了令人印象深刻的长期推理能力。 然而,他们对静态内部知识的依赖限制了他们在复杂的知识密集型任务上的表现,并阻碍了他们生成需要综合各…

Linux_sudo命令的使用与机制

1、sudo命令的作用 sudo(全称 superuser do)是 Linux/Unix 系统中权限管理的核心工具。 允许普通用户在授权下以其他用户(默认是 root)的权限执行命令,而无需直接登录账户。 2、sudo命令的典型使用场景 sudo 覆盖了系…

Scrapy框架之 中间件的使用

爬虫中间件 特点:主要处理蜘蛛(Spider)和下载器(Downloader)之间的请求和响应。可以对蜘蛛生成的请求进行拦截、修改或过滤,也可以对下载器返回给蜘蛛的响应进行处理。适用场景: 请求过滤与修改…

供应链算法整理(一)--- 销量预估

在供应链管理领域有较多的预估场景,例如送达时长预估、销量预估、用电量预估。特别的在智能供应链领域,销量和库存的管理的智能化也依赖销量预估,因此在本文我们整理了 销量预估的算法详细的技术方案。 时间序列预测在最近两年内发生了巨大的…

第4篇:服务层抽象与复用逻辑

在业务系统复杂度指数级增长的今天,服务层(Service Layer)的合理设计直接影响着系统的可维护性和扩展性。本文将深入剖析 Egg.js 框架中的服务层架构设计,从基础实现到高级封装,全方位讲解企业级应用的开发实践。 一、…

Java学习手册:Spring 数据访问

一、Spring JDBC JdbcTemplate :Spring JDBC 提供了 JdbcTemplate 类,它简化了数据库操作,提供了丰富的 API 来执行数据库访问任务。JdbcTemplate 可以自动处理数据库连接的获取、释放,SQL 语句的执行,结果集的处理等…

递归、搜索和回溯算法《递归》

在之前的优选算法当中我们已经学习了一些基本的算法,那么接下来我们就要来学习算法当中的一大重要章节——递归、搜索和回溯算法,其实也就是大家常常听到的dfs、bfs;其实本质就是递归,在学习搜索、回溯等算法的过程当中我们会先来…

Java进阶--设计模式

设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样&#xff0…

如何禁止AutoCAD这类软件联网

推荐二、三方法,对其他软件影响最小 一、修改Hosts文件 Hosts文件是一个存储域名与IP地址映射关系的文本文件,通过修改Hosts文件可以将AutoCAD的域名指向本地回环地址(127.0.0.1),从而实现禁止联网的目的。具体步骤如…

深度学习框架搭建(Vscode/Anaconda/CUDA/Pytroch)

目录 ​​​​​​一 Vscode安装 二、Anaconda安装 三、更新显卡驱动 四、安装CUDA 五、安装Pytorch 六、Vscode配置 七、出现的问题汇总 ​​​​​​一 Vscode安装 在 Windows 上安装 访问 VS Code 官网 https://code.visualstudio.com/,点击 "Downl…

结构模式识别理论与方法

我们在前文《模式识别的基本概念与理论体系》中就已经提及“模式分类”。 具体内容看我的CSDN文章:模式识别的基本概念与理论体系-CSDN博客 模式的识别方法主要有统计模式识别方法和结构模式识别方法两大类。统计模式识别方法提出得较早,理论也较成熟…

12.多边形的三角剖分 (Triangulation) : Fisk‘s proof

目录 1.Fisks proof Trangulation Coloring Domination Pigeon-Hold Principle Generation 2.Orthogonal Polygons (正交多边形) Necessity of floor(n4) Sufficiency by convex Quadrilateralization Generalization 1.Fisks proof Trangulation 引入内对角线&…

面经-计算机网络——OSI七层模型与TCP/IP四层模型的对比详解

OSI七层模型与TCP/IP四层模型的对比详解 一、图示解析:分层封装结构 你提供的图清晰展示了网络通信中从应用层到物理层的封装过程,每一层都会对上层的数据加上自己的头部信息(Header): 应用层: 应用…

React Native本地存储方案总结

1. AsyncStorage(键值对存储) 适用场景:简单键值对存储(如用户配置、Token、缓存数据)。特点:异步、轻量、API 简单,但性能一般,不推荐存储大量数据。安装:npm install …