
Вопрос, о котором хотелось бы сегодня поговорить, мне кажется, я слышу ежедневно, по несколько раз на дню. Точно не помню, но, мне кажется, что этот вопрос был первым, с которым я столкнулся на данной должности. Звучит он обычно так: «Как мне установить эмулятор Android на ваш сервер?». Серьёзно, когда я только начинал работать, я даже представить не мог, насколько часто я буду отвечать на данный вопрос.
Представляем вам вторую часть из серии статей «Будни техпода». Если кто не в курсе, это серия статей, в которой мы берём кого-то из специалистов поддержки, и просим рассказать о наиболее популярных вопросах от наших клиентов, а также предлагаем свой наглядный вариант решения. С первой частью можете ознакомиться по ссылке. Не будем вас томить и сразу передаём слово нашему специалисту поддержки.
Не сомневаюсь, что многие читатели нашего блога знают, что такое «эмулятор» и представляют, как он работает, но для тех, кто сталкивается с этим понятием впервые, постараюсь коротко объяснить. Эмулятор — это программа, которая копирует поведение и функции какой-то другой системы, отличной от той, на которой запускается данный эмулятор, с целью запуска на нём приложений, которые не предназначены для работы на системе, которой вы изначально пользуетесь. Например, у вас на телефоне используется Android, но в вас проснулось чувство ностальгии и вам захотелось запустить игры, в которые вы когда-то давно играли на сеге или денди. Или, например, вам хочется запустить программу, которая есть только на Android, но при этом у вас телефон с IOS, но есть ПК с Windows. Тут вам и помогут эмуляторы.
Мы будем говорить именно про эмуляцию Android на устройстве под управлением ОС Windows (Windows Server) и с виртуализацией Hyper-V. На сегодняшний день существует множество различных готовых решений (Bluestack, Nox, Emu и др.), но, к сожалению, большинство из них не поддерживают работу с Hyper-V, а те, что запускаются — не работают достаточно стабильно и сильно перегружены лишним функционалом, чтобы их можно было полноценно использовать на средних конфигурациях VDS серверов. Поэтому в качестве решения данного вопроса, мы самостоятельно развернём чистый Android на виртуальной машине Hyper-V внутри VDS сервера.
▍ Создание сервера
Сначала нам требуется сам VDS сервер с включённой на нём вложенной виртуализацией. Если вы заказываете сервер у нас, то включить её вы можете через нашу техническую поддержку, написав обращение через нашу форму обратной связи в разделе «Поддержка».

В качестве операционной системы на сервере мы будем использовать Windows Server 2016: Конфигурация:
- ОС — Windows Server 2016
- CPU — Intel Xeon, 4x2.2ГГц
- RAM — 4Гб
- Disk — 20 Гб, HDD
▍ Настройка ролей на сервере для установки Android
Приступим к настройке. Нам необходимо добавить несколько дополнительных ролей (Hyper-V и Удалённый доступ). Hyper-V для возможности развернуть виртуальную машину на сервере, а «Удалённый доступ» для того, чтобы была возможность развернуть сеть, благодаря которой наш Android будет получать доступ в интернет. Открываем «Диспетчер серверов» — «Управление» — «Добавить роли и компоненты».

По умолчанию — у нас открывается окно на этапе «Перед началом работы». Жмём «Далее» и переходим к этапу «Тип установки». На данном этапе выбираем опцию «Установка ролей или компонентов» и переходим к следующему этапу.

На этапе «Выбор сервера» выбираем пункт «Выберите сервер из пула серверов» и переходим далее.

На этапе «Роли сервера» нам необходимо добавить выбрать две роли: «Hyper-V» и «Удалённый доступ».


Далее переходим к этапу — «Службы ролей». На промежуточных этапах оставляем настройки без изменений и нажимаем просто «Далее». На этапе «Службы ролей» нас интересует служба «Маршрутизация». Включаем данную роль и идём далее.

До этапа «Подтверждение» оставляем все настройки без изменения и жмём кнопку
«Установить».

