修改GPT的OTA升级方案简介

bin文件如何编辑_如何为高通固件创建rawprogram0和patch0文件 这是一个分步教程,显示如何为Qualcomm固件创建rawprogram0.xml和patch0.xml文件。要求下载并安装Python @ https://www.python.org/downloads/release/python-2710/下载高通GPTtool @ [ 登录/注册免费下载]下载Notepad ++ @ https://notepad-plus-plus.org/downl... 阅读详情

         2023/1/11 补充:

         这个blog提到的三种刷机,还有一种往设备块直接push的方法。push时需要root,有写块设备权限,需注意块的格式,如果是当前用到镜像要注意影响。


        前面几个blog贴了很多网址,虽然也有自己总结的东西,并以刷机角度去总结分析,但是没有新东西终究意义不大,一想到这就感觉该系列博客低了逼格。的确做了不同的工作,而这略为不同的工作,虽然没有专利限制,但也算方案。为增加博客份量,这里就随意介绍下,没有源码,没有截图,只有思想,别人碰到后也自然想到,无技术难点。

         本博客以GPT(分区表)改变情况做升级方案分析,以升级方式划分各节。

         先来看看分区表文件gpt_main0.bin

         没有源码也能看出dtbo_a分区起始地址0x000E1000,结束地址0x000E4FFF。一般GPT的最后分区是userdata,并且分区大小为-1,这样驱动会识别emmc大小并重写GPT,让userdata使用所有剩余空间。同时GPT里面有sectool签名、时间戳信息(如果是AB系统的GPT,还有当前活动分区、正常启动次数等信息)。注意GPT有校验不可直接修改编辑。

目录

1、QFIL升级

2、fastboot 升级

3、OTA升级

3.1、nonAB的OTA升级情况

3.2、AB的OTA升级情况


1、QFIL升级

         提供全部镜像,直接全部擦写,没啥好说。

下面是xml文件label="PrimaryGPT"内容,详细解释可见升级方式QFIL部分。

<program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="gpt_main0.bin" label="PrimaryGPT" num_partition_sectors="34" physical_partition_number="0" size_in_KB="17.0" sparse="false" start_byte_hex="0x0" start_sector="0" />

 NV(MP的数据/无线调试参数)备份:

         方法1,有tool->QCN backup按键。

         方法2,有partition Manager选择modemst1、modemst2、fsg分区read

         方法3,configuration->FireHose configuration->Auto backup Restore QCN (读取后重写入)/Auto preserve(不动这几个分区)

2、fastboot 升级

         fastboot flash partition gpt_both0.bin刷完GPT后,分区信息即时替换,需要立即刷入其它所有镜像,若不刷重启后由于起始位置的改动,无法获取aboot、boot甚至sbl1的信息,设备无法开机,恢复只能靠硬件进入紧急下载。

         假如NV所使用分区起始位置不动,刷写过程中不擦除不重写NV分区,即可保留NV数据。(BC对比如果有略微差异,是由于MP版本有改动)

         假如NV所使用分区起始位置改动,NV无法通过fastboot 读取备份,因为fastboot不支持读分区操作。(个人设想方案,换公司后,没碰到这种需求,目前未实现。fastboot getvar 获取原NV起始地址与大小,aboot实现数据搬移并提供fastboot oem moveNV命令接口,刷写GPT前先获取新GPT的NV起始地址与大小,然后fastboot oem moveNV 原NV地址 新NV地址 大小)

         如上图的分区表改动情况,起始位置、结束位置没动的NV分区,其数据是可以保留的(android N之后版本的高通LK,重写GPT时会擦除整个emmc,关掉这个擦除操作即可)。手绘省时,会意即可。         

        再就是,对于RPMB未绑定设备(注),userdata分区数据可以copy到其它设备继续使用。若要想用户数据尽完整可用,copy前后设备的版本最好一致,提供的userdata使用空间必须大于copy的。为防止用户数据被copy窃取,RPMB未绑定设备应该要求用户设置开机密码。dump全盘加密的userdata无法直接挂载,全盘加密/文件级加密相关可以访问linux的全盘加密与文件系统加密在android中的应用_cola94yi的博客-优快云博客_mtk_encryption_default_off

