如何在牛轧糖的 Android Studio 模拟器 运行 中编辑 /etc/hosts 文件?

How to edit /etc/hosts file in Android Studio emulator running in nougat?

有人知道如何在 nougat 的 android studio 模拟器 运行 中编辑 /etc/hosts 文件吗?我将对其进行编辑,以便可以在我的本地 Web 服务器中使用我的虚拟主机。我尝试使用 adb 通过终端编辑它,但是它返回只读文件系统。也尝试使用 chmod 但仍然失败。

更新: 我还尝试使用 adb 拉取和推送文件 $ ./adb -s emulator-5554 push ~/Desktop/hosts /system/etc/hosts

adb:错误:无法将“/Users/Christian/Desktop/hosts”复制到“/system/etc/hosts”:无法创建文件:只读文件系统

您可以使用 ADB Shell 通过更改访问权限(只读到 RW)来编辑文件

我能够通过使用 -writable-system 启动模拟器并使用 adb remount 重新安装模拟器来编辑 /etc/hosts 文件。之后,模拟器内的主机文件是可编辑的。我尝试 pushing/replacing 文件并成功。

这是我在 OSX 上的工作方式。在阅读了一堆不同的说明之后,似乎没有什么对我有用,直到有人提到你有一个非常狭窄的 window 用于将文件从你的磁盘复制到模拟设备或者它再次变为只读

  1. 启动模拟器。
  2. 在您的终端中为您的设备找到文件夹 "platform-tools"
  3. 准备要复制到设备的主机文件(在我的例子中,我把它放在桌面上)
  4. 把一堆命令串起来快速复制文件。这对我有用 ./adb root && ./adb -s emulator-5554 remount && ./adb -s emulator-5554 push ~/Desktop/hosts /system/etc/hosts 'emulator-5554' 是我的设备名称,您可以通过键入 ./adb devices
  5. 找到它

之后终端响应

restarting adbd as root remount succeeded [100%] /system/etc/hosts

您可以通过 ./adb shellcat /system/etc/hosts

确认复制成功

然后我可以从模拟设备连接到我的虚拟主机

为了完整起见,我的主机文件看起来像这样 10.0.2.2 my-virtual-host

我希望这对某人有所帮助,因为我花了很多时间试图解决这个问题。

遵循以下 3 个步骤:

  1. 以可写模式启动模拟器:./emulator -avd <emulator_name> -writable-system
  2. 重新挂载:adb remount
  3. 推送主机文件 attached : adb push hosts /system/etc/

注:

  1. 运行 一个并且只有一个 emulator_name 上面的步骤
  2. 可执行文件 emulator 位于 android-sdk 中。对我来说是 sdk/emulator.
  3. 附加的主机文件会将 www.facebook.com 解析为 127.0.0.1,因此会在模拟器上阻止 www.facebook.com
1) android-sdk-macosx/tools/emulator -avd <avdname> -writable-system
2) ./adb root
3) ./adb remount
4) ./adb push <local>/hosts /etc/hosts

Android 文件主机可以是

/etc/hosts <--- This worked for me
/etc/system/hosts
/system/etc/hosts

检查

1) ./adb shell
2) cat /etc/hosts
3) ping customsite.com

尝试@P.O.W回答,

确保在主机文件的最后一个条目之后有一个空行 如果在主机文件中使用制表符,请将其替换为空格 重新启动 Android 并重试:

adb reboot

循序渐进

  1. 不要用 Google 播放图像创建 AVD。
  2. 例如使用 Google API Intel x86 Atom System Image
  3. 使用以下命令启动模拟器...

    emulator.exe –avd <avd name> -writable-system
    