Дожидаемся окончания установки компонентов и обязательно перезагружаем сервер.
▍ Создаём дополнительный сетевой адаптер и скачиваем образ Android
Теперь нам необходимо подготовить сетевой адаптер «NAT» для подключения его к виртуальной машине. Открываем «PowerShell» и поочерёдно выполняем следующие команды:
New-VMSwitch -name LocalSwitch -SwitchType Internal
New-NetNat -Name LocalNat -InternalIPInterfaceAddressPrefix «192.168.0.0/24»
Get-NetAdapter «vEthernet (LocalSwitch)» | New-NetIPAddress -IPAddress 192.168.0.254 -AddressFamily IPv4 -PrefixLength 2
Готово. Адаптер создан, и при создании виртуальной машины, у нас будет возможность выбрать его — в качестве основного сетевого источника. Дальше скачиваем сам образ Android, который мы будем устанавливать на сервер. В нашем случае — мы выбрали версию Android x86 64-bit (9.0-r2-k49). Скачать его можно по ссылке.Вывод команд:
▍ Создание виртуальной машины для установки Android
Предварительную подготовку завершили. Теперь мы можем приступить к настройке самой виртуальной машины для Android. Сначала нам нужно открыть «Диспетчер Hyper-V», через который мы будем производить все требуемые манипуляции по настройке, а в дальнейшем и управлять своей виртуальной машиной. Нажимаем комбинацию клавиш «Win + R» на клавиатуре, и в открывшемся окне «Выполнить» вводим
virtmgmt.msc
.Перед нами открывается окно «Диспетчера Hyper-V». В левом столбце выбираем нашу виртуальную машину, и в окне «Действия» переходим в меню «Создать» - «Виртуальная машина».

В открывшемся окне переходим на этап «Укажите имя и местонахождение». Здесь нам надо задать имя для нашей виртуальной машины. Я решил указать просто «Android», но вы можете выбрать любое другое имя, оно ни на что влиять не будет.

Далее указываем поколение виртуальной машины. Под нашу версию ОС подойдёт «Поколение 1».

На следующем этапе мы указываем объём оперативной памяти, которая будет выделяться сервером под виртуальную машину. Данное значение индивидуально, и в первую очередь зависит от конфигурации вашего сервера. В нашем случае — мы используем сервер с объёмом оперативной памяти в 6 ГБ и поэтому без каких-либо проблем можем выделить 2 ГБ под виртуальную машину.

Далее, выбираем сетевой адаптер, который будет использоваться для доступа в интернет с виртуальной машины. Здесь нам необходимо выбрать адаптер «LocalSwitch», который мы недавно создали через PowerShell.

Дальше указываем объём виртуального жёсткого диска, который будет использоваться на виртуальной машине, а также его расположение на нашем сервере. Объём диска указывается также индивидуально, в зависимости от объёма жёсткого диска вашего сервера. Мы указали 15 ГБ.

Потом выбираем образ, из которого будет произведена установка Android. Выбираем пункт «Установить операционную систему с загрузочного компакт — или DVD-диска, жмём «Обзор» и находим скачанный нами образ Android.

Переходим к последнему шагу создания виртуальной машины. На данном этапе проверяем параметры машины, выбранные нами на предыдущих шагах, и жмём «Готово».

▍ Установка Android на виртуальную машину
Виртуальная машина создана. Теперь нам надо установить на неё и настроить саму операционную систему Android. Выбираем созданную нами виртуальную машину с помощью «ПКМ» и в открывшемся окне жмём «Подключить».

У нас открывается окно с нашей виртуальной машиной. В левом верхнем углу жмём кнопку, отвечающую за включение.

Дальше выбираем, запустить образ с Android сразу или произвести его установку на виртуальную машину. Выбираем 3-й пункт «Installation — Install Android-x86 to harddisk» и переходим к установке.

Теперь создаём раздел, на который будет произведена установка. Выбираем пункт «Create/Modify partitions» и жмём «OK».

На этапе с предложением использовать таблицу разделов GPT выбираем «NO». Её мы настроем позже, в момент установки самого образа.

Приступаем к созданию нового раздела. В нижнем меню выбираем пункт «New».

Далее выбираем пункт «Primary».

Указываем объём нового раздела (по умолчанию указан максимально доступный объём, поэтому это поле можно оставить без изменений). Жмём «Enter».

Далее поочерёдно выбираем пункт «Bootable», а затем пункт «Write».