RPMB绑定(Android 8.0 (Keymaster 3) 中引入了 ID 认证,每个绑定设备的加密信息会不一致,无法通过dump userdata方式获取用户信息。https://source.android.com/security/keystore/attestation#id-attestation)

3、OTA升级

         nonAB与AB系统升级差异大,需要分开说。

3.1、nonAB的OTA升级情况

         nonAB升级流程是recovery调用OTA包中的update-binary二进制执行程序,解析updater-script脚本,按该脚本流程升级。官网https://source.android.com/devices/tech/ota/nonab。详细了解nonAB的OTA升级流程的看下面这系列的blog比较好

Android OTA升级包制作脚本详解(一,参数解析)_高桐@BILL的博客-优快云博客。

         google源生代码的updater(即update-binary二进制执行程序,源码位置bootable\recovery\updater)是不带修改GPT的,方案商有修改GPT方案,提供GPT修改库。

NV数据保存分下面几个情况:

         假如GPT只是签名和时间戳信息变动,可以对比关键分区的起始位置、结束位置来确定是否替换GPT。

         假如GPT改动较少,其中NV所使用分区起始位置和结束位置不动,升级过程中不擦除,NV数据也是可以保留。

         假如GPT改动很大,需要备份NV,可以在updater/install.cpp源码中添加函数,复制NV分区数据至tmp目录下,替换GPT后再写回,其它分区要么全刷,要么擦除,要么格式化。

  NOTE1:       OTA升级按需求还可以添加sparse库,并在updater/install.cpp源码中编写函数,就可以支持sparse格式镜像的刷写,这种方法可加快文件系统格式镜像的刷写。(sparse格式实际是文件系统一种压缩格式,无法用diff工具差分对比,在制作差分包时该类文件不要做diff。可修改差分包制作源码,指定后缀类型直接copy,不做差分)

   NOTE2:      在android 7.1往android 4.4降级时碰到个问题,由于库的不兼容(准确来讲,新版本往旧版本升级时,旧版本是无法知道新版本改动的),导致getprop无法读取设备属性。这时流程上可以使用源码提供的file_getprop接口,通过挂载system读build.prop文件里面的属性。

         可以看到nonAB的这种OTA升级模式,在升级过程中SELinux给予外部执行程序权限很大(OTA包内的updater-binary),包括可读写方式挂载system/vendor、可读写分区、可修改GPT等。同时update-binary执行程序的库可自己加,接口可自己写,流程updater-script可自己定,具有极高的功能自由和流程自由。之前很多破解,root都是通过recovery的OTA升级来完成,并且这种修改过的系统无法再差分升级,这里提醒ODM/OEM小公司证书签名要保护好(不然售后很多问题,让研发兄弟很难搞啊)。

3.2、AB的OTA升级情况

         AB系统升级是调用内部执行程序system/bin/update_engine,解压payload.bin文件,刷写到另外一个slot。和上面nonAB方式明显不同,无法使用自己的升级程序,无法按照自己定义流程来升级。就这两点对于AB系统来说,意味着更安全。同时利用两个slot,可以后台升级,可以断点续传,可以保证稳定性等等。

         update_engine的确有足够权限去刷写非AB的分区,修改GPT。但你无法修改已经在系统里面的update_engine执行程序,无法控制流程(https://source.android.com/devices/tech/ota/ab/ab_implement#post-install

官网介绍有个安装后执行程序,可以执行有限的定制步骤),同时你在改GPT后,你的程序读写所有起始位置变了的分区都会有问题。

当然你可以微改,能改多少可以慢慢验证。但这里没有研究。

         AB系统的GPT修改稍微通用的方式是什么呢?

         显然你需要进入和recovery一样的干净的升级环境;需要按自己流程刷写设备;当然跑自己的升级程序最好不过。

达叔:“没错!”,
最简单方式是使用nonAB的OTA升级包与升级流程。

         那么流程基本就是替换recovery,替换GPT,刷写新系统。总共是两步,需要两个OTA包一个GPT。

第1步、AB系统支持nonAB的升级:
使用AB的OTA包单独替换boot分区(AB系统的recovery文件系统在boot中),而这个新boot内的recovery的根文件系统是nonAB模式的文件系统;
这一步AB的OTA包中,如果使用同平台的nonAB的recovery镜像会有问题,因为在AB系统类型的分区表中无cache/recovery等分区,需要修改recovery模式下的挂载表和日志位置。
第2步、自己做个nonAB的OTA包,重写GPT并按自己流程升级。
这一步关键是执行程序update-binary需要3.1、nonAB的OTA升级情况中提到的sparse支持,GPT修改,NV备份等能力;updater-script脚本,需要自己编写来控制流程。

你至少要注意以下几点:
1、熟悉nonAB的升级流程与OTA包内的升级脚本,熟悉每个分区作用(比如哪些需要先刷写,哪些需要备份);
2、这种OTA包只能自己制作并打包签名,可以用fastboot线刷包来制作(system/vendor需要用sparse格式,如果不用,解压出来将会很大,刷机非常耗时,不确定因素也将更多),updater-script需要自己编写,控制好流程(1、备份NV,2、刷GPT,3、恢复NV,4、刷MP/AP);
3、nonAB的改分区的升级,必须使用外部存储;而且这种升级方式不能中断(尤其是注意点2的2-3-4流程部分),存在一定风险。

这个新系统自由度很高,AB or nonAB自选,GPT自定,版本自定等等。
但是这操作显然太麻烦,你可以有后面几个操作。如果aboot和misc作用比较熟,第一步AB的OTA包替换recovery同时替换新的aboot和misc分区,实现重启立即进入recovery升级第二个nonAB格式的OTA包。如果对nonAB的OTA升级流程及脚本比较熟,GPT放入后刷的nonAB的OTA包中。加上AB的OTA包与nonAB的OTA包差异很大,用的同一个证书签名的话,完全可以放一个包中。那整个流程,可以使用一个包一个操作完成。

根据上面的思路,使厂商release的AB版本支持改分区表升级有两种方式,第一种方法我已经实现,使用多次没出问题。

         方法一,使AB系统的recovery模式不但支持nonAB的OTA方式升级(使用执行文件update-binary与脚本updater-script升级),还支持AB的OTA升级方式(使用自己添加的update_engine_sideload升级)。两种系统的OTA包差异巨大(可以判别关键文件是否存在/判别元数据),识别为哪种,就用哪种方式升级。

         方法二,再简单点,不再判断,使AB系统的recovery模式只支持nonAB的OTA升级,system模式依然使用update_engine升级支持AB的OTA升级。

         假如AB系统的recovery模式支持nonAB方式的OTA升级,它在实现改分区OTA升级的同时也带来了nonAB系统OTA升级的优缺点,比如给system/vendor打补丁、可以利用签名轻易破解、目标版本高度自由能够轻松跨Android的大版本升级。        OTA改GPT还是需要点积累和经验的,不管如何操作,OTA升级改分区表,其风险就无法避免(设备升级中断大概率挂掉,合入发布前多调试,别说我挖坑!),所以建议熟手操作。。。这需求起因不谈,最后结果还是不错。
 

         这篇只有文字,下篇blog比较有用,新玩意,也算是趋势,而且有图了。


后续会思考如何改分区表,并保留userdata。
1、全盘加密的userdata由于recovery无法解密,在userdata空间缩小情况,无思路完全保留userdata;(升级前先缩到指定大小?)
2、文件级加密的userdata,recovery能访问其文件系统,可以改文件系统大小。linux调整文件系统大小 - zgtang - 博客园,未测试验证。

emmc地址动态映射?


高通平台刷机方案适配-ROM定制开发入门到精通 根据新老平台,高通平台线刷包至少要这样几个基本文件,但不一定全部都需要: 8x10_msimage.mbn----平台镜像,是个完整的磁盘,就是sbl,tz,sdi,rpm四个分区。 MPRG8x10.mbn----对应平台的串口烧写协议。 gpt_both0.bin----对应EMMC的分区表,因为不同批次的EMMC大小有细微差别,这个分区表不包含最后一个... 阅读详情

相关推荐

RK3568-ubuntu-ota升级

【代码】RK3568-ubuntu-ota升级。

Paper_Love的博客 837

闲来无事,倒腾一把小米手机刷机

有个小米2S,一直用来做适配测试,最近开机不正常,于是想到刷机。 1、刷机前坚决卸载360,电脑管家和其他有手机管理功能的软件,否则刷机过程卡在$fastboot -s 99dfd2237d92 flash tz F:\ido_xhdpi_images_V7.1.3.0........这样的地方,亲测卸载完立竿见影! 2、线刷时提示remote:partition table doesn't ...

irizhao的专栏 774

Android OTA升级底层原理与AB/Recovery双路径实战解析

Android OTA升级是移动设备固件更新的核心机制,其本质是基于分区管理、签名验证与引导控制的系统级协同过程。AB升级通过双slot切换实现无缝更新,依赖bootloader对ab_metadata的解析;Recovery升级则在独立精简环境中直接刷写物理分区,强调兼容性与安全性。技术价值体现在升级可靠性、回滚能力与带宽优化上,广泛应用于智能手机、IoT终端及车载系统等场景。本文深入update_engine调度逻辑、payload校验流程、差分patch原理及recovery签名验证链,覆盖从OTA包

weixin_29168813的博客 232

msm8909+android5.1分区及烧录的镜像文件介绍【转】

本文转载自: EMMC的分区及其保存的文件 Partition label filename 说明 PrimaryGPT gpt_main0.bin modem NON-HLOS.bin sbl1 sbl1.mbn ...

891

域控制器FOTA升级:Linux+AB分区+GPT+安全启动实战

FOTA(固件空中升级)是智能汽车域控制器持续演进的核心能力,其本质是在高实时、高可靠、高安全约束下完成嵌入式系统更新。理解Linux作为车载OS的裁剪逻辑、AB分区提供的原子性回退机制、GPT分区表对大容量存储与UEFI安全启动的支持,以及从SoC熔丝到应用层的四级安全启动信任链,是构建车规级OTA能力的基础。这些技术共同决定了升级过程能否抵御断电、网络中断、恶意篡改等风险,并支撑ADAS、座舱、电池管理等关键功能的无缝迭代。本文聚焦量产级域控FOTA落地,深度解析Linux内核配置、AB分区物理布局、G

weixin_34168880的博客 412

fastboot驱动在Qualcomm设备OTA升级中的角色一文说清

fastboot驱动是高通设备实现可靠OTA升级的底层支撑,负责设备与PC间的高速通信和刷机指令执行。它直接关系到recovery模式进入、分区擦写及镜像烧录的稳定性,尤其在量产部署和固件回滚场景中不可或缺。没有适配良好的fastboot驱动,OTA升级极易失败或变砖。

weixin_32925455的博客 292

Jetson 分区知识全解与 OTA 升级实战

在嵌入式系统中,**分区(Partition)** 是理解启动流程、存储布局以及 OTA 升级机制的关键环节。NVIDIA Jetson 平台(如 Jetson AGX Orin、Orin NX、Orin Nano)在存储分区设计上提供了高度灵活性和扩展性,既能满足引导加载程序、固件、内核的独立存储需求,也支持用户数据和系统根文件系统的动态管理。本文将带你从分区架构入手,逐步讲解如何在 Jetson 平台上实现 OTA 升级方案,并给出实战示例与逻辑图。

Interview_TC的博客 1808

嵌入式A/B双系统OTA升级原理与工程实践

A/B双系统是嵌入式设备实现高可靠OTA升级的核心架构,其通过物理隔离的主备分区实现升级过程零中断。原理上依赖启动引导控制、环境变量原子更新与分区镜像切换三重机制,技术价值在于保障升级失败可回退、系统持续可用,并支持断电恢复。典型应用场景包括工业网关、智能终端及无人值守边缘设备等对可靠性要求严苛的领域。本文深入解析基于SPI NAND/SPI NOR/eMMC存储介质的A/B分区规划、cpio格式升级包构建、分片流式下载及Bootloader级故障自愈流程,涵盖OTA升级中固件烧写、环境变量管理、文件系统挂

weixin_42599908的博客 74

嵌入式系统A/B分区升级方案详解:从GPT分区表到Bootloader启动选择的状态机实现

项目参数Flash总容量128MB单系统分区大小状态机状态数6个(IDLE/DOWNLOAD/WRITE/SWAP/BOOT_TRY/CONFIRM)启动失败回退阈值3次Watchdog超时120秒签名校验升级耗时(64MB固件)约45秒(SPI-NOR @50MHz)断电恢复能力100%(任何阶段断电均可恢复至IDLE状态)状态机设计的核心原则:任何断电时刻设备状态均可恢复。IDLE→DOWNLOAD→WRITE阶段断电,旧分区完好无损;

qq_42431428的博客 5854

OSTree:为Linux系统打造Git式版本管理与OTA升级方案

在Linux系统运维与嵌入式设备管理中,整机升级一直是高风险工程。传统覆盖式更新容易导致系统损坏,容器方案又无法覆盖宿主机根文件系统。OSTree作为面向操作系统的版本管理框架,借鉴Git的存储模型,通过内容寻址对象仓库对文件系统进行快照、分支和增量管理,实现原子化部署与一键回滚。其双槽位部署机制让OTA升级变得安全可靠,尤其适应车载系统、边缘网关等无人值守场景。从仓库模式到引导配置,OSTree提供了一套完整的系统级更新链路,既能减少流量消耗,又能保障失败时自动回退。本文从实际工程角度拆解OSTree的部

weixin_34162228的博客 312

玩机进阶教程------固件中的分区表 gpt_backup0.bin gpt_both0.bin gpt_main0.bin有什么区别 怎么修改分区表【一】

此类话题在百度很难搜索到,大多都是讲分区表的类型 结构 等等,对于一些玩机用户 想查看分区表信息与修改的方法与思路基本很少 今天的课程初步了解 1-----在固件中gpt_backup0.bin gpt_both0.bin gpt_main0.bin的区别 2----分区表gpt.bin中的信息如何查看。怎么转换进制 3-----分区表.bin如何修改 4-----直接修改分区表用于分区扩容是否可行

小马哥的专栏 1336

嵌入式SoC OTA远程升级系统技术方案

本文设计一套端云协同的嵌入式SoC OTA远程升级系统,适配Linux、RTOS、裸机多类平台,广泛应用于工业、车载、智能家居等场景。系统构建云端、传输、设备、Bootloader四层解耦架构,形成固件签名、云端发布、弱网下载、分区切换、闭环上报的全流程体系。依托A/B双分区、差分升级、安全验签、自动回滚核心技术,彻底解决固件篡改、升级变砖、断网失败、版本混乱等行业痛点,具备掉电安全、弱网适配、多子系统协同、灰度运维等优势,可满足量产设备规模化、安全化、可追溯的远程迭代需求。

RFCEO的博客 500

TWRP-3.1.0-0617-ZUK_Z2-CN-wzsx150-QPST.7z

联想手机zukz2pro免解锁刷入rec

瑞芯微rk3576,recovery ota 升级内核

本文介绍了瑞芯微RK3576芯片基于updateEngine方案的recovery OTA升级流程。主要内容包括:1)在buildroot中配置recovery相关选项,启用updateEngine升级功能;2)修改分区表添加userdata分区用于存放升级包;3)编译生成update.img固件包和update-ota.img升级包;4)执行升级命令验证内核更新效果。通过环境变量配置、分区表修改和固件编译等步骤,实现了RK3576设备的OTA升级功能。

