В 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.

пример расположения фалов Command line tools
Пример расположения фалов Command line tools

Шаг 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)


  1. PronKing
    11.07.2023 08:12
    +1

    Спасибо, отличная статья! Как думаете, можно без боли запустить это на популярных linux дистрибутивах? Не пробовали использовать Cuttlefish?


    1. vireal01 Автор
      11.07.2023 08:12
      +1

      Спасибо! Думаю, что не проблема также запустить на linux дистрибутивах. Например, можно воспользоваться данной инструкцией, которая повторяет со второго по четветый шаги данной статьи, но для Debian'а. Также в этой инструкции показано как установить Java на linux дистрибутивах. Все остальные шаги будут идентичными.

      С Cuttlefish еще не работал. Но спасибо за наводку, обязательно ознакомлюсь!


  1. equeim
    11.07.2023 08:12
    +1

    Хз насчёт sdkmanager но для сборки приложений уже некоторое время требуется java 17. Даже если sdkmanager это пока не требует то он точно может работать с 17 без проблем. Да и она сейчас последний lts.


    1. vireal01 Автор
      11.07.2023 08:12

      11 версия java была указана как пример, но да, Вы правы, имеет смысл использовать 17 версию


  1. codemachine
    11.07.2023 08:12

    Спасибо за статью!
    Ввиду того, что я начинающий андройд разраб, то стало интересно для чего это может быть полезно. Не могли бы раскрыть тезисно несколько пунктов ?


    1. vireal01 Автор
      11.07.2023 08:12

      Например, если вы хотите запустить UI тесты Вашего приложения на определенной версии SDK, при данном подходе вы можете реализовать пикер SDK в меню запуска билда вашего CI и запускать тесты на нужной версии в пару кликов. Аналогично для запуска тестов, например, на эмуляторах планшетов.

      Вообще, юзкейсы данного подхода весьма специфичны и касаются больше автоматизации каких-либо процессов. Для 99,99% (образно) задач данное решение Вам вряд ли понадобится.