На вопрос: уверены ли мы, что хотим записать таблицу разделов на созданный диск? — Вводим «yes» и жмём «Enter».

Раздел диска для установки ОС создан. Выбираем пункт «Quit» и возвращаемся к этапу с выбором раздела.

Как мы можем видеть, у нас успешно создался раздел «sda1», на который мы и будем устанавливать систему Android. Выбираем его и жмём «OK».

Потом надо отформатировать созданный раздел и изменить тип файловой системы. Выбираем пункт «ext4» и жмём «OK».

Начинается процесс установки операционной системы на виртуальную машину. Сам процесс установки может занять некоторое время, а процент загрузки может оставаться на одном значении (в нашем случае, это заняло около 15 минут). На протяжении всей установки будут появляться окна с подтверждениями (в том числе с использованием GPT, от которого мы ранее отказались). Везде выбираем «YES». По окончании установки выбираем пункт «Reboot» и перезагружаем виртуальную машину.
▍ Запускаем Android
Основная работа по настройке виртуальной машины проделана. Теперь можем загрузить систему и начать настраивать машину изнутри. Подключаемся к виртуальной машине и в открывшемся окне переходим в раздел «Advanced options».

В данном разделе выбираем пункт «Boot from local drive».

Далее выбираем способ запуска системы. Нам требуется выбрать пункт «Android-x86 9.0-r2» (название может незначительно отличаться, в зависимости от версии Android).

Далее нас встречает начальное окно настройки Android. Здесь выбираем язык системы и жмём кнопку «Начать».

На этапе «Подключения к Wifi» пока что жмём «Пропустить». К этой настройке мы вернёмся позже.

Производим оставшиеся настройки (Дата, Время, часовой пояс и тд) и переходим на рабочий стол Android. Интерфейс рабочего стола может отличаться, в зависимости от версии Android.

Теперь подключаем нашу ВМ к интернету. К сожалению, по какой-то причине Android не прописывает автоматически IP адрес, Шлюз и DNS, и поэтому их надо указать вручную (если кто-то из читателей в курсе, как решить эту проблему, буду рад почитать об этом в комментариях). Переходим в «Настройки» — «Сеть и Интернет» — «WiFi» и выбираем сеть «VirtWifi» (Если иконки «Настройки» нет на рабочем столе, потяните мышкой по экрану снизу вверх, и у вас откроется меню со всеми программами).

В окне «Сведения о сети», в правом верхнем углу нажимаем на карандаш и переходим к настройкам сети.

В открывшемся окне настроек необходимо перейти в раздел «Расширенные настройки», и вручную указать IP-адрес: 192.168.0.2, Шлюз: 192.168.0.254, Длину префикса сети: 24, DNS: 1 8.8.8.8 и DNS 2: 8.8.4.4. Вводим данные и сохраняем.

Готово. Все настройки завершены, и теперь мы можем выходить с виртуальной машины в интернет, а также скачивать приложения с Google Play. Запускаем, вводим данные от своей учётной записи и попадаем в магазин.

▍ Пара слов в заключение
С первого взгляда может показаться, что вся процедура слишком замудрённая и проще воспользоваться готовым решением, но результат стоит потраченных усилий. Я протестировал наиболее популярные версии эмуляторов, отдавая предпочтение Nox и Bluestack (бета-версия с поддержкой Hyper-V). Как ни странно, Bluestack запускаться на Windows Server 2016 не захотел, а производительность Nox сильно разочаровала.
Всё же, они больше подходят под десктопные решения, где используется физическое и более производительное железо. Android же на Hyper-V, напротив, даже удивил. Хоть производительность не идеальная (так как это запуск виртуальной машины на другой виртуальной машине), но пользоваться им вполне реально.
Я протестировал ряд популярных приложений, а также парочку простеньких 2D игр и в целом остался доволен. А какие решения используете вы?
RUVDS | Community в telegram и уютный чат

