SDK30及以上安卓模拟器hosts文件恢复默认的原因与解决咨询
Android 11+(SDK30+)模拟器Hosts修改后仅带-writable-system启动才生效的原因及解决办法
原因分析
从Android 11(API 30)开始,谷歌对系统分区权限做了严格限制:
- 默认情况下
/system分区是只读状态,模拟器启动时会直接加载原始系统镜像文件,不会保留之前的修改。 - 只有添加
-writable-system参数启动时,模拟器才会创建一个可写的系统覆盖层,你的hosts修改会被存储在这个覆盖层中,启动时才会生效。 - SDK30以下版本没有这种分区保护机制,修改直接写入原始系统镜像,所以重启后修改能保留。
解决办法
1. 永久修改系统镜像(一劳永逸)
直接修改模拟器的原始system.img文件,后续任何启动方式都会生效:
- 关闭模拟器,找到AVD的存储目录:
# Windows C:\Users\<你的用户名>\.android\avd\Pixel_4a_API_34.avd\ # macOS/Linux ~/.android/avd/Pixel_4a_API_34.avd/ - 执行以下命令修改镜像:
# 检查镜像完整性 e2fsck -f system.img # 创建临时挂载目录 mkdir temp_system # 挂载镜像到临时目录(需root权限) sudo mount -o rw,loop system.img temp_system # 替换hosts文件 sudo cp /path/to/your/custom/hosts temp_system/etc/hosts # 卸载挂载 sudo umount temp_system rm -rf temp_system
2. 配置默认启动参数
让模拟器每次启动自动带上-writable-system:
- Android Studio AVD管理器:
- 打开AVD管理器,点击目标模拟器的「编辑」按钮(铅笔图标)
- 进入配置页后,点击「Show Advanced Settings」
- 在「Emulator launch parameters」输入框中添加
-writable-system,保存即可
- 自定义启动脚本:
编写脚本快速启动模拟器,比如创建start_emulator.sh:
每次运行脚本启动模拟器即可。emulator -avd Pixel_4a_API_34 -writable-system
3. 借助Magisk实现持久化修改(需root)
如果模拟器已root,用Magisk的模块机制挂载修改:
- 给模拟器刷入Magisk(可通过adb推送Magisk包并刷入)
- 安装Magisk模块仓库中的「Hosts」类模块,或使用「Hosts Go」等工具导入自定义hosts
- Magisk会通过挂载覆盖的方式替换系统默认hosts,无需依赖
-writable-system参数,重启后修改依然保留
内容的提问来源于stack exchange,提问作者Goltra
相关产品推荐
相关产品推荐

