刷机
Android 分区构成
- 手机的 ROM 类比为电脑上的硬盘, 这个硬盘被分成了几个分区: bootloader分区,boot分区,system分区等等.
- bootloader分区: 当按下电源键手机上电启动后,首先从bootloader分区中一个固定的地址开始执行指令.bootloader 分区分为两部分,分别为 primary bootloader 和 secondary stage bootloader.
- primary bootloader: 主要执行硬件检测.
- Secondary stage bootloader: 进行一些硬件初始化工作,获取内存大小信息等,然后根据用户的按键进入到某种启动模式(例如通过电源键和其它一些按键的组合,可以进入到 recovery,fastboot,启动模式等).
- boot分区: 开机启动引导相关, 存放启动和引导的文件.包含 Kernel(内核) 和 Ramdisk(虚拟内存).如果 boot 分区损坏通常就卡在开机第一个 LOGO 界面. 当我们只是按下电源键开机时,会进入正常启动模式. Secondary stage bootloader会从 boot 分区开始启动. Boot分区的格式是固定的, 首先是一个头部, 然后是 Linux 内核, 最后是用作根文件系统的 ramdisk.
- system分区: 存放整个安卓操作系统和系统预装软件.system分区损坏的话,会卡在开机动画界面,无法进入系统.
- vendor分区: Vendor 包含了开发厂商私有的可执行程序、库、系统服务和 app 等.可以将此分区看做是 system 分区的补充.厂商定制 ROM 的一些功能都可以放在此分区, 该分区主要包含开发厂商的定制应用与库文件, 部分厂商会把 Vendor 分区置于 System 分区中便于后期更新维护.
- Data分区: 存放用户数据,包括应用、音视频、图片、文档、系统设置等.擦除这个分区相当于清空所有软件的数据,包括各种软件和文件资料还有系统的各项设置,但是不会影响手机的正常启动.
- cache分区: cache缓存区,可以帮助你快速的打开系统最常访问的数据和应用程序不需要重复加载.擦除缓存的话并不会影响个人数据而新的缓存也会在后续生成进来.
- recovery分区: 包含 recovery 统的 kernel 和 ramdisk, 用于恢复和维护手机,类似于 Windows装系统时的 PE 系统.除了恢复系统之外,还可以对其他的安卓分区进行擦除、重启等等操作.
- modem分区: 实现手机必需的通信功能.
- misc分区:主要用于Android系统和bootloader通信,使Android系统能够重启进入 recovery 系统并执行相应操作.
Android OTA 升级
概述
- OTA(Over-the-AirTechnology): 指手机终端通过无线网络下载远程服务器上的升级包, 对系统或应用进行升级的技术.
非 A/B 系统更新
- Android 系统收到服务端下发的 OTA 推送, 将 OTA 包下载至 cache 分区.OTA 包下载完成后, 将向 misc 分区写入指令, 表明下次启动时进入 recovery 模式并使用该 OTA 包进行升级.重启手机, 重启后最先进入 bootloader,bootloader 会先判断按键组合, 电源寄存器等, 随后会读取 misc 分区的内容并解析.bootloader 读取指令后会引导启动 recovery 系统, 进入recovery,读取 cache 分区中的 OTA 包,并解析其中的升级脚本,按照其指令对系统各个分区进行升级.recovery 会清除 misc 分区.重启手机,重启后最先进入 bootloader, 判断按键组合,电源寄存器, misc 分区内容等, 默认情况下会启动 Android 系统, 此时已经是OTA升级后的新版本系统.
分区

升级

A/B 系统更新
- 在 Android O 之后,Google引入了一种新的分区结构,称为 A/B 分区.将系统分区分成了 A 和 B 两个槽(slot),手机启动时会选择 A 槽或者 B 槽启动,运行过程中仅使用当前槽位的分区.采用 A/B 分区结构,能够实现无缝升级。例如用户正在运行 A 槽,此时收到 OTA 推送,则系统会一边从服务端获取 OTA 数据,一边直接写入待升级的槽,不需要临时存储 OTA 包的空间,因此不再需要在 cache 或 userdata 分区预留足够空间.当 B 槽系统升级完成,用户会收到重启提示,此时重启手机将自动切换到 B 槽的新版本系统.
分区

虚拟 A/B 更新
概念
- 线刷包: 用数据线操作的 ROM 包.
- 卡刷包: 直接在手机存储中操作的 ROM 包.
- fastboot模式:
- 解锁bootloader: 通常指的就是解锁 recovery 或 fastboot,允许刷写 recovery 分区.
- 查询手机是否 A/B 分区
adb shell getprop ro.build.ab_update
结果显示 true 表示手机使用 A/B 分区,如果没有返回内容或者返回空白则不是 A/B 分区