Комментарии (9)
savostin
18.10.2022 16:04+1Ставил десяток раз (на всякий случай и сейчас поставил) и всегда после установки и перезагрузки система вываливается в консоль. Никаких "Здравствуйте" тебе. ЧЯДНТ?
vadimk91
18.10.2022 22:40+2Ради интереса поставил себе на ВМ под Win 8.1, android-x86_64-9.0-r2.iso, всё получилось. Вы ставили видимо 32-битную версию, попробуйте 64.
Кстати, даже не понадобилось вручную прописывать ip адреса, получен автоматом.savostin
18.10.2022 22:48+1Говорят может быть что-то с видеокартой связано или с графическим ускорителем :\
Попробуем-с и 64x.
zlo1
19.10.2022 14:18использую под KVM
export QEMU_AUDIO_DRV=pa export QEMU_PA_SERVER=/tmp/pulse-PKdhtXMmr18n/native qemu-system-x86_64 -cpu host -smp 4 -m 4096 \ -name Anroid8 -machine pc,accel=kvm \ -soundhw hda \ -device virtio-serial-pci -device virtserialport,chardev=spicechannel0,name=com.redhat.spice.0 \ -chardev spicevmc,id=spicechannel0,name=vdagent \ -device virtio-net,netdev=user.1,addr=0x4 -netdev user,id=user.1,ipv6=off \ -device virtio-balloon \ -drive file="android.img",if=virtio,format=qcow2,index=1
perlestius
19.10.2022 23:04+1К сожалению, по какой-то причине Android не прописывает автоматически IP адрес, Шлюз и DNS, и поэтому их надо указать вручную (если кто-то из читателей в курсе, как решить эту проблему, буду рад почитать об этом в комментариях).
Windows по умолчанию умеет в AutoIP, а для Android остаётся либо вручную прописать параметры сети, как описано в Вашей статье, либо поднять DHCP-сервер во внутренней сети, к которой подключена ВМ с Android, т.к. в виртуальной сети Hyper-V инструментов для этого нет. Можно поднять роль DHCP-сервера прям на той же машине, на которой Hyper-V поднят, либо на отдельной ВМ развернуть. Только смысла в этом не вижу, проще руками прописать, если этот DHCP будет использоваться для раздачи адреса единственной машине.
13werwolf13
какое-то переусложнение задачи
можно взять готовый rpm пакет с предустановленной qemu виртуалкой с android-x86 на их же сайте и после установки одной командой просто её запускать как на десктопе ярлыком в меню так и на сервере без отображения интерфейса qemu. для тестирования и небольших задач самое оно
из преимуществ:
1) никакой винды и hyper-v (в этой задаче это ненужный и медленный пласт)
2) меньше телодвижений (по факту две команды curl для скачивания и rpm -U для установки, можно даже совместить в однострочник)
3) никаких ошибок на этапе создания vm (в пакете уже лежит ярлык запуска vm со всеми нужными флагами)
правда я не знаю насколько это актуально ибо с такими задачами не сталкивался уже пару лет, но раньше применял для разрабов android команды, для тестирования через adb прикручивалось к idea/android/studio. потом вроде бы в студии появилась нативная поддержка qemu но мне уже было не интересно так как клиент не обращался с повторной задачей
upd: глянул, готовые rpm всё ещё выкладывают
dlinyj
Это всё хорошо, когда ты владеешь Linux. Как я понял из статьи, пользователи хотели эмулятор именно на Windows, от этого и все сложности.
13werwolf13
может быть я смотрю на это предвзято, с высоты своего может быть не самого популярного опыта. но мне видится так:
1) для разработки и тестирования приложений под android разработчикам windows не нужна совсем, никак, ни зачем (разве что дизайнеру может понадобиться, но на эту тему можно дискутировать отдельно очень долго).
2) писать код и тестировать желательно всё же не на одной машине. написал, запушил, ждёшь пока соберётся и задеплоится в тестовую vm. при необходимости ручного тестирования с qemu это не проблема, vm может жить хоть на другом конце света что не помешает потыкать её хоть гуём хоть через adb.
я понимаю что многие смотрят на решение этой задачи не так как я и всё вышесказанное - ИМХО.
dlinyj
Как правило на виртуальных машинах разворачивают такие эмуляторы не для тестирования и не для разработки. А для каких-то других нужд.
Чисто по логике вещей, я использую все эмуляторы железа обычно под рукой, ибо так удобнее. Если только это не оговорено политикой компании.
Но я совершенно согласен с вашим подходов в ваши задачи, сам бы так и делал.