浅析Android OTA机制

这篇具有很好参考价值的文章主要介绍了浅析Android OTA机制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  1. OTA 全称 Over-the-Air Technology,这种在线升级,无需刷机升级的方式,叫做OTA升级,OTA升级可以借助Wifi无线网络或者手机移动网络完成升级,相当于借助空中无线网络完成升级;
  2. 项目中需要OTA的功能,因此有了此文,参考下Android的OTA实现机制,可以看到Android的OTA机制随着版本升级也发生了变化了,下面对此进行了总结

非 A/B 系统更新

先看下Android传统的分区结构

android ota,android,android studio,ide

bootloader:设备启动后,会先进入bootloader程序,这里会通过判断开机时的按键组合(也会有一些其他判断条件,暂不赘述)选择启动到哪种模式,这里主要有Android系统、recovery模式、fastboot模式等。
boot:包含有Android系统的kernel和ramdisk。如果bootloader选择启动Android系统,则会引导启动此分区的kernel并加载ramdisk,完成内核启动。
misc:主要用于Android系统和bootloader通信,使Android系统能够重启进入recovery系统并执行相应操作。
system:包含有Android系统的可执行程序、库、系统服务和app等。内核启动后,会运行第一个用户态进程init,其会依据init.rc文件中的规则启动Android系统组件,这些系统组件就在system分区中。将Android系统组件启动完成后,最后会启动系统app —— launcher桌面,至此完成Android系统启动。init进程启动
vendor:包含有厂商私有的可执行程序、库、系统服务和app等。可以将此分区看做是system分区的补充,厂商定制ROM的一些功能都可以放在此分区。
userdata:用户存储空间。一般新买来的手机此分区几乎是空的,用户安装的app以及用户数据都是存放在此分区中。用户通过系统文件管理器访问到的手机存储(sdcard)即此分区的一部分
recovery:包含recovery系统的kernel和ramdisk。如果bootloader选择启动recovery模式,则会引导启动此分区的kernel并加载ramdisk,并启动其中的init继而启动recovery程序,至此可以操作recovery模式功能(主要包括OTA升级、双清等)。
cache:主要用于缓存系统升级OTA包等。双清就是指对userdata分区和cache分区的清理。

升级过程

android ota,android,android studio,ide

  • Android系统收到服务端下发的OTA推送,将OTA包下载至cache分区。
  • OTA包下载完成后,将向misc分区写入指令,表明下次启动时进入recovery模式并使用该OTA包进行升级。
  • 重启手机。
  • 重启后最先进入bootloader,bootloader会先判断按键组合、电源寄存器等,随后会读取misc分区的内容并解析。由于步骤2中已经向misc分区写入了指令,此处bootloader读取指令后会引导启动recovery系统。
  • 进入recovery,读取cache分区中的OTA包,并解析其中的升级脚本,按照其指令对系统各个分区进行升级
  • recovery会清除misc分区
  • 重启手机
  • 重启后最先进入bootloader,判断按键组合、电源寄存器、misc分区内容等,默认情况会启动Android系统,此时已经是OTA升级后的新版本系统

缺点

  • 升级下载的OTA包占用cache分区空间
  • 升级失败无法恢复回旧系统

A/B系统更新

android ota,android,android studio,ide 为了解决以上两个问题,在Android O之后,Google引入了一种新的分区结构,称为A/B分区,与之对应,传统分区结构被称为non-A/B分区。

A/B分区结构,顾名思义,将系统分区分成了A和B两个槽(slot),手机启动时会选择A槽或者B槽启动,运行过程中仅使用当前槽位的分区。

android ota,android,android studio,ide

采用A/B分区结构,能够实现无缝升级。例如用户正在运行A槽,此时收到OTA推送,则系统会一边从服务端获取OTA数据,一边直接写入待升级的槽,不需要临时存储OTA包的空间,因此不再需要在cache或userdata分区预留足够空间。当B槽系统升级完成,用户会收到重启提示,此时重启手机将自动切换到B槽的新版本系统。

