How can I script genymotion emulator to launch a given avd, headless?

邮差的信 提交于 2019-12-17 23:19:51

问题


Is there any way to launch by command line a given avd and have it registered via adb ?

I would also prefer to get the emulator launched headless.

I am looking for this to run tests quickly.


回答1:


For others looking for non-headless command line startup:

/Applications/Genymotion.app/Contents/MacOS/player --vm-name "xxxx"

Get a list of vms:

$ VBoxManage list vms
"Galaxy Nexus - 4.2.2 - API 17 - 720x1280" {56d8e3aa-ecf8-483e-a450-86c8cdcedd35}

Where xxxx can be either the name or the 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"

You can kill it with a normal process kill:

ps | grep "Genymotion\.app/Contents/MacOS/player" | awk '{print $1}' | xargs kill



回答2:


Here is a better procedure. It will require a first manual launch, but afterwards, you will get a blazing fast genymotion, up within seconds. The following scripts have been tested on macos x. They may need some more work for linux.

First, launch genymotion emulator normally via genymotion app. Then, get its sha1 from Virtual box :

VBoxManage list vms

Then, take a snapshot of it from command line :

#script genymotion-save.sh
VM=6a5d9245-b751-47aa-b38d-989c5f1a9cfb

echo "VM is \"$VM\""
VBoxManage snapshot $VM take snap1 

Then you can detect its ip using this script (most of its complexity comes from mac address conversion):

#script genymotion-detect-ip.sh
VM=6a5d9245-b751-47aa-b38d-989c5f1a9cfb

#find mac of vm
#http://stackoverflow.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

Now, you have all you need to start up the vm's snapshot from the command line and connect to it via adb (using root). You can do it with this script :

# 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

And finally you can also use a script to shutdown the emulator properly :

#script genymotion-stop.sh 
IP=`./genymotion-detect-ip.sh`

adb root
adb connect $IP:5555
adb shell reboot -p &

This is still a lot of scripting but it works fine and controls the genymotion emulator in an handy way.

Let's hope genymobile can make this eve easier in future releases.




回答3:


I am running on Ubuntu and I modified Snicolas's answer and uploaded as Gist: https://gist.github.com/guneysus/410bb0e6b56d6f228555

The major differences are:

  • Finding IP method is not worked on Ubuntu. I came with another work-around
  • Defined devices in geny_devices.sh and source this file to pick VM easily:

```

# 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 &

```




回答4:


In distros GNU/Linux

It's easy

 cd genymotion/

In this folder,you need find file player

Now you need the device name

In your terminal, write this command,replacing NameDevice for your device name

 ./player --vm-name <NameDevice>

And now your emulator started

In GNU/Linux you can create access in the menu

Good Luck




回答5:


Thanks to @k s answer I was able to launch the Geny motion emulator on Mac but I had to make few changes for Mac OS Sierra 10.12.6 and GenyMotion 2.10.0

/Applications/Genymotion.app/Contents/MacOS/player.app/Contents/MacOS/player --vm-name "xxxx"

and to kill it

ps | grep "/Applications/Genymotion\.app/Contents/MacOS/player\.app/Contents/MacOS/player" | awk '{print$1}' | xargs kill

Hope it helps someone.




回答6:


Just in case anyone doesn't know about environment variables, looking for a non-headless and using Windows, you can check the commands by running the following command where it's installed your VirtualBox:

C:\Program Files\Oracle\VirtualBox list vms

Then you can run your desired device with something like the following:

C:\Program Files\Genymobile\Genymotion\tools player --vm-name "Google Nexus 4"

Of course, put that paths on your environment variable would be the better approach.




回答7:


Command to launch genymotion from command line -

player --vm-name Nexus_4

if player is not already added to path, add it to path using below command in your ~/.bash_profile

export PATH=/Applications/Genymotion.app/Contents/MacOS/:$PATH

When more than one device is connect use 'adb -s' is used to redirect commands to particular device Once emulator is running they will be listed under adb devices

Example:

adb devices
List of devices attached 
192.168.56.101:5555 device

Send command to click on menu key on android device when multiple devices are connected:

adb -s 192.168.56.101:5555 shell input keyevent KEYCODE_MENU 


来源:https://stackoverflow.com/questions/18396344/how-can-i-script-genymotion-emulator-to-launch-a-given-avd-headless

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!