如何编写 genymotion 模拟器来启动给定的无头 avd?
Posted
技术标签:
【中文标题】如何编写 genymotion 模拟器来启动给定的无头 avd?【英文标题】:How can I script genymotion emulator to launch a given avd, headless? 【发布时间】:2013-08-26 02:56:02 【问题描述】:有没有办法通过命令行启动给定的avd
并通过adb
注册?
我也希望模拟器无头启动。
我正在寻找这个来快速运行测试。
【问题讨论】:
主要问题是你在什么平台上运行它,这样你就可以找到Genymotion播放器的可执行文件。 【参考方案1】:这是一个更好的程序。它需要第一次手动启动,但之后,您将在几秒钟内获得极快的 genymotion。以下脚本已在 macos x 上进行了测试。他们可能需要为 linux 做更多的工作。
首先,通过 genymotion 应用程序正常启动 genymotion 模拟器。 然后,从 Virtual box 获取它的 sha1:
VBoxManage list vms
然后,从命令行对其进行快照:
#script genymotion-save.sh
VM=6a5d9245-b751-47aa-b38d-989c5f1a9cfb
echo "VM is \"$VM\""
VBoxManage snapshot $VM take snap1
然后你就可以用这个脚本检测它的ip了(它的复杂性大部分来自mac地址转换):
#script genymotion-detect-ip.sh
VM=6a5d9245-b751-47aa-b38d-989c5f1a9cfb
#find mac of vm
#http://***.com/questions/10991771/sed-to-insert-colon-in-a-mac-address
# Update arp table
for i in 1..254; do ping -c 1 192.168.56.$i 2&>1; done
MAC=`VBoxManage showvminfo "$VM" | grep MAC | grep Host | awk -F ":" 'print $3' | cut -c 2-13`
#echo "MAC is $MAC"
MAC=`echo $MAC | sed -e 's/\([0-9A-Fa-f]\2\\)/\1:/g' -e 's/\(.*\):$/\1/' | tr '[:upper:]' '[:lower:]'`
#echo "MAC is $MAC"
# Find IP: substitute vname-mac-addr with your vm's mac address in ':' notation
IP=`arp -a | sed "s/ \(.\):/ 0\1:/" | sed "s/:\(.\):/:0\1:/g"|sed "s/:\(.\):/:0\1:/g"|sed "s/:\(.\)$/:0\1/"|grep $MAC`
#echo "IP is $IP"
IP=`echo $IP | cut -d "(" -f2 | cut -d ")" -f1`
echo $IP
现在,您已经拥有了从命令行启动 vm 快照并通过 adb(使用 root)连接到它所需的一切。你可以用这个脚本来做:
# script genymotion-start.sh
VM=6a5d9245-b751-47aa-b38d-989c5f1a9cfb
echo "VM is \"$VM\""
VBoxManage snapshot $VM restore snap1 &
VBoxHeadless -s $VM &
IP=`./genymotion-detect-ip.sh`
echo $IP
#adb tcpip 5555
adb connect $IP:5555
#restart adb as root to allow powering it off
#root mode is generally what we want from a headless emulator (to download emma files for instance)
adb root
adb connect $IP:5555
最后你也可以使用脚本正确关闭模拟器:
#script genymotion-stop.sh
IP=`./genymotion-detect-ip.sh`
adb root
adb connect $IP:5555
adb shell reboot -p &
这仍然是很多脚本,但它工作正常,并以方便的方式控制 genymotion 模拟器。
让我们希望 genymobile 可以在未来的版本中让这个夜晚变得更容易。
【讨论】:
这些脚本工作正常(谢谢)...但是屏幕截图会产生失真的图像(基于 VBoxManage controlvm 的捕获和基于 adb shell /system/bin/screencap 的捕获都会产生相同的失真图像)。以这种方式启动 vm 时,有什么方法可以让屏幕上的比例和元素正确显示? 这是一个很好的问题。我猜 geny mobile 直到现在还没有真正考虑到这个用例。也许对您来说更好的解决方案是使用带有帧缓冲区显示的虚拟框。我想它可以更好地工作,因为它将是一个通用的 X11 impl。 我猜 genymotion 正在操纵虚拟框的视频输出来显示它——我无法想象如何通过命令行启动 vm 实例(无头或不是)并获得与 genymotion 启动实例时相同的显示输出。尝试在 VirtualBox、GenyMotion 和 android 设备之间进行各种版本组合,以防遇到其他人没有遇到但还没有运气的极端情况。 你可以使用这个VBoxManage guestproperty get '6a5d9245-b751-47aa-b38d-989c5f1a9cfb' androvm_ip_management
而不是detect-ip脚本,这将返回一个不错的ip,即使你的vm名称有空格,单引号也会给你正确的值.您可以选择将 uuid 留在其中。
@Sojurn,你会写自己的答案并提供可重用的脚本吗?【参考方案2】:
对于寻找非无头命令行启动的其他人:
/Applications/Genymotion.app/Contents/MacOS/player --vm-name "xxxx"
获取虚拟机列表:
$ VBoxManage list vms
"Galaxy Nexus - 4.2.2 - API 17 - 720x1280" 56d8e3aa-ecf8-483e-a450-86c8cdcedd35
其中 xxxx 可以是名称或 id:
/Applications/Genymotion.app/Contents/MacOS/player --vm-name 56d8e3aa-ecf8-483e-a450-86c8cdcedd35
/Applications/Genymotion.app/Contents/MacOS/player --vm-name "Galaxy Nexus - 4.2.2 - API 17 - 720x1280"
你可以用普通的进程杀掉它:
ps | grep "Genymotion\.app/Contents/MacOS/player" | awk 'print $1' | xargs kill
【讨论】:
很好,您如何处理 IP 地址?你需要它来让 adb 连接到 genymotion.. 在 genymotion 设置中确保设置了“Android SDK 的路径”,然后确保选中“当虚拟设备启动时,将其自动连接到 ADB”。当使用 genymotion player 命令启动设备时,它会自动连接到 ADB 你是如何得到 player 的参数名称的?没有什么可以无头运行吗? 我认为他是从我的 SO 帖子中得到的 ;-) ***.com/questions/18768489/… kill 太过分了,“pkill player”就足够了。【参考方案3】:从命令行启动 genymotion 的命令 -
player --vm-name Nexus_4
如果玩家尚未添加到路径中,请使用 ~/.bash_profile 中的以下命令将其添加到路径中
export PATH=/Applications/Genymotion.app/Contents/MacOS/:$PATH
当连接多个设备时,使用“adb -s”将命令重定向到特定设备 模拟器运行后,它们将列在 adb devices 下
例子:
adb devices
List of devices attached
192.168.56.101:5555 device
连接多台设备时发送命令点击安卓设备上的菜单键:
adb -s 192.168.56.101:5555 shell input keyevent KEYCODE_MENU
【讨论】:
它根本不是无头的。【参考方案4】:我在 Ubuntu 上运行,我修改了Snicolas's answer 并作为 Gist 上传: https://gist.github.com/guneysus/410bb0e6b56d6f228555
主要区别在于:
查找 IP 方法不适用于 Ubuntu。我带来了另一种解决方法 在geny_devices.sh
中定义设备并获取此文件以轻松选择 VM:
```
# script geny_devices.sh
s3_43="e63063e8-a922-4832-8bcf-05362c3a1c9a"
nexus_44="45287ed9-2d5e-49a5-a0f9-82c29e7cc4b3"
# Samsung Galaxy S3 - 4.3 - API 18 - 720x1280" e63063e8-a922-4832-8bcf-05362c3a1c9a
# "Google Nexus 7 - 4.4.4 - API 19 - 800x1280" 45287ed9-2d5e-49a5-a0f9-82c29e7cc4b3
#script geny_snap.sh
source geny_devices.sh
VM=$s3_43
# Hopefully performance improvement ;) Not really necessary
# for in in 1..254;
# do ping -c 192.168.56.$1 2&>1;
# done
MAC=`VBoxManage showvminfo $VM | grep MAC | awk -F ":" 'print $3' | cut -c 2-13`
# echo "MAC is $MAC"
# On linux data returned from arp -a is like
# ? (192.168.56.101) at 08:00:27:b0:7f:38 [ether] on vboxnet0
# ? (192.168.0.1) at 9e:a9:e4:d5:43:5b [ether] on eth2
# Find IP with
IP=`arp -a | egrep vboxnet|grep -E -o "([0-9]1,3[\.])3[0-9]1,3"`
# echo "IP is $IP"
IP=`echo $IP | cut -d "(" -f2 | cut -d ")" -f1`
# echo $IP|xclip
# echo -e "[OK] IP \t:\t $IP
# IP exported as global variable and to the clipboard."
echo $IP
# script geny_save.sh
source geny_devices.sh
VM=$s3_43
echo "VM is \"$VM\""
VBoxManage snapshot $VM restore snap1 &
# script geny_start.sh
source geny_devices.sh
VM=$s3_43
echo "VM is \"$VM\""
VBoxManage snapshot $VM restore snap1 &
VBoxHeadless -s $VM &
IP=`./geny_ip.sh`
echo ">>>>>>" $IP
adb tcpip 5555
adb connect $IP:5555
#restart adb as root to allow powering it off
#root mode is generally what we want from a headless emulator (to download emma files for instance)
adb root
adb connect $IP #:5555
#script geny_stop.sh
IP=`./geny_ip.sh`
adb root
adb connect $IP:5555
adb shell reboot -p &
```
【讨论】:
【参考方案5】:在发行版 GNU/Linux 中
很简单
cd genymotion/
在这个文件夹中,你需要找到文件player
现在您需要设备名称
在您的终端中,编写此命令,将 NameDevice 替换为您的设备名称
./player --vm-name <NameDevice>
现在你的模拟器启动了
在 GNU/Linux 中,您可以在菜单中创建访问权限
祝你好运
【讨论】:
【参考方案6】:感谢@k 的回答,我能够在 Mac 上启动 Geny 运动模拟器,但我必须对 Mac OS Sierra 10.12.6 和 GenyMotion 2.10.0 进行一些更改
/Applications/Genymotion.app/Contents/MacOS/player.app/Contents/MacOS/player --vm-name "xxxx"
杀死它
ps | grep "/Applications/Genymotion\.app/Contents/MacOS/player\.app/Contents/MacOS/player" | awk 'print$1' | xargs kill
希望对某人有所帮助。
【讨论】:
【参考方案7】:以防万一有人不知道环境变量,寻找非无头并使用Windows,您可以通过运行以下命令来检查命令,其中它已安装您的 VirtualBox:
C:\Program Files\Oracle\VirtualBox list vms
然后您可以使用以下内容运行您想要的设备:
C:\Program Files\Genymobile\Genymotion\tools player --vm-name "Google Nexus 4"
当然,将路径放在环境变量上会是更好的方法。
【讨论】:
以上是关于如何编写 genymotion 模拟器来启动给定的无头 avd?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Flutter 与 Genymotion 连接起来?