城域 1113

小天才手表z6分区表.zip

小天才手表z6分区表.zip

RK3568-buildroot-ota升级

首先保证系统存在recovery分区。

Paper_Love的博客 1466

2024最新版Anaconda Navigator安装使用指南

本文简要介绍如何下载安装Anaconda Navigator最新版,以及如何使用Python内核搭载来完成应用程序开发。

jackson_lingua的博客 1万+

OTA升级和AB分区切换

最近搞了一下OTA升级,大概流程就是从HTTP服务器下载img固件压缩包,然后解压,比对md5值,然后解压,同步img内容到另一个分区(注意添加AB分区,A和B分区相互切换,完成OTA升级功能),然后修改切换分区的grub配置文件,然后重启,完成OTA升级和分区的切换。

Android/Linux驱动开发传帮带学习,让驱动入门门槛更低! 266

【附源码】Node.js毕业设计高校院级校友信息管理系统(Express)

首先,该系统可以提高高校对校友信息管理的效率和准确性。通过系统提供的查询功能,高校可以方便地获取校友的最新联系方式和动态,及时了解校友的发展情况,为校友提供更好的服务和支持。总之,开发高校院级校友信息管理系统将为高校提供一个高效、便捷的工具,有助于提升校友管理水平和服务质量,促进高校与校友之间的良好互动关系。通过使用前端技术HTML、CSS、JavaScript和Vue框架,结合后端技术Node.js和Express框架,以及MySQL数据库,可以实现对校友信息的快速录入、查询、修改和删除等操作。

