Пользователь
0,0
рейтинг
27 ноября 2011 в 01:11

Разработка → Qt для Android (Necessitas Framework) – действительно ли это работает?

Этот пост участвует в конкурсе «Умные телефоны за умные посты».

Так получилось, что у меня есть кое-какой опыт разработки приложений под Qt, а недавно появился коммуникатор на Android. Узнав о том, что существует проект Necessitas (раньше он называвался Android-Lighthouse), захотелось проверить возможность запуска Qt приложений под Android на практике.





Чтобы начать перенос программы, нужно установить Necessitas SDK (существуют версии под Linux, Windows, MacOS). Он включает в себя Qt Creator, разнообразные компоненты Qt, собственные библиотеки, а также ставит Android SDK и NDK, если их еще нет на компьютере.

В окне настроек (Tools->Options) Necessitas Qt Creator есть дополнительная вкладка — Android. Иначе выглядят и свойства проекта, там появляются характерные для Android опции вроде разрешений на использование ресурсов телефона. Также надо четко указать, какие библиотеки использует приложение (в моем случае это были QtCore, QtGUI, QtDeclarative). Если не указать нужную библиотеку или не задать название для приложения, на выходе получится неработающий .apk.

Для тестирования на реальном устройстве надо поковыряться еще и c adb. Вероятно, это знакомо всем, кто разрабатывает что-нибудь для Android под Linux, но для пришедших из мира Qt это может быть неожиданным. Чтобы устройство было доступно для развертывания приложений (и Qt Creator не падал, когда не может найти такого устройства), нужно произвести настройки USB и перезапусть adb под рутом:

cd /opt/necessitas/android-sdk-linux_x86/platform-tools/
./adb kill-server
sudo ./adb start-server

Собирать Qt-приложения можно только под Android 2.2 и выше, при выборе более старой версии появится ошибка во время компиляции. При появлении ошибок во время сборки, стоит удалить из папки проекта все файлы .pro.user, оставив только один .pro-файл, и заново открыть проект в Qt Creator.

В остальном Necessitas SDK сделан прекрасно – настраивается за 5 минут, а на выходе получается готовый к установке .apk.

     

Когда программа запускается на устройстве первый раз, она скачивает приложение Ministro из Android Market. Он выступает как бы мостом между Qt-приложением и операционной системой, подгружая нужные конкретному Qt-приложению библиотеки. При первом запуске библиотеки скачиваются из Сети, потом просто подгружаются в память.

Разобравшись с тем, как все это работает, мне удалось успешно скомпилировать и запустить на перепрошитом на Froyo коммуникаторе ZTE Blade программу для изучения иностранных слов OppiaSanoja. Necessitas корректно поддерживает основной нужный ей функционал – отрисовку QML (с соблюдением пропорций и внешнего вида элементов – все выглядит точно так, как на Maemo и MeeGo), работу с файловой системой, обращения к QSettings (правда, все настройки обнуляются при переустановке программы, чего не происходит, скажем, на Maemo).



Самому разработчику и другим заинтересованным лицам пользоваться продуктом вполне можно – никаких критических недоработок и ограничений в Necessitas нет (хотя для более сложных программ может не хватать, например, аппаратной отрисовки OpenGL). Да и просто само зрелище завораживает – вид работающего Qt-приложения на Android-аппарате. Но двигать такие произведения в массы пока рано. Вот какие ошибки обнаружились даже в несложной программке:

— При бездействии приложения и его повторном запуске выдается окно с ошибкой. Эта проблема характерна именно для Android, так как на Nokia N900 это же приложение неделями висит в фоне и корректно восстанавливается обратно.

— При восстановлении из фона не отрисовывается текущий QML-вид (пользователь будет видеть черный экран, пока не начнет тыкать по экрану или слайдить). Эта проблема уже замечена разработчиками, в какой-нибудь из будущих версий ее исправят.

— Виртуальная клавиатура остается на экране всегда, будучи хоть раз вызвана (конечно, пользователь может убрать ее нажатием кнопки back, но лучше, если бы это умела сама программа).

— И, наконец, несмотря на четкое задание только ландшафтной ориентации, Ministro срабатывает на сенсор и переводит программу в портретный режим, если пользователь поворачивает устройство.



Возможно, часть этих вопросов так или иначе можно решить, но у Necessitas нет обширной документации, а в списке рассылки эти вопросы проигнорировали (как, впрочем, игнорируется и большая часть других).

Подытоживая, можно сказать, что сейчас Necessitas – это скорее красивая игрушка для гиков (есть, кстати, версия для запуска Qt-приложений на Bada), чем реально применимый в разработке фрэймворк (об невозможности на данный момент создания массовых приложений говорится и на странице проекта).

