3 февраля 2018 г.

Проблема запуска Android emulator из командной строки

Хочется, но не удаётся
    Если вы попытались запустить эмулятор Android из командной строки и словили ошибку
ERROR:android/android-emu/android/qt/qt_setup.cpp:28:Qt library not found at ../emulator/lib64/qt/lib
для GNU/Linux или
emulator/qemu/windows-x86_64/qemu-system-i386.exe': No such file or directory
для Windows, то вам сюда.

    Первое, что нужно сделать — это убедиться, что эмулятор вообще можно запустить из командной строки. Перейдите в каталог с SDK, а там — в директорию tools, где лежит эмулятор. Для меня это команда
cd $ANDROID_HOME/emulator/
    Но у вас может быть другой, не важно. Теперь запускаем эмлятор отсюда. Если не помните названия своих эмуляторо, то сначала посмотрите их:
umnik@um:~/Android/Sdk/emulator$ ./emulator -list-avds
и она возвращает список существующих эмуляторов:
Nexus_4_API_22
Nexus_5X_API_26
Nexus_5_API_18
    Если у вас точно есть созданные эмуляторы, Студия их запускает, но эта команда сообщает, что эмуляторов нет, то вам нужно создать переменную окружения ANDROID_AVD_HOME с указанием пути к эмуляторам. Узнать путь можно прямо из Студии:
Находим виртуалки на диске
    Так мы попадём в каталог конкретного эмулятора. Теперь поднимаемся на уровень выше и видим все эмуляторы. Вот текущий путь нам и нужен, его и добавляем в эту переменную окружения. Для меня это
/home/umnik/.android/avd/
    Делаем то, что нужно в вашей ОС для применения переменной окружения (от простого перезапуска терминала до перезахода в сеанс пользователя).
Убеждаемся, что теперь запуск эмулятора из каталога $ANDROID_HOME/tools не приводит к проблемам, эмулятор успешно стартует:
umnik@um:~/Android/Sdk/emulator$ ./emulator @Nexus_5_API_18
emulator: WARNING: encryption is off
FramebufferData::restore: warning: a texture is deleted without unbinding FBO
FramebufferData::restore: warning: a texture is deleted without unbinding FBO
Warning: restoring GLES1 context from snapshot. App may need reloading.
    Если запустился, то считайте, что проблема решена. Вариантов костылей у вас несколько, но все они сводятся к двум конкретным:
  • Любым удобным способом указать системе, что при запуске эмулятора его нужно запускать с учётом полного пути
  • Любым удобным способом передать эмулятору недостающие библиотеки
    Просто выберите метод на свой вкус. К примеру, если выбран первый вариант:
  • Можете добавить в ~/.bashrc вот это:
function emulator { cd "$(dirname "$(which emulator)")" && ./emulator "$@"; } 
  • Либо вы можете создать свой alias на эмулятор:
umnik@um:/$ emulator @Nexus_5_API_18
[140147225495360]:ERROR:android/android-emu/android/qt/qt_setup.cpp:28:Qt library not found at ../emulator/lib64/qt/lib
Could not launch '/../emulator/qemu/linux-x86_64/qemu-system-i386': No such file or directory
umnik@um:/$ alias emulator=$ANDROID_HOME/emulator/emulator
umnik@um:/$ emulator @Nexus_5_API_18
emulator: WARNING: encryption is off
^Cemulator: Saving state on exit with session uptime 2071 ms
umnik@um:/$
    Разумеется алиас тоже нужно добавить в ~/.bashrc или где у вас там принято сохранять алиасы
  • Вы даже можете создать переменную окружения $emulator (%emulator%) и вызывать её, хотя это не так удобно
    Если вы выбираете второй способ (копирование библиотек), то вы можете сделать как-то так (не копируем, а делаем линки):
cd $ANDROID_HOME/emulator/lib64/libstdc++$
mv libstdc++.so.6 libstdc++.so.6.bak
ln -sf /usr/lib/x86_64-linux-gnu/libstdc++.so.6 $ANDROID_HOME/emulator/lib64/libstdc++/libstdc++.so.6
    Лично для себя я выбрал алиас в ~/.bashrc. Тем более что можно сделать алиас сразу на конкретный эмулятор и тогда команда типа "nexus4_43" будет запускать эмулятор Nexus 4 с Android 4.3. В общем, вариантов у вас несколько — думайте сами.
    В конце-концов, вы можете попытаться дождаться реального фикса проблемы, который обещали ещё в 26 версии, а сейчас актуальная 27. Дождаться фикса баги, статус которой сейчас Fixed. Успехов!

Комментариев нет:

Отправить комментарий