android ota,android,android studio,ide

bootloader为了判断一个系统(slot)是否为可以启动的状态,Google定义了A/B槽的几种标识:

  • bootable:标识该槽的系统是否可以启动。
  • successful:标识该槽的系统是否成功启动过,仅当该槽系统能够启动、运行、进行OTA升级时,才会从用户态标记该槽为successful。
  • active:标识该槽是否是当前运行的系统,两个槽中只有一个能标记为active。

android ota,android,android studio,ide

缺点

  • 系统所需的存储空间比非A/B OTA所需的更多,因为A/B系统的分区boot. system, vendor等都作了两套分区

虚拟A/B

为了解决上面的问题,Android在后面新增了虚拟A/B系统更新;

  • 对于AB分区,就是传统的备份,也就是system_b就是system_a的副本;而对于virtualAB,用的就是写时复制快照技术,所以这些动态分区无需AB,有修改就创建快照,下次启动如果成功,就说明对于分区的修改没有问题,就将快照和原本的base合并,作为最新的base
  • virtualAB备份的不是副本,而是快照。节省空间。

动态分区

动态分区解决的是各个分区映像不再需要预留空间。借助动态分区,供应商无需担心各个分区(例如 system、vendor 和product)的大小。取而代之的是,设备会分配一个super 分区,其中的子分区可动态调整大小。

动态分区是使用Linux内核中的dm-linear device-mapper模块实现的。在Android Q上,对system分区的访问被驱动拦截并转发为对super分区某个区域的访问。类似于做一个映射关系。

android ota,android,android studio,ide

Snapshot

比如,我有一串数据“ABCDEF”,存储的地址是从0x0到0x5,备份就是我找一块空间0x7到0x12,我把数据完全的拷贝到这块空间,从这里看备份的缺点很明显,如果数据比较大,但改动又不多或者集中在某个区域,就很占用空间,而且比如我就1000位数据我常改其中50位的数据,你就都备份,那有浪费了950位数据的额空间。而快照技术并不备份所有数据,我只记录上次对这部分数据进行写操作的时间点和改动的数据(不是全部数据),这样我要记录的数据比起把数据全部备份就少的多了。

android ota,android,android studio,ide

快照里的一种实现方式就是写时复制;就是比如我要把“ABCDEF”这串数据(存储的地址是从0x0到0x5)改为“ABCMEF”,只把其中的D改为M,就是我先把元数据读出来(从0x3读出D),然后把D改成M,然后改动的数据写在另一个位置(快照),然后再把改动的数据写到元数据处(0x3)

流程

  • 先创建system_b_base,对应映射到system_a;
  • 创建sytem_cow(copy-on-wirte 写时复制)(可能由超级分区中的空闲块组成,也可能是/data上分配的块上的循环设备,或者两者都有)
  • base和cow统一组成一个快照
  • 当设备在应用更新后重新引导时,发现有快照,系统就从快照上进行挂载,直到成功引导。从快照挂载成功后,把base和快照的内容合并。这样就可以删除快照设备了

android ota,android,android studio,ide

小结

android ota,android,android studio,ide文章来源地址https://www.toymoban.com/news/detail-822646.html

android ota,android,android studio,ide

