Android系统分区

Post on Jul 10, 2021 by Wei Lin

相关术语

AOSP

Android大版本由Google维护,原生Android就是所谓的AOSP(Android Open Source Project),即没有被第三方厂商修改过的版本,所以我们称之为原生。

对于AOSP的介绍可以参考https://source.android.com/。

基线

首先由谷歌发布安卓系统(AOSP),如Android S。交给芯片运营商如高通,高通对芯片和安卓系统进行适配,然后研发一套系统即基线,主要是增加了驱动和新特性,再分发给各手机运营商如小米、华为。

OEM

OEM即Original Equipment Manufacturer(原始设备制造商)。


对某种产品,A设计,B生产,A品牌,A销售。B相当于代工,使用别人的技术和品牌,工厂B只生产,所以B被称作OEM。

确切来讲,OEM就是委托生产,实际上是一种“代工生产”的方式,其含义是品牌生产者不直接生产产品,而是利用自己掌握的“关键的核心技术”,负责设计和开发新产品,控制销售“渠道”,具体的加工任务交给别的企业去做,承接这一加工任务的制造商就被称为OEM厂商,其生产的产品就是OEM产品。

例如对Google来说,Android系统是它的“关键的核心技术”,而其它使用Android系统的手机就相当于代工,所以Google可以将小米、OPPO、三星等手机厂商称作OEM。


OBM:Original Brand Manufacture

原始品牌生产商。对某类产品,A设计,A生产,A品牌,A销售。工厂自己设计自产自销。


ODM:Original Design Manufacturer

原始设计制造商。对某类产品,B设计,B生产,A品牌,A销售。俗称“贴牌”,就是工厂的产品,别人的品牌。

通常将B称作ODM厂商。


OEM:Original Equipment Manufacturer

原始设备制造商。

A设计,B生产,A品牌,A销售==代工,代生产,别人的技术和品牌,工厂只生产

SSI与Vendor

Android 共享系统映像——source.android


(1) 背景

Treble 计划将整个 Android 拆分为两个部分:特定于硬件的部分(供应商实现)和通用操作系统部分(Android 操作系统框架)。

各部分的软件安装于不同分区中:特定于硬件的软件安装于供应商分区(Vendor)中,而通用操作系统软件则安装于系统分区中。一个称为供应商接口 (VINTF) 的版本化接口在这两个分区中定义和强制执行。使用此分区系统,您可以在不修改供应商分区的情况下修改系统分区,反之亦然。


(2) SSI

SSI即Shared System Image(共享系统镜像)。

为了进一步让原生Android和各厂商的软件进行解耦,使设备代码的移植(系统大版本的升级)变得更加友好,Google引入了SSI(Shared System Image)的概念。

SSI是指,在Android版本相同的情况下,各个Android设备的ROM镜像中,system.img都是由该版本的原生AOSP(或厂商定制)代码编译出的,是多产品共同使用的、与具体硬件设备无关的系统镜像。而且他与具体硬件设备、产品型号有关的代码会被放在其他分区中。


(3) Vendor

SOC特定组件的集合,硬件相关。

Android系统分区

传统分区结构

Android 7.0及之前的版本使用的是传统分区结构,通常包含以下部分。


(1) bootloader

设备启动后,会先进入bootloader程序,这里会通过判断开机时的按键组合(也会有一些其他判断条件,暂不赘述)选择启动到哪种模式,这里主要有Android系统、recovery模式、fastboot模式等。


(2) boot

包含有Android系统的kernel和ramdisk。如果bootloader选择启动Android系统,则会引导启动此分区的kernel并加载ramdisk,完成内核启动。


(3) system

包含有Android系统的可执行程序、库、系统服务和app等。内核启动后,会运行第一个用户态进程init,其会依据init.rc文件中的规则启动Android系统组件,这些系统组件就在system分区中。将Android系统组件启动完成后,最后会启动系统APP—Launcher桌面,至此完成Android系统启动。


(4) vendor

包含有厂商私有的可执行程序、库、系统服务和app等。可以将此分区看做是system分区的补充,厂商定制ROM的一些功能都可以放在此分区。


(5) userdata

用户存储空间。一般新买来的手机此分区几乎是空的,用户安装的app以及用户数据都是存放在此分区中。用户通过系统文件管理器访问到的手机存储(sdcard)即此分区的一部分,是通过fuse或sdcardfs这类用户态文件系统实现的一块特殊存储空间。


(6) recovery

包含recovery系统的kernel和ramdisk。如果bootloader选择启动recovery模式,则会引导启动此分区的kernel并加载ramdisk,并启动其中的init继而启动recovery程序,至此可以操作recovery模式功能(主要包括OTA升级、双清等)。


(7) cache

主要用于缓存系统升级OTA包等。双清就是指对userdata分区和cache分区的清理。


(8) misc

主要用于Android系统和bootloader通信,使Android系统能够重启进入recovery系统并执行相应操作。


传统分区结构下,系统的OTA升级流程比较简单,主要过程如下:

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

A/B分区结构

在Android O(8.0)之后,Google引入了一种新的分区结构,称为A/B分区,与之对应,传统分区结构被称为non-A/B分区。


A/B分区结构,将系统分区分成了A和B两个槽(slot),手机启动时会选择A槽或者B槽启动,运行过程中仅使用当前槽位的分区。一旦当前运行的槽出现问题,系统仍可以选择另一个槽进行启动,从而保证系统良好的可用性。

采用A/B分区结构,能够实现无缝升级,OTA失败并不会影响用户当前运行的系统。

Android 10分区结构

Android 共享系统映像——source.android


Google引入了SSI(Shared System Image)的概念。

SSI是指,在Android版本相同的情况下,各个Android设备的ROM镜像中,system.img都是由该版本的原生AOSP(或厂商定制)代码编译出的,是多产品共同使用的、与具体硬件设备无关的系统镜像。而且他与具体硬件设备、产品型号有关的代码会被放在其他分区中。

image-20230726235159004


(1) SSI

SSI 是OEM厂商通用的映像,可以存在于多个设备上。它不包含任何特定的用于硬件或某些产品的组件。根据定义,指定 SSI 中的所有内容都在使用该 SSI 的所有设备之间共享。SSI 可由单个 /system 映像组成,也可由 /system 和 /system_ext 分区组成。


  • /system 分区

包含基于AOSP的组件,而 /system_ext 实现后则包含OEM和SoC供应商扩展,以及与AOSP组件紧密耦合的组件。

例如,OEM为自己的应用提供自定义 API 的OEM Java框架库,更适合放在 /system_ext 分区。/system 分区和 /system_ext 分区的内容是基于OEM修改的 Android 源代码构建而成。


  • /system_ext 分区

是可选项,放置基于 AOSP 的组件紧密耦合的任何自定义功能和扩展。以便后续时间将此类组件从 /system_ext 分区迁移到 /product 分区。


(2) Product Image

是与具体产品或设备相关的特定组件(非通用),包含OEM对Android 操作系统的自定义和扩展。包含的是未与任何其他分区捆绑的产品特定模块。


(3) Vendor Image

包含与SoC 相关的特定组件。


(4) ODM Image

并非由 SoC 提供的一组板级组件。通常,SoC 供应商拥有Vendor映像,而ODM制造商拥有 ODM 映像。若并无单独的 /odm 分区,SoC 供应商和 ODM 映像将合并到 /vendor 分区。