之前『一文带你简单了解 Hosts』文末提到会带来 Hosts 修改教程系列文章,在『Windows 修改 Hosts』和『macOS 修改 Hosts』之后,你以为这个系列就结束了?不,我又回来了。
这一次,是 Android 系统修改 Hosts 教程。
这篇文章其实机缘巧合,因为我在 Android 开发中刚好需要通过修改 Hosts 来跟后端工程师配合测试,所以这篇文章就正好水到渠成。
因为在 Android 上修改 Hosts 需要获取 ROOT 权限,所以我这次就用模拟器来代替真机演示,使用的是『夜神模拟器』,任何 Android 模拟器都可以使用以下方法操作。
由于现在很多国内 ROM 限制解锁权限,如 EMUI 等,获取 ROOT 权限操作步骤可能相对复杂,就不再花篇幅介绍了,假如你的手机成功获取了 ROOT 权限,以下方法也是适用的。
修改 Android 系统的 Hosts 需要提前准备 ADB(Android Debug Bridge)工具,我本来就是从事 Android 开发的,开发工具中已经集成了 ADB,不需要重新安装,在之前的『Android Device Monitor 权限笔记』中我也使用过它,在此就不过多介绍了。
如果你的电脑上没有 ADB,可以去单独下载;另外,Android 模拟器的安装目录下一般也会有 ADB 工具,配置到系统环境中即可。
首先,先用终端查看连接的设备:
➜ adb devices
许多模拟器在初次使用 ADB 连接时都不一定能连接上,可以自行搜索对应的解决方法,最常见的就是需要执行 adb connect
命令连接到对应的端口,也有可能遇到 ADB 版本不一致的问题,使用模拟器目录下的 ADB 或者将正在使用的 ADB 工具覆盖模拟器的 ADB 即可。
通过 ADB 正确连接上 Android 模拟器后,接下来就是修改 Hosts。
Hosts 目录为:/system/etc/hosts
,在一切开始之前,我们还需要一个额外步骤,执行命令:
➜ adb remount
与其他系统一样,Android 对于 Hosts 文件的处理也是需要权限的,这条命令的作用是重新挂载 /system
分区为可读写。
然后通过命令将 Hosts 文件拉取到本地:
➜ adb pull /system/etc/hosts D:/hosts
这是一个常用的 ADB 命令,用于将手机上的文件复制到本地:
➜ adb pull {手机文件路径} {本机目录}
默认情况下 Hosts 里面只有两行内容:
127.0.0.1 localhost
::1 ip6-localhost
跟之前一样,直接在下面追加自己的 Hosts。然后推回去:
➜ adb push D:/hosts/hosts /system/etc/hosts
这也是一个常用的 ADB 命令,用于将本地的文件复制到手机:
➜ adb push {本机文件路径} {手机目录}
这里还有一个需要注意的点,不同于 Windows 和 macOS,在 Android 中修改 Hosts 一定要在文件末尾增加一个空行,假如你没有追加,Hosts 不会生效,而当你重新将 Android 设备的 Hosts 文件拉到本地你又会确认自己已经修改了,如此死循环导致你根本发现不了问题。
那这个问题我是如何发现的呢?
很简单,不通过拉取文件来查看,因为你在电脑推到手机的文件,再拉回到电脑,依然是符合电脑的规范的,你需要知道 Android 是如何处理这个 Hosts 文件的。
依然需要通过 adb
命令来查看手机上的 Hosts 文件:
➜ adb shell
➜ cat /system/etc/hosts
解释一下,adb shell
很简单,就是进入 Shell 模式,之前在『Android Device Monitor 权限笔记』中也使用过了。
你可能会好奇,在『Android Device Monitor 权限笔记』中执行完 adb shell
后还需执行 su
来切换至超级管理员,为什么这里不需要呢?
因为大部分模拟器默认就已经开启 ROOT 了所以不需要 su
来获取 ROOT 权限:
进入 Shell 后通过 cat
命令来查看文件内容。
默认情况下,查询结果如下:
假如添加完内容后,不追加一个空行,会得到如下结果:
发现了吗,下一条命令的输入位置跟在了最后一行 Hosts 内容之后,这就是导致 Hosts 不生效的原因,所以一定要确保 Hosts 文件最后一行为空行。
对文件的 push
和 pull
有点太麻烦,我更喜欢用命令来做写入操作:
➜ adb shell
➜ echo -e \\n >> /system/etc/hosts
➜ echo ***.***.***.*** www.domain.com >> /system/etc/hosts
通过 echo
写入一个换行符 \n
,这个程序员都不陌生了,实际上这个换行符不是必须的,不过是为了防止原 Hosts 末尾没有换行罢了,再把对应的 Hosts 写入,使用这条命令追加 Hosts 会自动在文件末尾追加一个空行,所以不用担心会出现上面的问题。如果要增加多个 Hosts 则重复最后这步即可。
前面用来查看文件内容的 cat
这个命令是否看起来有些许熟悉?
没错,我们之前在『macOS 修改 Hosts』中也有使用过,实际上,我们同样可以使用之前提到过的 vi
命令做修改:
➜ adb shell
➜ vi /system/etc/hosts
也是相同的命令,使用 i
进行插入修改,点击 Esc
退出编辑,再键入 :wq
并回车执行保存退出。
我尝试了一下『macOS 修改 Hosts』中使用过的 nano
命令,发现并不支持。
对于判断 Hosts 文件是否生效,我们还可以直接在 Shell 中用 ping
命令查看,比通过浏览器或者网络请求要方便一些。