В Android разработке может наступить момент, когда для тестирования приложения на различных устройствах может потребоваться виртуальное устройство. Эмулятор Android легко можно создать с помощью GUI Android Studio, но также можно и с помощью командной строки на macOS. В этой статье я расскажу вам, как именно это сделать!
Шаг 1: Установите Java
Убедитесь, что в вашей системе установлена Java. Если нет, то это можно сделать с помощью Homebrew, выполнив следующую команду:
brew install openjdk@11
Шаг 2. Установите SDK
SDK можно установить с помощью Android Studio, выполнив следующие действия согласно инструкции.
Шаг 3. Установите инструменты для командной строки Android SDK
Их можно загрузить с сайта разработчика Android в разделе «Command line tools only».
Скачайте и распакуйте архив, перенесите его содержимое в каталог $ANDROID_HOME
. Если в каталоге cmdline-tools
нет папки latest
, создайте ее вручную и перенесите туда все содержимое, чтобы предотвратить возникновение ошибки Could not determine SDK root
.
Шаг 4. Добавьте ANDROID_HOME и cmdline-tools в PATH
Вам необходимо добавить переменные окружения ANDROID_HOME
и cmdline-tools
в PATH
. Это можно сделать добавив следующий код в файл ~/.zshrc
или любой другой используемый Вами файл конфигурации:
export ANDROID_HOME=~/Library/Android/sdk
export PATH=$ANDROID_HOME/emulator/:$PATH
export PATH=$ANDROID_HOME/platform-tools/:$PATH
export PATH=$ANDROID_HOME/cmdline-tools/latest/bin/:$PATH
Шаг 5: Создайте шаблон свойств эмулятора
Чтобы создать виртуальное устройство с определенной конфигурацией (например, разрешением экрана, объемами RAM, виртуальной памяти и т. д.), необходимо указать эти параметры при создании эмулятора. Чтобы упростить этот процесс, давайте создадим шаблон с этими параметрами.
Для этого в Android Studio создайте виртуальное устройство с необходимыми параметрами и скопируйте его конфигурацию. Затем назовите созданный эмулятор, например, «Test Pixel 2».
Чтобы «распечатать» конфигурацию , введите следующую команду:
cat $HOME/.android/avd/Test_Pixel_2.avd/config.ini
После, сохраните параметры как шаблон, создав новый файл с именем «pixel_2_API_33_config», используя следующую команду:
touch ~/pixel_2_API_33_config
cat $HOME/.android/avd/Test_Pixel_2.avd/config.ini >> ~/pixel_2_API_33_config
П.с. Также нужно обязательно изменить параметры AvdId, avd.ini.displayname, и SDCard.path согласно желаемым значениям.
Под спойлером оставлю пример конфигурации:
Пример конфигурации эумлятра Pixel 2 API 33
AvdId=Test_Pixel_2_API_33
PlayStore.enabled=true
abi.type=arm64-v8a
avd.ini.displayname=Test Pixel 2 API 33
avd.ini.encoding=UTF-8
disk.dataPartition.size=6G
fastboot.chosenSnapshotFile=
fastboot.forceChosenSnapshotBoot=no
fastboot.forceColdBoot=yes
fastboot.forceFastBoot=no
hw.accelerometer=yes
hw.arc=false
hw.audioInput=yes
hw.battery=yes
hw.camera.back=virtualscene
hw.camera.front=emulated
hw.cpu.arch=arm64
hw.cpu.ncore=4
hw.dPad=no
hw.device.hash2=MD5:55acbc835978f326788ed66a5cd4c9a7
hw.device.manufacturer=Google
hw.device.name=pixel_2
hw.gps=yes
hw.gpu.enabled=yes
hw.gpu.mode=auto
hw.initialOrientation=Portrait
hw.keyboard=yes
hw.lcd.density=420
hw.lcd.height=1920
hw.lcd.width=1080
hw.mainKeys=no
hw.ramSize=1536
hw.sdCard=yes
hw.sensors.orientation=yes
hw.sensors.proximity=yes
hw.trackBall=no
image.sysdir.1=system-images/android-33-ext5/google_apis_playstore/arm64-v8a/
runtime.network.latency=none
runtime.network.speed=full
sdcard.path=$HOME/.android/avd/Test_Pixel_2_API_33.avd/sdcard.img
sdcard.size=512 MB
showDeviceFrame=no
skin.dynamic=yes
skin.name=1080x1920
skin.path=_no_skin
skin.path.backup=_no_skin
tag.display=Google Play
tag.id=google_apis_playstore
vm.heapSize=228
Шаг 6. Получите список доступных образов системы
Это можно сделать следующей командой:
cd $ANDROID_HOME/tools/bin
sdkmanager --list
Выберите требуемый образ эмулятора из списка. В нашем случае берем system-images;android-33-ext5;google_apis_playstore;arm64-v8a
.
Шаг 7: Установите выбранный образ
Это можно сделать следующей командой:
cd $ANDROID_HOME/tools/bin
yes | sdkmanager --install "system-images;android-33-ext5;google_apis_playstore;arm64-v8a"
yes | sdkmanager --licenses
Шаг 8: Создайте эмулятор
Создаем его следующим образом:
name=Test_Pixel_2_API_33
cd $ANDROID_HOME/tools/bin
echo no | avdmanager create avd --force --name $name --abi arm64-v8a --package 'system-images;android-33-ext5;google_apis_playstore;arm64-v8a'
Шаг 9: Измените конфигурацию эмулятора
Изменить конфигурацию эмулятора можно, заменив параметры шаблона на файл конфигурации, как показано ниже:
cat ~/pixel_2_API_33_config >> $HOME/.android/avd/$name.avd/config.ini
Шаг 10: Проверьте созданный эмулятор
Чтобы убедиться, что эмулятор отображается в списке эмуляторов, выполните следующую команду:
cd $ANDROID_HOME/emulator
./emulator -list-avds
Шаг 11: Запустите эмулятор
Чтобы запустить созданный эмулятор, используйте имя из вышеприведенных шагов (в моем случае это Test_Pixel_2_API_33
). Запуск осуществляется с помощью следующей команды:
cd $ANDROID_HOME/emulator;
nohup ./emulator -avd Test_Pixel_2_API_33 -no-snapshot -no-boot-anim -wipe-data &
Совет: чтобы запустить процесс в фоновом режиме, просто добавьте &
в конец выполняемого кода.
Вы также можете запустить все созданные эмуляторы выполнив следующую команду:
cd $ANDROID_HOME/emulator;
./emulator -list-avds | cut -f1 | while read line
do
nohup ./emulator -avd $line -no-snapshot -no-boot-anim -wipe-data &
sleep 20
done
Пример использования
Чтобы проиллюстрировать, как можно использовать созданный эмулятор, я приведу пример кода, который использовал для создания девайса с нужной версией SDK и запуска на нем UI тестов. Код завершает работу всех существующих эмуляторов, создает новый экземпляр эмулятора, выполняет работу и в конце удаляет созданный эмулятор. Вот так:
Пример использования
# Kill all running emulators
adb devices | grep emulator | cut -f1 | while read line; do adb -s $line emu kill; done
# Install the emulator system image if not
cd $ANDROID_HOME/tools/bin
sdk="system-images;android-33;google_apis_playstore;arm64-v8a"
installedImage=$(sdkmanager --list_installed | grep -o $sdk)
if [[ $installedImage = $sdk ]]; then
echo "The required SDK is already installed";
else
yes | sdkmanager --install $sdk
yes | sdkmanager --licenses
fi
name=Test_Pixel_2_API_33
cd $ANDROID_HOME/tools/bin
echo no | avdmanager create avd --force --name $name --abi arm64-v8a --package $sdk
sysDir=$(cat $HOME/.android/avd/$name.avd/config.ini | grep "image.sysdir.1=")
# Edit the created emulator config
tee $HOME/.android/avd/$name.avd/config.ini << END
AvdId=$name
PlayStore.enabled=true
abi.type=arm64-v8a
avd.ini.displayname=$name
avd.ini.encoding=UTF-8
disk.dataPartition.size=6G
fastboot.chosenSnapshotFile=
fastboot.forceChosenSnapshotBoot=no
fastboot.forceColdBoot=yes
fastboot.forceFastBoot=no
hw.accelerometer=yes
hw.arc=false
hw.audioInput=yes
hw.battery=yes
hw.camera.back=virtualscene
hw.camera.front=emulated
hw.cpu.arch=arm64
hw.cpu.ncore=4
hw.dPad=no
hw.device.hash2=MD5:55acbc835978f326788ed66a5cd4c9a7
hw.device.manufacturer=Google
hw.device.name=pixel_2
hw.gps=yes
hw.gpu.enabled=yes
hw.gpu.mode=auto
hw.initialOrientation=Portrait
hw.keyboard=yes
hw.lcd.density=420
hw.lcd.height=1920
hw.lcd.width=1080
hw.mainKeys=no
hw.ramSize=1536
hw.sdCard=yes
hw.sensors.orientation=yes
hw.sensors.proximity=yes
hw.trackBall=no
$sysDir
runtime.network.latency=none
runtime.network.speed=full
sdcard.path=$HOME/.android/avd/$name.avd/sdcard.img
sdcard.size=512 MB
showDeviceFrame=no
skin.dynamic=yes
skin.name=1080x1920
skin.path=_no_skin
skin.path.backup=_no_skin
tag.display=Google Play
tag.id=google_apis_playstore
vm.heapSize=228
END
cd $ANDROID_HOME/emulator
./emulator -list-avds
cd $ANDROID_HOME/emulator;
nohup ./emulator -avd $name -no-snapshot -no-boot-anim -wipe-data &
sleep 40
# Do
# Some
# Code
# Kill and delete the created emulator
adb devices
adb devices | grep emulator | cut -f1 | while read line; do adb -s $line emu kill && sleep 10; done
avdmanager delete avd -n $name
Заключение
Я написал эту статью, чтобы показать: создание нового Android эмулятора через терминал — вполне простая задача. Шагов много, но, поверьте, это дает больше гибкости и контроля, чем GUI Android Studio. Еще, это единственный известный мне способ создания эмулятора с кастомными параметрами на CI (поделитесь в комментариях, если знаете другие). Удачи!
Эта статья была написана автором статьи в Wrike. Хотите узнать, каково работать с нами и какие возможности карьерного роста мы предлагаем? Вам сюда!
Кроме того, вы можете посмотреть интервью с основателем компании Андреем Филевым и узнать о культуре, ценностях и методах работы Wrike, а также многом другом.
Комментарии (6)
equeim
11.07.2023 08:12+1Хз насчёт sdkmanager но для сборки приложений уже некоторое время требуется java 17. Даже если sdkmanager это пока не требует то он точно может работать с 17 без проблем. Да и она сейчас последний lts.
vireal01 Автор
11.07.2023 08:1211 версия java была указана как пример, но да, Вы правы, имеет смысл использовать 17 версию
codemachine
11.07.2023 08:12Спасибо за статью!
Ввиду того, что я начинающий андройд разраб, то стало интересно для чего это может быть полезно. Не могли бы раскрыть тезисно несколько пунктов ?vireal01 Автор
11.07.2023 08:12Например, если вы хотите запустить UI тесты Вашего приложения на определенной версии SDK, при данном подходе вы можете реализовать пикер SDK в меню запуска билда вашего CI и запускать тесты на нужной версии в пару кликов. Аналогично для запуска тестов, например, на эмуляторах планшетов.
Вообще, юзкейсы данного подхода весьма специфичны и касаются больше автоматизации каких-либо процессов. Для 99,99% (образно) задач данное решение Вам вряд ли понадобится.
PronKing
Спасибо, отличная статья! Как думаете, можно без боли запустить это на популярных linux дистрибутивах? Не пробовали использовать Cuttlefish?
vireal01 Автор
Спасибо! Думаю, что не проблема также запустить на linux дистрибутивах. Например, можно воспользоваться данной инструкцией, которая повторяет со второго по четветый шаги данной статьи, но для Debian'а. Также в этой инструкции показано как установить Java на linux дистрибутивах. Все остальные шаги будут идентичными.
С Cuttlefish еще не работал. Но спасибо за наводку, обязательно ознакомлюсь!