Android OTA升级原理 - 实现流程(整理一)

本文深入解析Android OTA(Over-the-Air Technology)升级流程,涵盖升级包制作、设备分区写入及工作模式等内容,适合Android系统开发者及对OTA升级感兴趣的读者。

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

OTA升级概述

OTA(Over-the-AirTechnology)是指手机终端通过无线网络下载远程服务器上的升级包,对系统或应用进行升级的技术。有关网络部分不做过多讨论,本文重点放在系统升级这一概念上。

目前主要分为两大类:

  • 按照升级的方式可以分为:T卡升级和网络升级
  • 按照包的内容可以分为:增量升级和整包升级

那么对于设备来说我们需要考虑几点:

  • 升级包是怎么产生的
  • 升级包是怎么写入设备对应的分区的。

制作升级包

对于Android系统升级包制作主要分两种:

  • 一种是通过命令自动产出全包和增量包;
  • 另一种是在之前升级包的基础(通常是增量包)上进行修改/增加新的内容;
    实际上第二种是对第一种的补充方式。

自动生成update.zip升级包

这种方式就是通过Android提供的编译指令进行自动制作。
该方法主要概括为以下几个步骤:

make  # 先编译Android源码
make otapackage  # 开始制作ota全量包
# 制作差分包, 这一步需要准备基包base.zip, target_files.zip是刚刚生成的包, update.zip就是基于前面两个包产生的增量包,用于后面升级使用
./build/tools/releasetools/ota_from_target_files -k build/target/product/security/testkey -s vendor/mediatek/proprietary/scripts/releasetools/mt_ota_from_target_files --block -i base.zip target_files.zip update.zip

注:
以上步骤是制作升级包的大概步骤,具体细节请各位自行搜索,网上资料实在太多了。

手动生成update升级包

这种模式通常情况下在改动很小或者只更新了某几个APK应用程序,不想再重新make otapackage的情况下采用的。
该方法主要概括以下几个步骤:

# 1.将现有的update.zip解压
# 2.将改动的apk替换到system/app或者其他具体的工作目录中
# 3.重新打包成update.zip, 打包的时候不能有二级目录,即解压后直接就是内容
# 4.对新的update.zip重新签名 - 必须做, 重新签名的指令如下:
java -Djava.library.path=out/host/linux-x86/lib64 \
    -jar out/host/linux-x86/framework/signapk.jar \
    -w build/target/product/security/testkey.x509.pem \
    build/target/product/security/testkey.pk8 update.zip update-new.zip

注:
1.以上步骤是制作升级包的大概步骤,具体细节请各位自行搜索,网上资料实在太多了。
2.网上有的资料提供的签名指令,没有增加-Djava.library.path=out/host/linux-x86/lib64这一句,导致签名失败,如果有遇到签名失败问题,可以加上试试。

增量包目录结构

制作好的update.zip结构通常如下:不同的平台可能有稍许差异
├── lk.img
├── META-INF
│ └── com
│ ├── android
│ │ ├── metadata
│ │ └── otacert
│ └── google
│ └── android
│ ├── update-binary
│ └── updater-script

├── odmdtbo.img
├── patch
│ └── boot.img.p
├── scatter.txt
├── system.new.dat
├── system.patch.dat
├── system.transfer.list
├── tee.img
├── type.txt
├── vendor.new.dat
├── vendor.patch.dat
└── vendor.transfer.list
其中有两个文件需要说明一下,这个和后面升级会用到:

  • update-binary 是一个二进制文件,相当于一个脚本解释器,它定义描述了updater-script中所使用的语法行为,即最终实现的操作。该文件在Android源码编译后被放置在out/target/product/<TARGET_TYPE>/system bin/updater,在做make otapackage时会将updater重命名为update-binary并放置到META-INF\com\google\android这个目录中。
    源码位置在:bootable\recovery\updater中
  • update-script 此文件是一个脚本文件,具体描述了更新过程。我们可以根据具体情况编写该脚本来适应我们的具体需求。 它的语法是在update-binary中定义的。这个脚本也是我们后续会被改动的,比如我们需要增加一个自定义的更新,我们就可以手动增加重新打包签名。