例如:

    C:\Users\ilyas.mamun\AppData\Local\Android\Sdk\emulator>emulator.exe -avd Pixel_API_25 -writable-system

    emulator: WARNING: System image is writable
    HAX is working and emulator runs in fast virt mode.
    audio: Failed to create voice `goldfish_audio_in'
    qemu-system-i386.exe: warning: opening audio input failed
    audio: Failed to create voice `adc'
  1. 根目录并重新挂载 AVD,如下所示…

    C:\Users\ilyas.mamun\AppData\Local\Android\Sdk\platform-tools>adb root
    
    C:\Users\ilyas.mamun\AppData\Local\Android\Sdk\platform-tools>adb remount
    remount succeeded
    
    C:\Users\ilyas.mamun\AppData\Local\Android\Sdk\platform-tools>adb shell
    eneric_x86:/ # cd system
    generic_x86:/system # cd etc
    generic_x86:/system/etc # cat hosts
    127.0.0.1       localhost
    ::1             ip6-localhost
    
    generic_x86:/system/etc # echo "192.168.1.120   ilyasmamun.blogspot.com" >> hosts
    generic_x86:/system/etc # cat hosts
    
    127.0.0.1       localhost
    ::1             ip6-localhost
    192.168.1.120     ilyasmamun.blogspot.com
    generic_x86:/system/etc #
    
place all these export in z shell using terminal

vim ~/.zshrc     press enter

then zshell will open

then press i 

past all the export (verify the path i have used all default location for instalation)

then press esc

then press this :wq!  

press enter 

close terminal and open it again


export PATH="$PATH:$HOME/Dev/flutter/bin"
export GEM_HOME=$HOME/.gem
export PATH=$GEM_HOME/bin:$PATH

export ANDROID_HOME=$HOME/Library/Android/sdk
export ANDROID_SDK_ROOT=$HOME/Library/Android/sdk
export PATH=$PATH:$ANDROID_HOME/emulator
export PATH=$PATH:$ANDROID_HOME/tools
export PATH=$PATH:$ANDROID_HOME/tools/bin
export PATH=$PATH:$ANDROID_HOME/platform-tools



only use google apis image do not usese play image

u will get list of avds 
emulator -list-avds

emulator -avd Nexus_5_API_29 -writable-system  (do not close terminal) (open a new terminal)

adb root
adb remount

copy mac host file to Downloads  from  /private/etc/hosts

adb push Downloads/hosts /system/etc/hosts
adb reboot  

繁琐但有效,您可以在模拟器中逐行构建一个新的主机文件 shell。

重新安装模拟器

您可以在 PC/Mac/linux 命令行/powershell/终端中 edit/remount 您的模拟器(以获得可写文件系统)。

(如果模拟器已经 运行ning,请停止模拟器,然后...):

emulator -avd <avdname> -writable-system

(这会启动一个带有可写文件系统的新模拟器)

仍在您的 PC/Mac/Linux 终端中 运行 这两个命令:

adb root

adb remount

然后通过 shell:

连接到您的 运行ning 模拟器

adb shell

下面这部分 运行 来自您的模拟器内部,在您刚刚建立的 shell 连接内。

给自己root权限:

su

将目录更改为保存 hosts 文件的目录:

cd /etc

要让您的模拟器遵从开发机器的主机文件或给定域的 DNS,请使用 10.0.2.2.

的 ip 添加域条目

将新域条目行附加到模拟器主机文件的示例:

echo '10.0.2.2 mydev.domain.com' >> hosts

10.0.2.2 是 Android 模拟器的特殊地址。它将将该域的 DNS 请求代理到您的开发机器。因此,无论您的 PC/Mac/Linux 机器托管 mydev.domain.com 文件列表的 IP 地址是什么,Android 模拟器都会使用它。

您现在可以退出 root shell 和您的模拟器 shell:

exit
exit

(第一次让你退出 su。第二次退出模拟器 shell,让你回到开发机器的终端)。

大功告成。您可以在模拟器中打开网络浏览器,在地址栏中输入刚刚添加到主机的域,然后检查模拟器是否正确路由该域。

Remount failed

如果您使用的是 Android 模拟器 29+ 并获得

remount failed

调用 adb remount 时,查看

