这两个问题问得非常精准!直接触及了 Android 系统开机初始化(init阶段)的核心时序。
以下为你详细解答这两个问题:
一、on post-fs是系统的什么阶段?
在 Android 系统开机时,init进程会按照严格的时间轴顺序依次执行各个阶段。on post-fs是开机极早期(开机第 0.5 秒左右)的一个阶段:
开机时间轴(从早到晚): 1. on early-init <-- 极早期(初始化 SELinux、创建最基础设备节点) 2. on init <-- 初始化阶段(挂载 /proc, /sys 等虚拟文件系统) 3. on post-fs <-- 【这里!】(System 分区/根文件系统刚挂载完成,绝大多数服务和 USB 都还没启动) 4. on post-fs-data <-- Data /用户分区挂载并解密完成 5. on boot <-- 系统服务准备启动(SurfaceFlinger、Zygote 等) 6. on boot_completed <-- 整个 Android 系统开机完成(显示桌面)on post-fs的特点:
它是系统刚把/system磁盘镜像挂载好的时刻。此时USB 总线还没有初始化,任何 USB 设备都还没有向外发车(还没写 UDC)。
二、 为什么要把 1setprop vendor.usb.vid "0x0E8D"等加在on post-fs` 阶段?
1.setprop vendor.usb.vid "0x0E81"本身是什么意思?
VID=VendorID(USB 厂商识别码)。0x0E8D是MediaTek(联发科)官方注册的 USB 厂商 ID。- 这行代码的意思是:把子 设备 的 USB 厂商 ID 明确指定为联发科的 0x0E81。
2. 为什么要从后面的on boot提前到on post-fs阶段?(深层原因)
注意看你们 diff 代码里删掉的部分(第 57~66 行):
你们原来把setprop vendor.usb.acm_cnt 1和acm_enable 1写在后面的on boot阶段。
提前到on post-fs有两大核心好处:
作用 A:防止开机中途 USB 闪断(避免 ADB 开机中途掉线)
- 如果写在后面的
on boot:
开机头 2 秒,系统属性还没设置,USB 会先按照“默认纯 ADB 模式”发车;等 3 秒后运行到on boot阶段,属性突然变成了acm_cnt=1,系统又强行解绑 UDC 重新按照“三合一模式”发车。
结果:导致电脑/母 设备看到子 设备在开机中途突然“闪断”重连了一次(ADB 中途断开)。 - 提前到
on post-fs(开机第 0.5 秒):
在 USB 硬件这辈子第一次发车之前,就把 VID、ACM 端口数(acm_cnt=1)、开启串口(acm_enable=1)全部预置好!
结果:第一次发车就是完美的ums_adb_acm三合一模式,开机过程中一次闪断都没有!
作用 B:确保后续的on property:...规则 100% 成功匹配
在文件后面有这样一行规则:on property:sys.usb.config=adb && property:vendor.usb.acm_enable=1 ...
如果acm_enable放在后面的on boot才设置,当sys.usb.config=adb触发时,acm_enable还是 0,导致整段规则直接被跳过!
提前在on post-fs设置好,能保证后续所有的条件判断在触发时acm_enable已经是 1 了,100% 必定匹配成功!