佳愉毕设源码 894

ADRV9026初始化避坑指南:手把手调试PostMcsInit常见故障

本文详细解析了ADRV9026多片同步初始化过程中的PostMcsInit常见故障,包括时钟校准失败、JESD链路建立问题和ARM核通信异常等。通过实际项目经验,提供了硬件检查清单、软件配置要点和分层诊断方法,帮助工程师快速定位和解决问题,提升系统稳定性。

hadoop5ranger的博客 620

rk35xx系列 openkylin系统ota升级失败以及修改

rk35xx系列 openkylin系统ota升级失败以及修改

2301_76966953的博客 250

单晶塑性abaqus-umat自学

单晶塑性abaqus-umat 摘要1. 简介2. 单晶弹塑性本构模型回顾2.1运动学 本文以翻译黄永刚老师的umat文章为主,这个颜色的为个人的理解。 摘要 包含单晶塑性的abaqus用户材料子程序。本文回顾有限元形式的单晶弹塑性和黏弹塑性,包含小变形理论,以及严格的有限变形和有限旋转理论。单晶的非弹性变形由于晶体滑移,假定遵从Schmid准则。提出多种多样的分切应力与剪切变形的自硬化和潜硬化关系,并且包含在子程序内。 1. 简介   有限元程序ABAQUS已经广泛应用在固体的变形与应力分析。除了自身大量

Niklas4088的博客 1万+
上一篇: android的刷机方式
下一篇: 多开机界面适配,多dtbo合入
Kael.dong
博客等级 码龄11年 148粉丝 33原创
评论 10
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

Kael.dong

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值