升级包写入设备分区

这里也是最重要核心的地方,设备是如何开始升级的。首先我们需要知道Android设备的几种工作模式

Android的三种工作模式

主要有三种:

  • 正常模式
  • Recovery 模式
  • Fastboot模式

在这里插入图片描述
由上图可以知道如何进入不同的模式:

  • 正常启动模式: 用户什么都没有操作,开机将自动进入该模式。
  • Recovery 模式: 可以有两种种方式:
    [1] 开机时按下home+power组合键
    [2] 在正常模式下通过reboot recovery命令进入
  • fastboot:快速刷机模式:开机时按下camera+home组合键

Recovery升级模式

在前面我们制作的ota升级包就是需要在该模式下完成升级操作。

正常的升级流程如下图:
在这里插入图片描述
这是一个从APP一路执行到底层的大概流程。在这我们只需要通过命令模拟从APP到framework的过程来验证recovery 升级。
首先需要知道APP - Framework做了什么事情;简单可以概括为:从APP接收到升级包并获取完整路径,给到framework,然后framework将进行校验是否合法,然后再对/cache/recovery目录相关历史记录做清除操作,并写入接收到的完整路径到command文件中,最后通过reboot recovery让设备重启进入升级模式。
所以我们只需要模拟这一过程就可以:

  • 首先提供上述update.zip升级包放入到/sdcard/update.zip中
  • 其次 写入升级包名到 /cache/recovery/command - 格式为: --update_package=/sdcard/update.zip
  • 其次清除/cache/recovery目录中的历史信息如: log, sqlite等
  • 最后通过reboot recovery指令让设备重启进入升级模式

这样整个升级将完成了。本节只是让同学初步认识到OTA升级的基本过程。
对于Recovery模式,是如何进行升级操作的,它的具体过程是如何?

接下来我们将进行分析Recovery服务流程细节请看下篇分析

### 关于面包板电源模块 MB102 的 USB 供电规格及兼容性 #### 1. **MB102 基本功能** 面包板电源模块 MB102 是种常见的实验工具,主要用于为基于面包板的小型电子项目提供稳定的电压输出。它通常具有两路独立的稳压输出:路为 5V 和另路可调电压(般范围为 3V 至 12V)。这种设计使得它可以满足多种芯片和传感器的不同工作电压需求。 #### 2. **USB 供电方式** MB102 支持通过 USB 接口供电,输入电压通常是标准的 5V DC[^1]。由于其内部集成了 LM7805 稳压器以及可调节电位器控制的直流-直流变换电路,因此即使输入来自电脑或其他低功率 USB 设备,也能稳定地向负载供应电力。不过需要注意的是,如果项目的功耗较高,则可能超出某些 USB 端口的最大电流能力(般是 500mA),从而引起不稳定现象或者保护机制启动断开连接的情况发生。 #### 3. **兼容性分析** 该型号广泛适用于各种微控制器单元 (MCU),特别是那些像 Wemos D1 R32 这样可以通过杜邦线轻松接入并共享相同逻辑级别的系统[^2]。另外,在提到 Arduino Uno 板时也表明了良好的互操作性,因为两者均采用相似的标准接口定义与电气特性参数设置[^4]: - 对于需要 3.3V 工作环境下的组件来说,只需调整好对应跳线帽位置即可实现精准匹配; - 当涉及到更多外围扩展应用场合下,例如带有多重模拟信号采集任务的情形里,利用 MB102 提供干净无干扰的基础能源供给就显得尤为重要了[^3]。 综上所述,对于打算构建以单片机为核心的原型验证平台而言,选用具备良好声誉记录且易于获取配件支持服务链路上下游资源丰富的品牌产品——如这里讨论过的这款特定类型的配电装置不失为明智之举之。 ```python # 示例 Python 代码展示如何检测硬件状态 import machine pin = machine.Pin(2, machine.Pin.IN) if pin.value() == 1: print("Power supply is stable.") else: print("Check your connections and power source.") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值