以下是我在 Windows 机器上的 Windows 终端上执行的步骤: 运行 以下命令可了解您的 AVD:

emulator -list-avds

运行以下命令打开模拟器为可写模式:

emulator -avd Pixel_XL_API_29 -writable-system -no-snapshot-load

将 Pixel_XL_API_29 替换为您的 AVD 名称。

忽略那里的警告。

在新的终端选项卡中 运行 以下命令:

  • adb root
  • adb shell avbctl 禁用验证
  • adb 重启

等待您的模拟器重新启动。最多可能需要 1 分钟。

当模拟器重新启动时,运行以下命令:

  • adb root
  • adb 重新挂载

之后您将收到重新安装成功的消息:

现在是时候将我们的主机文件从 Windows 机器推送到 Android 的模拟器

adb push D:\hosts /system/etc/

D:\hosts 是我 Windows 机器的 D 驱动器中主机文件的位置。 /system/etc/ 是 Android 模拟器中我们要复制该文件的位置。

操作成功后您会看到如下信息:

要验证主机文件是否已推送,您可以运行以下命令:

  • 亚行shell
  • cd系统
  • 光盘等
  • 猫主机

您将在终端中看到主机文件的内容:

  1. 首先找到你的系统hosts文件,复制到桌面

  2. 然后用系统映像Nougat x86_64 Android 7.1.1(非Google API版本)创建一个虚拟设备Nexus 5已创建

  3. 然后在终端中转到 /Android/sdk/emulator 然后 运行 下面的代码请在下面添加你自己的设备名称,因为我的是 Nexus_S_API_25 =>

  • ./emulator -writable-system -netdelay none -netspeed full -avd Nexus_S_API_25
  1. 之后打开一个新的终端并转到这个位置 /Android/sdk/platform-tools
  • 然后 运行
  • ./adb root
  • ./adb remount
  • ./adb push ~/Desktop/hosts /system/etc/hosts -(它将复制您的 Desktop/hosts 文件并将其粘贴到您的模拟器主机文件中,即 /system/etc/hosts)
  1. 就是这样,您的模拟器主机文件已更新现在,如果您想重新检查 运行 下面的代码
  • ./adb shell
  • cat /system/etc/hosts(它会显示模拟器主机文件)
  1. 重新启动模拟器以查看更改
  • ./adb reboot

解决这个问题的另一种方法是使用 adb 命令行工具。

  1. 确保路径 emulatortools
export ANDROID_HOME="/Users/YOUR_USERNAME/Library/Android/sdk"
export PATH=$ANDROID_HOME/emulator:$ANDROID_HOME/tools:$PATH

编辑: 对于 Windows 应该是这样的(而不是工具所需的平台工具 [或 adb[=47= 的路径]居住])

C:\Users\YOUR_USERNAME\AppData\Local\Android\sdk\platform-tools
C:\Users\YOUR_USERNAME\AppData\Local\Android\sdk\emulator
  1. 检查设备名称(最好是没有空格的短名称,例如 API30X86)
emulator -list-avds
  1. 然后使用以下参数启动模拟器:
emulator -avd YOUR_AVD_NAME -writable-system -no-snapshot-load -no-cache
  1. 运行以下命令运行作为root重新挂载分区系统作为root
adb devices  #you should see your devices
adb root
adb shell avbctl disable-verification
adb reboot
adb root
adb remount 
  1. 重新挂载后,您应该可以将编辑后的主机文件从您的机器推送到模拟器。
adb push ~/Documents/hostsandroid /etc/hosts

现在您应该可以使用 Android Studio 中的 Device File Explorer 查看您的 hosts 文件。
编辑:在这种情况下,您没有看到设备文件资源管理器,如果检测到 Android 框架,您可以检查事件日志。如果是这样,请单击“配置”,然后您就完成了。


当您要再次 运行 并使用新会话推送新更改时,您只需要做:
adb root
adb remount 
adb push ~/Documents/hostsandroid /etc/hosts