early-init → fs / post-fs → boot → post-fs-data → boot_completed ↑ ↑ ↑ 最早写
persist 应在这里 USB 已启动 你提议的位置(偏晚) 为什么需要early -init? fs又是什么 post-fs是什么
post给谁?pst-fs-data是干嘛的?
这里面涉及到了 Linux / Android 开机启动的英语命名规则与时间线顺序。
把这些英文缩写翻译成大白话,你就瞬间秒懂了:
一、 词源拆解(“fs” 和 “post-” 到底是什么意思?)
fs是什么?fs是FileSystem 的缩写,中文叫“文件系统(分区)”。- 在 Android 里,主要指存储系统代码的只读分区:
/system和/vendor分区。
post-是什么意思?“post给谁”?- 英文前缀
post-的意思就是“在……之后”(After),不是“发送/给”的意思。 post-fs=Post-FileSystem=“在挂载完/system和/vendor系统分区之后”。post-fs-data=Post-FileSystem-Data=“在挂载完/data用户数据分区之后”。
- 英文前缀
二、 Android 开机时间线全景图(从早到晚)
我们把 Android 开机的这几个阶段,按时间的先后顺序排个队:
【开机上电】 │ ▼ 1. early-init (极早期:啥都还没挂载,适合“抢先”改变量) │ ▼ 2. fs (FileSystem:正在挂载 /system 和 /vendor 系统分区) │ ▼ 3. post-fs (在挂载完系统分区“之后”:初始化 Log 和 ConfigFS 目录) │ ▼ 4. boot (USB 初始化的黄金时刻!正式读取 persist 属性并启动 USB) │ ▼ 5. post-fs-data (在挂载完 /data 数据分区“之后”:解密数据库,太晚了!) │ ▼ 6. boot_completed (进入桌面:开机彻底完成)三、 逐个阶段详细解答你的问题:
1. 为什么需要early-init?(最早期)
- 作用:这是 Android 进程 PID 1(
init)刚启动的第一毫秒。此时没有任何硬盘分区被挂载,任何驱动都还没跑。 - 为什么 USB 需要它:正因为它最早,所以在这个阶段写入
setprop persist.sys.usb.config acm,adb,就像抢先下达圣旨!这样当系统过几秒钟走到后面的第 4 阶段(boot)去初始化 USB 时,读取到的就绝对是你抢先写好的acm,adb,而不是系统默认的adb!
2.fs是什么?(文件系统挂载)
- 作用:专门负责把存储芯片里的
/system.img和/vendor.img分区解压并挂载到内存目录里。 - 只有过了这个阶段,系统才能读取到
/system/bin/sh或/vendor/etc/init/里的脚本文件。
3.post-fs是什么?(挂载系统分区之后)
- 作用:在
/system和/vendor分区挂载完毕后立马执行。 - 做的事情:建立
/config/usb_gadget目录(挂载 ConfigFS)、启动logd(日志服务)、设置系统基础权限。
4.post-fs-data是干嘛的?(挂载 /data 分区之后)
- 作用:专门处理手机的
/data用户数据分区(存储你安装的 App、APP数据、加密数据库的地方)。 - 为什么它对 USB 来说“太晚了”:
因为解密并挂载/data分区非常耗时(需要 2~5 秒)。而在它之前的第 4 阶段(boot),系统早已经把 USB 驱动启动过了!如果在post-fs-data里才去改变量,属于“生拉硬扯”,USB 第一次启动必然会跑错路径死锁!
💡 总结
early-init:抢先下达圣旨的地方(抢在 USB 启动前把变量改好)。fs:读取系统文件(挂载/system和/vendor)。post-fs:挂载完系统文件后,创建 ConfigFS 目录。boot:USB 驱动正式根据圣旨启动。post-fs-data:读取用户个人数据(对 USB 启动来说黄花菜都凉了)。