1. AOSP系统分区布局概述

做Android系统定制,第一件事就是要搞懂分区布局。这就像你要装修房子,总得先知道哪堵墙能拆、哪根梁不能动吧?

我刚开始接触AOSP时,面对那一堆分区名也是一头雾水。boot、system、vendor、userdata...每个分区干什么用?为什么Google要这么分?今天我就带你把这事彻底理清楚。

1.1 Android系统分区架构演进

Android的分区架构,说白了就是一部「分分合合」的历史。早期版本简单粗暴,后来为了OTA升级、安全启动、模块化,才慢慢演变成今天的样子。

Android版本 分区架构特点 关键变化
Android 1.0 - 4.4 单系统分区 system、boot、recovery、userdata,简单明了
Android 5.0 - 7.1 引入A/B分区 支持无缝升级,但存储占用翻倍
Android 8.0 - 9.0 Treble架构 system分区拆分出vendor,厂商和系统解耦
Android 10+ 动态分区 super分区出现,逻辑分区取代物理分区
Android 12+ 虚拟A/B 结合动态分区和A/B,节省空间又支持无缝升级

为什么会这样演进?我个人的理解是:Google一直在平衡「升级体验」和「存储成本」。早期手机存储小,能省则省;现在存储大了,用户对升级体验的要求也高了。

核心观点:分区架构的演进,本质上是Android从「单设备单系统」走向「多设备统一平台」的过程。Treble架构是分水岭,它让厂商和Google可以各自独立更新。

1.2 各分区功能与作用

好,咱们来看看每个分区具体干什么活。我按启动顺序来讲,这样你更容易理解。

boot分区

这是手机启动的第一站。里面装着Linux内核和ramdisk。没有它,手机就是一块砖头。

我记得有一次做定制,不小心把boot分区刷错了,结果手机卡在开机logo死活进不去。嗯,从那以后我刷boot分区前都会先备份一份。

system分区

这是Android系统的核心。所有系统应用、框架、库文件都在这里。在Treble之前,system分区几乎包含了整个系统。

但有个问题——厂商的硬件驱动也塞在system里。这就导致Google更新系统时,厂商必须跟着更新驱动,效率极低。

vendor分区

Treble架构引入后,vendor分区专门放厂商的硬件相关代码。说白了,就是「Google管系统,厂商管硬件」,各管各的,互不干扰。

我建议你在做定制时,尽量把硬件相关的改动放在vendor分区,这样后续升级系统会省很多事。

product分区

Android 9之后新增的。用来放厂商预装的应用和产品定制内容。比如运营商定制、地区定制等。

userdata分区

用户数据分区。你装的应用、拍的照片、下载的文件,全在这里。恢复出厂设置时,清的就是这个分区。

cache分区

缓存分区。OTA升级时用来存放临时文件。现在动态分区普及后,这个分区用得越来越少了。

recovery分区

恢复模式分区。里面有个迷你系统,用来执行系统更新、恢复出厂设置等操作。

misc分区

杂项分区。很小,用来存一些启动相关的标志位。比如「是否进入recovery模式」这种。

避坑指南:我曾经在定制时不小心改动了misc分区的内容,结果手机每次重启都自动进recovery。排查了半天才发现是misc分区里的bootloader消息被写坏了。所以,misc分区能不动就别动。

1.3 分区布局对系统定制的影响

搞清楚了分区是干什么的,咱们再来聊聊它对定制的影响。这其实是个「牵一发而动全身」的事。

影响一:OTA升级策略

你想想看,如果你的定制改了system分区的内容,那OTA升级时就得考虑这些改动会不会被覆盖。我一般建议:

  • 系统级改动放system分区,但要做好升级时的合并策略
  • 硬件相关改动放vendor分区,这样升级系统时不受影响
  • 预装应用放product分区,方便单独更新

影响二:存储空间分配

每个分区的大小是固定的(动态分区除外)。你给system分区多分一点,userdata分区就少一点。这是个零和博弈。

我遇到过不少项目,前期没规划好分区大小,后期发现system分区不够用,只能重新刷机调整。所以,我建议你在项目初期就估算好各分区的大小需求。

影响三:安全启动链

Android的安全启动是链式验证的:bootloader验证boot分区,boot分区验证system分区...一环扣一环。如果你改了某个分区的内容,但没有更新对应的校验值,手机就会启动失败。

重要提醒:做系统定制时,一定要考虑安全启动链。我曾经见过有人改了vendor分区的内容,结果手机一直报「dm-verity verification failed」。最后只能关掉dm-verity验证,但这样安全性就大打折扣了。

影响四:多系统支持

有些定制方案需要支持多系统启动(比如双系统)。这时候分区布局就更复杂了。你需要为每个系统准备独立的boot、system、vendor分区,还要有个共享的userdata分区。

1.4 动态分区与虚拟A/B

最后聊聊最新的动态分区和虚拟A/B。这是Android 10之后的大趋势。

动态分区的核心思想是:不再使用固定大小的物理分区,而是用一个super分区来动态管理。system、vendor、product这些分区都变成了super分区里的「逻辑分区」。

这样做的好处很明显:

  • 分区大小可以灵活调整,不用再担心「system分区不够用」
  • OTA升级时,可以只更新有变化的部分,节省空间
  • 支持虚拟A/B,既有无缝升级的体验,又不用双倍存储空间

虚拟A/B就更巧妙了。它不像传统A/B那样准备两套完整的分区,而是只保留一份数据,升级时用「写时复制」的方式记录变化。升级失败就回滚,升级成功就合并。

我个人觉得,动态分区+虚拟A/B是Android分区架构的终极形态。它解决了之前所有方案的痛点:空间浪费、升级体验差、分区大小固定。

总结一下:搞懂分区布局,是做Android系统定制的基础。你不需要记住每个分区的细节,但一定要理解它们之间的关系和影响。特别是当你需要修改某个分区时,先想想会不会影响到其他分区,会不会破坏安全启动链。

下一章,我会带你深入每个分区的具体内容,看看里面到底装了些什么,以及如何安全地修改它们。