分区镜像刷写规则
分区镜像刷写规则
在 Android 开发或系统定制中,修改了哪些代码/模块,就需要刷写对应的镜像分区。这是因为 Android 系统被划分为多个逻辑/物理分区(如 boot、system、vendor、super 等),每个分区承载不同层级的组件。
下面从 代码改动类型 → 对应需要刷写的镜像 进行详细说明:
🧩 一、Android 分区结构简要回顾(Android 10+ 动态分区)
| 分区 | 内容 | 是否可单独刷写(传统) | 在动态分区中 |
|---|---|---|---|
boot |
内核(kernel) + ramdisk(init、fstab 等) | ✅ 是 | ✅ 仍独立 |
system |
AOSP 核心框架、系统 App(Settings、SystemUI)、Java/Kotlin 代码 | ✅(旧) ❌(新,合并进 super) |
合并到 super |
vendor |
芯片厂商闭源驱动、HAL 实现、专有库(如 camera HAL、audio HAL) | ✅(旧) ❌(新) |
合并到 super |
product |
OEM 定制 App、配置(如 Google Pixel 的额外服务) | ❌(旧无) | 合并到 super |
odm |
ODM 厂商定制(如模组适配) | ❌(旧无) | 合并到 super |
vbmeta |
AVB(Verified Boot)签名元数据 | ✅ | ✅ 独立 |
userdata |
用户数据 | —— | —— |
🔔 关键点:
- **Android 10+ 启用动态分区后,
system、vendor、product、odm等逻辑分区不再对应独立物理分区,而是打包进super.img**。- 因此,是否刷
super.img还是单独刷system.img,取决于设备是否启用动态分区。
🛠️ 二、按代码修改类型决定刷哪个镜像
1. 修改了 Linux 内核(Kernel)或设备树(Device Tree / DTS)
- 位置:
kernel/,device/<vendor>/<device>/kernel/,.dts文件 - 影响:启动流程、驱动、电源管理、内存布局等
- ✅ 必须刷:
boot.img - 💡 说明:
boot.img包含压缩后的内核(zImage/Image.gz)和初始 ramdisk。即使只改一行 DTS,也需重新打包boot.img并刷入。
2. 修改了 AOSP 框架层 Java/Kotlin 代码
- 位置:
frameworks/base/,packages/SystemUI/,packages/apps/Settings/等 - 影响:系统 UI、API 行为、权限控制、广播机制等
- ✅ 必须刷:
- 非动态分区设备:
system.img - 动态分区设备(Android 10+):
super.img
- 非动态分区设备:
- 💡 注意:仅替换 APK 有时可通过
adb install -r -d调试,但涉及 framework API 变更时必须刷 system/super。
3. 修改了 HAL(硬件抽象层)或 vendor 专有库
- 位置:
hardware/interfaces/(HIDL/AIDL HAL),vendor/<chipset>/,device/<vendor>/<device>/sepolicy/ - 影响:摄像头、传感器、蓝牙、Wi-Fi、音频等硬件功能
- ✅ 必须刷:
- 非动态分区:
vendor.img - 动态分区:
super.img
- 非动态分区:
- ⚠️ 特别注意:如果 HAL 接口版本变更(如从
ICamera@3.4升级到3.5),system 和 vendor 必须同步更新,否则会因 binder 接口不匹配导致 HAL 加载失败(常见 crash:dlopen failed或hidl died)。
4. 修改了 init 脚本、fstab、ueventd 规则等
- 位置:
system/core/rootdir/,device/<vendor>/<device>/rootdir/,fstab.<device> - 影响:分区挂载、服务启动顺序、设备节点权限
- ✅ 必须刷:
boot.img(因为这些文件被打包进 ramdisk) - 💡 例如:改了
init.rc或fstab.qcom,就要重打包boot.img。
5. 修改了 SELinux 策略(sepolicy)
- 位置:
system/sepolicy/,device/<vendor>/<device>/sepolicy/ - 影响:进程权限、文件访问控制
- ✅ 通常需刷:
- 如果策略编译进 ramdisk(旧方式)→ 刷
boot.img - 如果策略放在 system/vendor(新方式)→ 刷
system/vendor或super.img
- 如果策略编译进 ramdisk(旧方式)→ 刷
- 🔍 判断方法:查看
BoardConfig.mk中BOARD_SEPOLICY_SPLIT是否启用。
6. 修改了 Recovery 相关内容
- 位置:
bootable/recovery/,device/<vendor>/<device>/recovery/ - ✅ 刷:
recovery.img(如果设备支持独立 recovery 分区) - 或:某些设备将 recovery 合并进
boot.img(AVB 2.0 设备),此时需刷boot.img
7. 修改了 AVB(Verified Boot)配置或密钥
- 位置:
external/avb/,device/<vendor>/<device>/avb/ - ✅ 需刷:
vbmeta.img(可能还需--disable-verity参数) - 示例:
1
fastboot flash vbmeta vbmeta.img --disable-verity --disable-verification
📋 三、快速对照表(按修改内容 → 刷什么)
| 修改内容 | 需刷镜像(非动态分区) | 需刷镜像(动态分区,Android 10+) |
|---|---|---|
| Kernel / DTS / init.rc | boot.img |
boot.img |
| SystemUI / Settings / Framework Java | system.img |
super.img |
| Camera HAL / Audio HAL / Vendor lib | vendor.img |
super.img |
| Product-specific apps (e.g., Google Dialer) | product.img |
super.img |
| ODM 配置(如 sensor 校准) | odm.img |
super.img |
| SELinux policy(在 system 中) | system.img |
super.img |
| SELinux policy(在 boot ramdisk 中) | boot.img |
boot.img |
| Recovery UI | recovery.img(如有) |
recovery.img 或 boot.img |
| Verified Boot 密钥 | vbmeta.img |
vbmeta.img |
🔁 四、开发建议
- 不确定改了哪里? → 宁可多刷,比如同时刷
boot+super。 - 频繁调试 system? → 使用
adb remount+adb sync(需 userdebug 编译)避免反复刷机。 - 刷
super.img会覆盖所有子分区,所以比单独刷system更“彻底”,但也更耗时。 - 刷机后卡 Logo? → 检查是否漏刷
boot(内核不匹配)或未清数据(fastboot -w)。
✅ 总结口诀
- 改内核 → 刷 boot
- 改 Java → 刷 system / super
- 改 HAL → 刷 vendor / super
- 改启动脚本 → 刷 boot
- 大版本切换 → 刷 super + -w 清数据
如果你提供具体修改的代码路径(如 frameworks/base/core/java/... 或 kernel/msm-5.4/...),我可以更精准地告诉你该刷哪个镜像。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Fleming's Blog!






