В Android разработке может наступить момент, когда для тестирования приложения на различных устройствах может потребоваться виртуальное устройство. Эмулятор Android легко можно создать с помощью GUI Android Studio, но также можно и с помощью командной строки на macOS. В этой статье я расскажу вам, как именно это сделать!
Шаг 1: Установите Java
Убедитесь, что в вашей системе установлена Java. Если нет, то это можно сделать с помощью Homebrew, выполнив следующую команду:
brew install openjdk@17
Шаг 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. Получите список доступных образов системы
Это можно сделать следующей командой:
cd $ANDROID_HOME/tools/bin sdkmanager --list
Чтобы вывести список SDK с необходимыми параметрами, можно использовать команду grep с нужными ключевыми словами. Например, код ниже позволит получить спикок из SDK 32 версии, для процессоров arm и с доступом к PlayStore.
sdkmanager --list | grep "android-32" | grep "arm" | grep "playstore" | cut -d '|' -f1
Давайте создадим переменную sdk, в котрую поместим имя выбранного образа системы. Но нужно учесть, что под критерии поиска могут попасть несколько вариантов SDK.

В таком случае либо сужайте поиск, либо выбирайте любой из найденных вариантов.
Код ниже присвоит переменной sdk первое найденное значение (в данном случе - system-images;android-33-ext5;google_apis_playstore;arm64-v8a)
sdk=$(sdkmanager --list | grep "android-33" | grep "arm" | grep "playstore" | cut -d '|' -f1 | head -n 1)
Шаг 6: Создайте шаблон свойств эмулятора
Чтобы создать виртуальное устройство с определенной конфигурацией (например, разрешением экрана, объемами 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
П.C. Также необходимо изменить параметры AvdId, avd.ini.displayname, и SDCard.path согласно желаемым значениям. Аналогично параметр image.sysdir.1 должен указывать на выбранную версию SDK ( нейминг такой же, как и у значения, полученного в шаге 5, но ; заменяется на /)
Под спойлером оставлю пример конфигурации:
Пример конфигурации эумлятра 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
Шаг 7: Установите выбранный образ
Это можно сделать следующей командой:
cd $ANDROID_HOME/tools/bin yes | sdkmanager --install $sdk yes | sdkmanager --licenses
П.С. Значение переменной sdk было присвоено на шаге 5
Шаг 8: Создайте эмулятор
Создаем его следующим образом:
name=Test_Pixel_2_API_33 cd $ANDROID_HOME/tools/bin echo no | avdmanager create avd --force --name $name --abi arm64-v8a --package $sdk
Шаг 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 $name -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=$(sdkmanager --list | grep "android-33" | grep "arm" | grep "playstore" | cut -d '|' -f1 | head -n 1) 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, а также многом другом.
