Прочитав недавно написанный беглый обзор Genymotion на Хабре мне стало как-то даже немного обидно за столь замечательный проект. В комментариях же вообще пошло сплошное недопонимание, которое автор статьи не смог разрулить из-за недостаточного опыта работы с сабжем. Я довольно давно пользуюсь данным эмулятором для отладки приложений и попробую рассказать о нем более подробно.
Сразу оговорюсь, речь пойдет о его предшественнике AndroVM, который был до ребрендинга в коммерческий продукт. Он пока более стабилен, чем бета-версия Genymotion, но большинство описанного справедливо и для Genymotion. Часть описанного функционала пока имеет проблемы в бета-версии Genymotion, но разработчики обещают поправить все к выходу полноценного релиза.
Изначально проект являлся форком android-x86, заточенным под VirtualBox, с возможностью выбора разрешения, плотности экрана и его поворота (да, эта возможность была в нем с самого начала, просто нет какой-либо встроенной кнопки для этого), для удобной отладки приложений на разных экранах. Ну и в планах была более тесная интеграция с VirtualBox, вроде захвата мыши и общих папок.
Но все это дело знатно тормозило из-за отсутствия аппаратного ускорения графики. Тогда разработчику пришла идея, написать свой OpenGLES драйвер, транслирующий обращения к аппаратной части по TCP/IP в специальный клиент, который уже выводил графику, используя возможности OpenGL хостовой видеокарты. Если честно я не в курсе, что помешало использовать виртуальный видеоадаптер из VirtualBox, который якобы тоже способен транслировать аппаратные возможности видеокарты, но реализация автора на мой взгляд даже интереснее, своей хардкорностью, а-ля X-Server у линуксов. Таким образом, запуская Genymotion, вы видите не видоизмененный экран из VirtualBox, а отдельное приложение, получающее картинку от эмулятора по сети.
И работает это все в самом деле замечательно! Например, даже на моем домашнем ноутбуке без поддержки какой-либо аппаратной виртуализации можно поиграть в Angry Birds со вполне приемлемой частотой кадров. К сожалению, 3D-игры таким образом отлаживать не выйдет, из-за серьезных отличий в реализации OpenGLES драйвера, отсутствия поддержки специфический сжатий текстур, и т.п. Но для разработки приложений — самое то. Я даже скриншоты для Google Play делаю из этого эмулятора, т.к. нет у меня для этого пачки планшетов разных разрешений. Эмулятор из Android SDK отображает только 65к цветов и для этих целей не подходит.
Чуть позже в эмулятор была интегрирована разработка Intel — libhoudini. С ее помощью, на устройствах с архитектурой x86 возможен запуск приложений, собранных под ARM, причем не эмулируя всю архитектуру, а транслируя инструкции ARM в код совместимый с x86 в реальном времени. К сожалению для полноценной работы libhoudini похоже необходима аппаратная виртуализация, т.к. ничего кроме флеш-плеера в браузере мне на ноутбуке запустить не удалось. Хотя ранее на рабочей машине запускал для тестов какие-то игрушки, без нативной поддержки архитектуры x86.
Позже были добавлены захват мыши(эмулятор может работать как с “плеером”, так и просто в окне VirtualBox), и поддержка общих папок. Последняя функция тоже очень удобна в некоторых случаях, когда нужно скопировать много файлов на эмулятор, или же вообще открыть файл с жесткого диска, без копирования на виртуальную флешку.
Общие папки монтируются в /mnt/shared/имя_общей_папки
Безусловно, проект пока не отличается безотказностью. Например, плеер иногда зависает, или вовсе вылетает с ошибкой. Лично у меня подобное наблюдалось при малом количестве свободной оперативной памяти. Иногда вообще создается впечатление, что в плеере есть утечки памяти… Но после наращивания памяти до восьми гигабайт проблемы с зависаниями и вылетами прошли.
Частенько после переключения на окно плеера, отображается только белый экран. Лечится это вождением мыши в разные стороны, с зажатой левой кнопкой. Думаю данная проблема возникает из-за того что в режиме ожидания от эмулятора перестают приходить команды перерисовки экрана, и картинка “теряется”, пока не заставишь экран перерисоваться.
Так же на “телефонных” разрешениях отсутствует кнопка вызова меню. Фичреквест по этому поводу я недавно отправил разработчику, обещали добавить. Пока же можно использовать для этого кнопку F1 на клавиатуре.
Не предусмотрено изменение ориентации экрана в интерфейсе эмулятора. Это легко решается установкой любого приложения для принудительного его поворота. Я например использую Ориентатор экрана от нашего соотечественника. Если настроить приложение как на скриншоте, то получим маленькую иконку в районе панели уведомлений, при нажатии на которую, ориентация циклически будет меняться во все стороны.
Правда для портретной ориентации придется обзавестись монитором, в котором вертикально умещается нужное Вам разрешение экрана. В бета-версии Genymotion все пока еще хуже. Там размер окна плеера изначально задается меньше выбранного разрешения эмулятора, и картинка искажается, даже если вполне умещается в экран.
Вот как выглядит портретная ориентация эмулятора с разрешением 1024x600, на моих 1366x768:
Нужен ли вам данный эмулятор?
Если не учитывать устоявшиеся личные предпочтения, то ответом будет положительным, если:
— Вам нужна полноценная цветопередача в эмуляторе;
— Ваш процессор не поддерживает аппаратную виртуализацию в эмуляторе из Android SDK. Genymotion подходит и для процессоров AMD, и способен использовать их аппаратную виртуализацию, или же работать вовсе без ее поддержки у процессора;
— Вам нужны Google Apps или Adobe Flash;
— Вам нужно проверить работоспособность приложения на устройствах на базе платформы x86, и по какой-то причине приложение невозможно собрать под данную платформу. Т.е. проверить работу приложения через libhoudini.
— Вы хотите помочь проекту, либо собрать свой на его основе. Проект открыт(правда после ребрендинга будут доступны исходники не всех фишек эмулятора), исходники доступны на github.
Разработчики охотно отвечают на вопросы и принимают багрепорты в своей Google-группе.
Правда, не совсем понятно, каким образом решатся вопросы с использованием Google Apps и libhoudini в коммерческом проекте… Но поживем — увидим!