到了这里,关于浅析Android OTA机制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android OTA 相关工具(七) 使用 lpunpack 解包 super.img

    从 Android 10(Q) 开始,引入了动态分区,伴随的就是一组动态分区内容数据增删改查相关的操作,以及这些操作所需要的工具,包括 lpdump, lpmake, lpunpack, lpadd, lpflash。 工具名称前缀 lp 表示是 logic partition,即逻辑分区。 所谓逻辑分区,是相对于物理分区而言,因为动态分区内部

    2024年02月02日
    浏览(77)
  • Android 10.0 ota升级关于SettingsProvider新增和修改系统数据相关功能实现

      在10.0的系统rom定制化开发中,在进行ota升级的过程中,由于在SettingsProvider中新增了系统属性和修改某项系统属性值,但是在ota升级以后发现没有 更新,需要恢复出厂设置以后才会更改,但是恢复出厂设置 会丢掉一些数据,这是应为系统数据库没更新,所以需要在ota的时候

    2024年02月10日
    浏览(46)
  • Android 9.0 ota升级关于SettingsProvider新增和修改系统数据相关功能实现

      在9.0的系统rom定制化开发中,在进行ota升级的过程中,由于在SettingsProvider中新增了系统属性和修改某项系统属性值,但是在ota升级以后发现没有 更新,需要恢复出厂设置以后才会更改,但是恢复出厂设置 会丢掉一些数据,这是应为系统数据库没更新,所以需要在ota的时候

    2024年01月22日
    浏览(63)
  • Android A/B System OTA分析(六)如何获取 payload 的 offset 和 size

    Android A/B 系统基础入门系列《Android A/B 系统》已完结,文章列表: Android A/B System OTA分析(一)概览 Android A/B System OTA分析(二)系统image的生成 Android A/B System OTA分析(三)主系统和bootloader的通信 Android A/B System OTA分析(四)系统的启动和升级 Android A/B System OTA分析(五)客户

    2024年01月22日
    浏览(50)
  • OTA编译报Exception in thread “main“ java.lang.UnsupportedClassVersionError: com/android/signapk/SignApk

            预置条件:已编译出2个版本的target包;         问题引入:项目需要本地验证当前项目是否可以编译出OTA差分包和全量包,并通过差分包和全量包成功完成测试机系统版本升级(这里重点讨论编译差分包过程中遇到的问题)         问题描述:使用ota脚本编译OTA报错

    2024年02月12日
    浏览(38)
  • Android Looper Handler 机制浅析

    最近想写个播放器demo,里面要用到 Looper Handler,看了很多资料都没能理解透彻,于是决定自己看看相关的源码,并在此记录心得体会,希望能够帮助到有需要的人。 本文会以 猜想 + log验证 的方式来学习 Android Looper Handler,对于一些复杂的代码会进行跳过,能够理解它们的设

    2024年02月11日
    浏览(39)
  • 【RT-Thread】使用RT-Thread Studio 配置BootLoader及App实现OTA功能

    由于项目需要实现OTA功能学习了一下具体实现方法,以备后期查看,有问题的地方随时指正修改 1.什么是OTA OTA是“over-the-air”的缩写,是一种无线技术,用于在不需要接触设备的情况下向移动设备或物联网设备提供更新、补丁或新版本的软件。OTA更新通常通过无线网络(如

    2024年02月09日
    浏览(37)
  • Android SDK 上手指南|| 第三章 IDE:Android Studio速览

    Android Studio是Google官方提供的IDE,它是基于IntelliJ IDEA开发而来,用来替代Eclipse。不过目前它还属于早期版本,目前的版本是0.4.2,每个3个月发布一个版本,最近的版本由2014年1月发布。 Android Studio包括了所有开发Android app所需要的工具,但是它并不成熟,所以如果需要稳定还

    2024年02月11日
    浏览(53)
  • IDE - Android Studio/Xcode历史版本下载

    最近升级开发工具老是遇到各种兼容性问题导致需要降回老版本,Xcode历史版本下载方便倒还好,Android Studio就麻烦了,一开始找到的官方历史版本下载还不全。这里整理一些历史版本信息方便下载,后续会持续更新。 历史版本数据来源Android Studio官方(语言必须选English,不

    2024年02月09日
    浏览(52)
  • ESP32 OTA升级之https ota详解

    本文以 ESP32 官方demo例程 native_ota_example 为例,详细阐述如何采用https实现esp32的ota升级。 第一章节,为本文的前言部分,对文章内容进行大体概述; 第二章节,主要描述了如何在本地将demo例程跑起来,并附带了关于使用demo例程中遇到的相关报错的具体解决措施; 第三章节,

    2024年02月14日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包