Делаем прививки мертвецу или Как оптимизировать эмулятор Android

Делаем прививки мертвецу или Как оптимизировать эмулятор Android

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

Те программисты, которые имеют опыт разработки под iOS, удивляются разительному выигрышу в скорости, присущему яблочному эмулятору. Тут нужно отметить, что iOS Simulator, входящий в пакет для разработки Xcode, архитектурно является симулятором. Другими словами, генерируемые им инструкции сразу же выполняются под x86, в то время как Android Emulator является эмулятором, который реализует поверх x86 полноценную архитектуру ARM, с появляющимся в результате этапом трансляции опкодов. Именно это является главной причиной низкой производительности данного инструмента разработки.

Что думают опытные программисты о  эмуляторе под iOS.

Со временем многие разработчики под Android переходят на куда более шуструю связку VirtualBox + Android x86 (разговор о ней требует отдельной статьи), в которой получается некое подобие симулятора, чья скорость очень даже приемлема для работы. Реже разработчики просто ставят Android x86 на машину и, загружаясь, отлаживают приложения под ней. Либо пользуются отладкой на реальном устройстве при помощи ADB (эта тема тоже стоит отдельной заметки). Мы же коснемся методов оптимизации эмулятора Android. Потому что, например, под рукой может не оказаться настоящего девайса или возможности установки Android x86 (который, кстати, не умеет «звонить», «работать с GPS», не меняет ориентацию экрана, а также запаздывает с реализацией новых версий системы).

Трюк #1. Использование снапшотов.

Чтобы сделать процесс загрузки Android в эмуляторе быстрее, нужно его не выключать (логично). Для этих целей разработчики сделали систему снапшотов (snapshots) – сохраняемых образов состояния системы, которые в очередной раз просто загружаются в память, минуя стандартный ход загрузки эмулятора. Чтобы ими воспользоваться, вызываем утилиту AVD Manager, щелкаем на нужное виртуальное устройство, затем «Edit» и в появившемся окне ставим галочку в пункте под названием «Snapshot».

Трюк #2. Выделяем ресурсы.

Не будем далеко уходить из предыдущего пункта и здесь же, в настройках виртуального девайса в AVD. Manager’е, выделим для его работы чуть больше оперативной памяти. Нас интересует пункт «Hardware», в котором есть подпункт «Device ram size». Поиграйте с прописанным тут значением, попробовав установить побольше и посмотреть на производительность эмулятора.

Трюк #3. Перепривязываем ядра.

Если у вас компьютер с несколькими процессорами, то пройдет следующая уловка. При включенном эмуляторе в Windows 7 вызываем системный диспетчер задач, находим процесс эмулятора (emulator-arm.exe), щелкаем правой кнопкой мыши на нем, выбираем пункт «Задать соответствие».

В появившемся диалоге переставляем галочку на какой-нибудь из процессоров в списке.

Сообщество говорит, что такой перепривязкой процессоров достигается двукратное повышение производительности, однако это заблуждение. Но определенный прирост скорости этот метод дает. Здесь же, в диспетчере задач, можно установить более высокий приоритет для процесса эмулятора Android.

Трюк #4. Используем x86-плюшку от Intel.

Если вы счастливый обладатель ОС от мелкомягких старше Windows XP SP 2, а в вашей машине торчит процессор от Intel с поддержкой инструкций EM64T, VX-t и Execute Disable Bit (можно проверить это тут — http://ark.intel.com), а сама она обладает объемом оперативной памяти не менее 1 Гб, то вам очень повезло – корпорация Intel выпустила специальный допинг для эмулятора Android. Называется он Intel HAXM или Intel Hardware Accelerated Execution Manager (это начиная с версии Android SDK не младше 17-ой, в девичестве этот механизм назывался Intel x86 Emulator Accelerator). Данная технология дополняет эмулятор, во время его функционирования, работая с ним в паре и ускоряя его. Она предоставляет возможность фирменной аппаратной виртуализации и предназначена специально для того, чтобы вдохнуть немного жизни в доходягу-эмулятор. Устанавливается эта полезная штука из-под Android SDK Manager. Прокручиваем вниз список пакетов (packages) и в разделе Extras находим пункт «Intel Hardware Accelerated Execution Manager» (или похожий). Выбираем его галочкой и инсталлируем.

Внедрение Intel HAXM в эмулятора Android.

Затем проходим в появившуюся папку <путь до Android SDK>\extras\intel\Hardware_Accelerated_Execution_Manager, находим там IntelHaxm.exe и запускаем его. Появится мастер установки, как у любого приложения, и попросит ввести объем оперативной памяти, который будет использовать гипервизор (я оставил по умолчанию, но в будущем можно менять его, вновь запуская установщик). Если в ходе установки появятся критические ошибки, значит либо вы не счастливый обладатель написанного в первом абзаце, либо обладаете этим богатством, но оно не настроено должным образом – читайте мануалы к вашему BIOS.

После окончания установки запустим системную консоль Windows (Win + R, «cmd») и убедимся, что всё хорошо. Введем команду «sc query intelhaxm». Если выведется что-то похожее, то всё OK:

Теперь настроим работу ускоренного эмулятора. Из Android SDK Manager выкачиваем пакет Intel x86 Atom System Image (доступен в пунктах Android 4.1, Android 4.0.3 и Android 2.3.3).

Теперь в AVD Manager’е мы можем создавать виртуальные устройства x86-based с этими версиями ОС. Всё создается как обычно, но в пункте Target выставляется значение, связанное с «Intel Atom x86».

Теперь если в настройках на самом виртуальном устройстве. Пройти в пункт «About phone», то его «Model Number» будет содержать значение «Android SDK built for x86», что будет означать, что мы всё сделали правильно и теперь опкод, генерируемый эмулятором, сразу же транслируется в x86. Если разрабатываемые приложения не содержат нативного кода, то вы даже не столкнетесь с какими-либо изменениями. Если содержат – то нужно будет их пересобрать, вписав поддержку x86 в make-файл. А в целом получится неплохой прирост в скорости, почти как у реального устройства. В случае с Linux подобный эффект достигается использованием KVM, Kernel-based Virtual Machine. Данное программное обеспечение устанавливается в систему. А затем эмулятор Android запускается командой. Синтаксис которой примерно такой: «emulator -avd avd_name -qemu -m 512 -enable-kvm» (подробнее тут — http://developer.android.com/tools/devices/emulator.html#accel-vm).

Трюк #5. Стероиды для графики.

Эмулятор Android рендерит графику, не подключая помощь GPU, иными словами, без аппаратной акселерации. Но, начиная с Android 4.0 стало возможным перекладывать рендеринг на плечи Open GL. Что позволяет выиграть в производительности. По умолчанию данная фича выключена, однако в AVD Manager’е можно её активировать. Достаточно в пункте “Hardware” настроек виртуального устройства выставить значение подпункта «GPU emulation» в «yes».  Либо запускать эмулятор из командной строки с параметром «-gpu on».

Работает лишь вкупе с трюком #4 и версией системы в виртуальном устройстве не ниже четверки. Вместе с его использованием исчезает возможность делать снапшоты.

Вместо послесловия… несколько идей.

  • Run > Debug Configurations > Проект > Target > Emulator launch parameters >галка на Disable Boot Animation. Отключаем загрузочную заставку.
  • Эмулятор базируется на программном решении QEMU. В результате для эмулятора Андроид работают все методы оптимизации этого продукта.
  • Иногда бывает полезно отключить антивирус во время разработки.