В 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
.
![Пример расположения фалов Command line tools пример расположения фалов Command line tools](https://habrastorage.org/getpro/habr/upload_files/e3d/3e5/b83/e3d3e5b83777e6414ce252b894035094.png)
Шаг 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, подпадающих под выбранные критерии Пример списка из нескольких SDK, подпадающих под выбранные критерии](https://habrastorage.org/getpro/habr/upload_files/696/5ba/efd/6965baefdbe019728a790db1f1c9e7d4.png)
В таком случае либо сужайте поиск, либо выбирайте любой из найденных вариантов.
Код ниже присвоит переменной 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, а также многом другом.