Учитывая ситуацию в Nokia и малое количество разработчиков Necessitas, вряд ли в ближайшее время можно будет создавать Qt-приложения под Android для выпуска в массы. Впрочем, всегда можно присоединиться к проекту (Necessitas работает по принципу open source) и поработать над улучшением связки Qt+Android.
@bpeme4ko
карма
1,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (32)

  • +9
    Ох, как-то вы очень пессимистичны.
    1. На нецесситасе работает например ДубльГИС под Андроид (вернее не на самом нецесситасе, а на форке, но тем не менее)
    2. Сейчас нецесситас рано использовать по одной причине — может измениться API и ABI. Когда выйдет бета (а это будет скоро) уже можно будет не бояться
    3. Андроидом заинтересовано много людей. И из Нокии в том числе. Например, Томас (который вел на DevDays'11 секцию по Андроиду в Contributors Day) работает в Нокии и он занимается поддержкой OpenGL в нецесесситасе.
    4. Те баги которые вы назвали на самом деле являются минорными. Гораздо более интересными багами являются проблемы мобилити, отсутствие (хотя работа ведется и вроде что-то сделано более менее) внятного стиля для андроида, отсутствие qt components (работа правда опять же ведется)

    Как то так.
    • 0
      А где-нибудь можно посмотреть на qt-components для Android?
      • 0
        В necessitas-devel один человек отписывался на эту тему с тем как идет прогресс пару раз. Заинтересованные могут порыться в архиве мейллиста
    • 0
      Что за форк? Чем отличается?

      Ну вот, Вы же сами написали, что серьезных багов хватает, так что я не зря пессимистичен :) Просто у маленького приложения заметны маленькие баги, а если бы делал что-то большое, тогда бы наверное еще веселее было.

      В любом случае, спасибо за подробный отзыв! Рад, что все-таки собрался с духом написать на Хабр, а то кругом только .Net и Java, никто всякими кроссплатформенными извращениями не занимается )
      • +1
        Я могу сказать что перенос приложения, изначально написанного под symbian^3 на qml, с использованим карт и камеры из мобилити занял у меня примерно 3 дня. Из них два я фиксил мобилити. Пофиксил, отправил дифф, но чем дело закончилось, уже не помню. Так что как таковых проблем на самом деле нет.
        Есть мелочи. И есть блокеры, которые можно пофиксить и самому (либо написать данную часть приложения по другому/временно отключить этот функционал).

        Просто нужно понимать что такое стадия альфа у проекта. Естественно для варианта «взял и все работает» это не подходит.
        Для варианта «взял, допилил, подумал, переписал, работает» это подходит
      • 0
        а по поводу кросс платформенных извращений… это вы просто не там смотрите :D все есть
    • 0
      Ах вот почему ДубльГИС периодически намертво зависает у меня под Galaxy… теперь ясно.
      • 0
        Дубльгис основан не на нецесситасе! Он основан на самостоятельном форке нецесситаса, который произошел достатчно давно. Сейчас опираться на проблемы дубльгис при анализе работы нецесситас крайне некорректно
  • 0
    Давненько я не брал в руки шашек...
    То есть тьфу, Necessitas, конечно же.

    Собственно те проблемы, которые, вы описали, как сказал коллега выше — ерунда.

    А как дела обстоят с поддержкой звука, камеры, контактов и т. д.?
    То есть, мне интересно насколько хорошо сейчас поддерживается Qt Mobility.
    • НЛО прилетело и опубликовало эту надпись здесь
      • 0
        На самом деле камера работает. Единственное что ей надо это libffmpeg и пара фиксов. По этой теме подробнее можно почитать в necessitas-devel
  • +1
    Что за форк? Чем отличается?

    Ну вот, Вы же сами написали, что серьезных багов хватает, так что я не зря пессимистичен :) Просто у маленького приложения заметны маленькие баги, а если бы делал что-то большое, тогда бы наверное еще веселее было.

    В любом случае, спасибо за подробный отзыв! Рад, что все-таки собрался с духом написать на Хабр, а то кругом только .Net и Java, никто всякими кроссплатформенными извращениями не занимается )
    • +2
      gitorious.org/+grym/qt/grym-android-lighthouse Этот порт, чем отличается спрашивайте у разработчиков, они его пилят конкретно под свое приложение, поэтому он менее универсален, и конечно не имеет таких клевых плюшек как нецеситасс.
  • НЛО прилетело и опубликовало эту надпись здесь
  • 0
    А можно ли этим SDK пользоваться без устройства — чтобы попробовать? И есть ли там командная строка, а то я как-то с Creatorом не сдружился, предпочитая старый добрый qmake && make?
    • +1
      Можно без девайса. Есть эмулятор.
      Можно все собирать из консоли. В некоторых случаях это даже проще чем в креаторе.
    • 0
      Дело вкуса, конечно, но сейчас QtCreator выглядит как наиболее готовый продукт для C/C++ под linux. А ещё там очень хорошая обёртка над gdb.
  • 0
    Статья из серии «скачай это и оно будет работать».
    Хотя, не отрицаю, было интересно почитать (тоже Андроидом владею).
  • +1
    Ох и натерпелись мы с этим Necessitas когда-то в своем проекте :)
    Начнем с того, что там не был собран QtDBus (dbus в андроиде, как известно, есть). Собрать — собрали, а загрузить не можем: Ministro то не знает о нашей библиотеке. Давай смотреть, что же Ministro делает, когда загружает библиотеки. Оказалось, что он грузит xml-файл с сервера Necessitas`а, в котором описаны Qt-библиотеки, путь до них на сервере, их версии, размер, и… порядок загрузки! Этим порядком загрузки определяется и порядок линковки библиотек. В общем, <trollface> делать было нечего, подняли мы свой Apache </trollface>. Создали такую же структуру каталогов, как на сервере. Пропатчили xml-файл, добавив туда QtDBus. Начинаем загружать с помощью Ministro библиотеки… падает на линковке, т.к., если не ошибаюсь, он линкует их как только загрузил библиотеку. Тогда-то мы и узнали что порядок загрузки определяет порядок линковки.

    Этот упоротый Ministro еще и заново загружает каждый раз библиотеки после перезаливки приложения. Почему нельзя было, например, с apk класть эти библиотеки? Ведь Qt-программа, собранная Necessitas`ом — это та же библиотека.

    А еще, если нужно консольное/демон Qt-приложение под андроид, то можно просто исправить Makefile, генерируемый Necessitas, чтобы собиралась не библиотека, а готовый бинарник.

    Еще из интересно, что встретилось при работе с Necessitas: часто вылетает сообщение «QEventDispatcherUNIX: internal error, wakeUps.testAndSetRelease(1, 0) failed!». И еще довольно странно ведет себя QWaitCondition: похоже, не всегда отрабатывает wakeAll().
    • 0
      Министро не упоротый. Он наоборот все правильно делает.
      Если нужны свои либы, то можно в креаторе пометить Use local libs. И все будет хорошо (кроме qml-плагинов).

      Qt либы не кладутся в apk с прогой, потому что тогда на девайсе будет дофига разных версий кьюта. По одной для каждого приложения. Министро, собственно говоря, и нужен чтобы этого избежать
      • 0
        Упс, не туда ответил. См. ответ ниже.
  • 0
    Ха. Во-первых, как вы определите порядок линковки через «Use local libs» ?) Если бы все это работало, проблем бы не было.

    А во-вторых, если не ошибаюсь, Ministro как раз загружает библиотеки в папку с именем программы, что как бы уже означает, что для каждой программы — свои библиотеки.
    • 0
      Очень просто. Правлю .java файлы. И все работает :D

      Ошибаетесь. Он кладет либы в папку приложения министро. То есть они одни. Еще раз повторю, министро сделан для того чтобы была одна копия Qt в системе и она была постоянно свежей
  • 0
    >нужно произвести настройки USB и перезапусть adb под рутом:
    при правильной настройке нужно только udev перезапустить и девайс перевоткнуть — рут для adb не нужен
  • 0
    Ну еще проблемы есть с дебагом. У меня так и не получилось нормально дебажить.

    А насчет «Черный экран» в qml при возвращении. Эмпирическим путем было устанвленно, что если выставить у виджета по бокам отступы в 1 пиксел, то всё работает нормально =D. Этой рамки толком заметно не будет, но работать всё будет!
  • 0
    Пробовал я эту штуку. Ну работает, после определенных шаманских действий. Да, наверное есть смысл, если очень уж хочется портировать готовое Qt-приложение на Андройд. Но начинать с нуля проект — боже упаси.
  • 0
    Спасибо, ценный обзор.
    С учётом направленности Нокиа, вероятно скорее стоит ожидать развития Qt в сторону Windows Phone, чем в сторону Android.
    • 0
      Они наверное уже устали повторять, так что повторю за них: Официального порта Qt на WP не будет до тех пор пока Microsoft не предоставит спецификации API, а зная Microsoft это произойдет никогда
      • 0
        Скоро восьмая будет. Там по идее все будет ок. Судя по анонсам.
  • +1
    Отличный пример приложения под Android на Qt — 2gis.
  • 0
    Все это хорошо, но вот подружить это все с cmake например весьма непросто. Как представлю количество костылей и подпорок, что все это взлетело, аж жутко становится.

    Интересно, кто-нибудь подобным мазохизмом занимался?
    • 0
      Я занимался. Пришлось руками генерировать pro-файлы через configure_file() в CMake, но это заняло не так много времени, как я изначально предполагал.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.