Как я могу написать сценарий эмулятора genymotion для запуска данного avd без головы?

Есть ли способ запустить из командной строки данный avd и зарегистрировать его через adb ?

Я также предпочел бы запустить эмулятор без головы.

Я ищу это, чтобы быстро запустить тесты.


person Snicolas    schedule 23.08.2013    source источник
comment
Главный вопрос заключается в том, на какой платформе вы его запускаете, чтобы вы могли найти исполняемый файл проигрывателя Genymotion.   -  person IgorGanapolsky    schedule 31.01.2014


Ответы (7)


Для других, которые ищут запуск командной строки без головы:

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

Получить список vms:

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

Где xxxx может быть либо именем, либо идентификатором:

/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
person k s    schedule 18.09.2013
comment
Красиво, а как у вас дела с IP-адресом? Он понадобится вам для подключения adb к genymotion. - person Snicolas; 18.09.2013
comment
В настройках genymotion убедитесь, что установлен Путь к Android SDK, а затем убедитесь, что при запуске виртуального устройства оно автоматически подключается к ADB. Когда устройство запускается с помощью команды genymotion player, оно автоматически подключается к ADB. - person k s; 18.09.2013
comment
как вы получили имя параметра для игрока? Нет ничего, чтобы запустить его без головы? - person Snicolas; 18.09.2013
comment
Думаю, он получил это из моего поста SO ;-) ="как запустить устройство genymotion с помощью команды оболочки"> stackoverflow.com/questions/18768489/ - person eyal-lezmy; 19.09.2013
comment
Кстати, чтобы ответить на ваш вопрос о запуске проигрывателя Genymotion без головы, нет другого параметра, кроме vm-name. Но я думаю, что отдел исследований и разработок готов выслушать запрос на эту функцию, поэтому не стесняйтесь отправить письмо по адресу [email protected], объяснив им, насколько это интересно для вас, и какие хорошие варианты использования он может принести. - person eyal-lezmy; 19.09.2013
comment
Извините, я не украл ваш ответ;) Я получил информацию от службы поддержки genymobile - я хотел бы увидеть ваш ответ, поскольку это то, что я искал, но он не отображался ни в одном из моих поисков в stackoverflow. - person k s; 20.09.2013
comment
Уничтожение процесса сделает невозможным восстановление моментального снимка позже. - person Janusz; 22.11.2013
comment
kill был излишним, pkill player будет достаточно. - person Karioki; 05.03.2014
comment
@ks Не беспокойтесь. Я рад видеть людей, помогающих друг другу в нашем продукте. Спасибо. - person eyal-lezmy; 01.09.2014

Вот лучше процедура. Это потребует первого ручного запуска, но после этого вы получите невероятно быстрое genymotion, работающее в течение нескольких секунд. Следующие скрипты были протестированы на macos x. Им может понадобиться дополнительная работа для Linux.

Сначала запустите эмулятор genymotion в обычном режиме через приложение genymotion. Затем получите его sha1 из Virtual box:

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://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

Теперь у вас есть все, что вам нужно, чтобы запустить снимок виртуальной машины из командной строки и подключиться к ней через 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 сможет упростить эту задачу.

