android - Genymotion 模拟器每次启动时都会收到不同的 IP

标签 android virtualbox genymotion

我最近注意到 Genymotion 模拟器virtual box 配置有问题。到目前为止,我只使用了一个 genymotion 模拟器,一旦我开始,它就一直有一个静态 IP 地址,我的 Java 脚本自动化测试没有给我任何问题,因为它被配置为准确地调用这个 IP 并在模拟器上运行测试。最近我决定将其他几个模拟器添加到我的列表中,现在那些 IP 搞砸了。有时来自一个设备(如果它关闭)的 IP 被分配给另一个模拟器,或者来自最后创建的模拟器的 IP 被分配给第一个等等。假设列表中有 4 个设备;我注意到 IP 分配的优先顺序。如果我启动 virtual box,打开 genymotion 并启动第一个设备,它会得到 192.168.155.101 ;第二台设备 192.168.155.102 ;第三台设备 192.168.155.103 ;分别依此类推。但是如果我关闭然后再次打开 genymotion 和虚拟框,决定首先启动第四个设备,它从第一个 192.168.155.101 获取 IP 地址,这给我带来了 Appium/Selenium 脚本的配置问题。是否可以将某些 IP 分配给 genymotion 中的特定设备,以便在重新启动 virtual box 和 genymotion 后它们将相同?

最佳答案

从您的帖子中,我不确定您使用的是哪种主机操作系统。我在 Linux(Ubuntu 16.04)上。如果您在其他方面,细节可能与以下内容不同,但概念是相同的。

Genymotion 依赖于 VirtualBox 仅主机适配器(例如,vboxnet0 和子网 192.168.56.0,如果您运行的是典型的 Linux 主机)adb连接到 Android Studio 之类的东西。当您部署 Genymotion VM 时,将创建此适配器并在其上启用 VirtualBox 内置的 DHCP 服务器。因此,启动后,您会看到类似这样的多个 VM 已启动:

$ adb devices
List of devices attached
192.168.56.101:5555 device
192.168.56.102:5555 device

只要您不重启 VirtualBox,您可以关闭并重启这些虚拟机,它们每次都会获得相同的地址。但是,正如您所观察到的,如果您重新启动 VirtualBox,则不会内存它们以前的地址,寻址将取决于引导顺序。

大多数功能齐全的 DHCP 服务器(即使是廉价家用路由器中的服务器)都允许为固定 IP 租用进行 MAC 注册。不幸的是,就目前而言,内置的 VirtualBox DHCP 服务器不支持此功能。

我的一个解决方法是在连接到 VM 的仅主机网络上禁用 VirtualBox DHCP 服务器,在主机的 vboxnet0 上运行我自己的监听。适配器,并将其配置为根据各自的 MAC 地址为 Genymotion 虚拟机提供固定 IP。您可以在 File->Preferences->Network->Host-only Networks 下为 VirtualBox host-only 适配器禁用 DHCP。我主机上的 DHCP 服务器配置文件的 fragment 如下所示:

subnet 192.168.56.0 netmask 255.255.255.0 {
  range 192.168.56.101 192.168.56.200;
}

host n5_2 {
  hardware ethernet 08:00:27:1F:F2:7E;
  fixed-address 192.168.56.123;
}

哪里192.168.56.0指的是vboxnet0子网分配,以及 hardware ethernet地址是在设置->网络->适配器 1 的高级部分中显示的地址,用于您希望为其分配固定 IP 的每个虚拟机。

除了一个严重的问题外,这基本上是可行的:Genymotion Launcher 会在每次启动 VM 时检查网络配置。当它看到 VM 使用禁用 DHCP 的仅主机适配器时,它将创建一个启用 DHCP 的新适配器(例如 vboxnet1 ,子网 192.168.57.0 ),并更改 VM 的网络配置以指向此适配器。因此在启动后,您将拥有这个(注意与以前相比新的子网 .57):

$ adb devices
List of devices attached
192.168.57.101:5555 device
192.168.57.102:5555 device

在我试验的短时间内,我发现防止 Genymotion 启动器在启动时更改网络设置的唯一方法是在启动每个 VM 时打开相应的 VirtualBox 设置 面板Genymotion 启动器。我想打开它会对配置文件进行某种锁定,使 Launcher 无法更改任何内容。当我这样做时,VM 设置为使用非 DHCP 适配器并且我的主机 DHCP 服务器配置如上,一台设备根据 DHCP 配置获取固定 IP,而其他设备根据启动顺序获取地址:

$ adb devices
List of devices attached
192.168.56.101:5555 device
192.168.56.123:5555 device

如果您可以在您的主机上设置 DHCP 服务器,并且不介意每次启动每个 VM 时都打开设置面板,我想您可以考虑这是一种解决方法。对我来说,这不是很实用,更好的选择包括:

  1. VirtualBox 在其内置的 DHCP 中添加了对 MAC 注册的支持 服务器。
  2. Genymotion 在启动期间删除(或可选)配置检查。
  3. 弄清楚如何/为什么打开设置会锁定 VM 配置,然后永久锁定它。

关于android - Genymotion 模拟器每次启动时都会收到不同的 IP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36985684/

相关文章:

android - 是否有适用于 Android 和 iPhone 的框架

react-native - 使用 Genymotion 模拟器在 Ubuntu 上运行 React-Native Android 应用程序

c++ - 虚拟机中的OpenGL问题

android - 如何在 OS X 上使用 Genymotion 拖放支持?

android - 无法初始化 OpenGL 渲染器库

java - Android Studio : Working with parameters

android - 同一 View 中的两个 Activity

android - Square okHTTP 证书固定 - sslSocketFactory 错误

linux - Grails run-app 在 VM VirtualBox : hangs on build, 上失败无法访问服务器

Mysql虚拟机远程连接失败