如何在Android模拟器中修改vendor.img内容并使其正常挂载生效
自定义vendor.img模拟器挂载异常解决方案
根因说明
你对-vendor参数的基础功能理解没有偏差,出现哈希不匹配是AOSP模拟器默认机制导致的:
- AVD启动后会默认缓存分区状态到本地快照,后续启动会优先加载快照内容,不会读取新的镜像文件
- 新版AOSP模拟器默认开启VendorOverlay特性,/vendor分区实际是overlayfs挂载的合并层,底层镜像的变更会被上层临时缓存覆盖
- 支持动态分区的AOSP版本中,init进程默认从
super.img内嵌的vendor分区挂载,-vendor参数指定的独立块设备不会被主动挂载 - 若自制vendor.img的文件系统格式、分区校验签名和当前编译的AOSP版本不匹配,系统挂载失败后会自动fallback到内置的原始vendor镜像
操作步骤
按以下顺序执行,即可让/vendor目录和自定义镜像完全一致:
- 清理AVD历史缓存
启动模拟器时必须添加-wipe-data参数,彻底清除之前的快照、用户数据和分区缓存,避免加载旧状态:
emulator -wipe-data -vendor /path/to/my/vendor.img
如果仍不生效,额外添加-no-snapshot参数完全禁用快照功能。
- 关闭VendorOverlay特性
启动时添加-feature -VendorOverlay参数,强制系统直接挂载底层vendor块设备,不叠加临时可写层:
emulator -wipe-data -no-snapshot -vendor /path/to/my/vendor.img -feature -VendorOverlay
- 动态分区机型改用super.img替换方案
如果你的AOSP版本使用动态分区机制,需要将自定义vendor.img重新打包进super.img后通过-super参数指定:
- 使用AOSP编译输出的
lpmake工具,将自定义vendor.img打包为新的super.img - 启动命令替换为:
emulator -wipe-data -no-snapshot -super /path/to/custom_super.img -feature -VendorOverlay
- 挂载结果校验
模拟器启动后执行adb shell mount | grep vendor,确认输出中挂载源为对应块设备而非overlay,此时再校验/vendor目录下的文件哈希即可和自定义镜像完全匹配。
内容的提问来源于stack exchange,提问作者Adam Miller
相关产品推荐
相关产品推荐