person Snicolas    schedule 25.08.2013
comment
Эти сценарии работают нормально (спасибо) ... но захват экрана создает искаженные изображения (как захваты на основе VBoxManage controlvm, так и захваты на основе adb shell /system/bin/screencap создают одинаковые искаженные изображения). Есть ли способ заставить пропорциональные элементы и элементы на экране правильно отображаться при запуске виртуальной машины таким образом? - person David West; 17.09.2013
comment
Это довольно хороший вопрос. Я думаю, что geny mobile до сих пор не учитывает этот вариант использования. Возможно, лучшим решением для вас было бы использовать виртуальную коробку с дисплеем с кадровым буфером. Я думаю, это может работать лучше, так как это будет общая реализация X11. - person Snicolas; 18.09.2013
comment
Я предполагаю, что genymotion манипулирует выводом видео из виртуального окна для его отображения — я не могу представить, как это сделать, но, похоже, в любом случае нет запуска экземпляров vm через командную строку (без головы или нет) и получения того же вывода на дисплей. который создается, когда genymotion запускает экземпляры. Прибегаю к различным комбинациям версий между VirtualBox, GenyMotion и Android-устройствами на случай, если я столкнусь с каким-то краеугольным камнем, с которым никто не сталкивался, но пока не повезло. - person k s; 18.09.2013
comment
Вместо сценария обнаружения ip вы можете просто использовать этот VBoxManage guestproperty get '6a5d9245-b751-47aa-b38d-989c5f1a9cfb' androvm_ip_management Это вернет хороший ip, а одинарные кавычки вокруг имени виртуальной машины дадут вам правильные значения, даже если ваше имя виртуальной машины содержит пробелы. Вместо этого вы можете оставить uuid. - person Sojurn; 07.12.2013
comment
@Sojurn, не могли бы вы написать свой собственный ответ и предоставить сценарии многократного использования? - person Snicolas; 07.12.2013
comment
@Sojurn Когда я запускаю вашу команду, я получаю сообщение об ошибке: значение не задано! - person IgorGanapolsky; 31.01.2014
comment
@Snicolas: Ваш сценарий перезапуска у меня не работает. Я получаю: VBoxHeadless: error: The machine '.....' is already locked for a session (or being unlocked) - person Luis A. Florit; 09.03.2014
comment
@Snicolas: я не получаю сообщения об ошибке, если запускаю команды из сценария. Проблема в том, что & после команды восстановления. Думаю не стоит добавлять. - person Luis A. Florit; 09.03.2014
comment
Просто амперсанд оболочки Linux для запуска фоновой команды, иначе ваша оболочка будет заблокирована запускаемой виртуальной машиной. Если вам это не нужно, и это работает, это нормально. - person Snicolas; 10.03.2014
comment
Спасибо за сценарии. Я получаю следующую ошибку при попытке сделать это через Jenkins (но, похоже, работает нормально, если я попробую это прямо из терминала на самой коробке): Ошибка: не удалось запустить машину. Сообщение об ошибке: не удалось загрузить блок "HGCM" (VERR_SSM_UNEXPECTED_DATA) - person NPike; 11.07.2014

Я работаю в Ubuntu и изменил ответ Сниколаса и загрузил как Gist: https://gist.github.com/guneysus/410bb0e6b56d6f228555

Основные отличия:

  • Метод поиска IP не работает в Ubuntu. Я пришел с другим обходным путем
  • Определенные устройства в geny_devices.sh и источник этого файла, чтобы легко выбрать ВМ:

```

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

```

person guneysus    schedule 14.12.2014

В дистрибутивах GNU/Linux

Это просто

 cd genymotion/

В этой папке вам нужно найти файл player

введите здесь описание изображения

Теперь вам нужно имя устройства

введите здесь описание изображения

В своем терминале напишите эту команду, заменив NameDevice на имя вашего устройства.

 ./player --vm-name <NameDevice>

введите здесь описание изображения

введите здесь описание изображения

И вот ваш эмулятор запустился

введите здесь описание изображения

В GNU/Linux вы можете создать доступ в меню

введите здесь описание изображения

введите здесь описание изображения

Удачи

person David Hackro    schedule 29.11.2015

Благодаря ответу @k я смог запустить эмулятор движения Geny на Mac, но мне пришлось внести несколько изменений для 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

Надеюсь, это поможет кому-то.

person Satheesh    schedule 27.09.2017

На всякий случай, если кто-то не знает о переменных среды, ищет безголовый и использующий Windows, вы можете проверить команды, выполнив следующую команду, где она установлена Виртуальная коробка:

C:\Program Files\Oracle\VirtualBox list vms

Затем вы можете запустить желаемое устройство примерно так:

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

Конечно, лучшим подходом будет размещение этих путей в вашей переменной окружения.

person Felipe Augusto    schedule 15.02.2019

Команда для запуска genymotion из командной строки —

player --vm-name Nexus_4

если игрок еще не добавлен в путь, добавьте его в путь, используя команду ниже в вашем ~/.bash_profile

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

Когда подключено более одного устройства, используйте «adb -s» для перенаправления команд на конкретное устройство. После запуска эмулятора они будут перечислены в разделе устройств adb.

Пример:

adb devices
List of devices attached 
192.168.56.101:5555 device

Отправить команду, чтобы нажать клавишу меню на устройстве Android, когда подключено несколько устройств:

adb -s 192.168.56.101:5555 shell input keyevent KEYCODE_MENU 
person Tejasvi Manmatha    schedule 05.04.2014
comment
Он вовсе не безголовый. - person Snicolas; 05.04.2014