Upgrade to Pro — share decks privately, control downloads, hide ads and more …

CodeFest 2018. Сергей Лагнер (2ГИС) — Qt под Android — это не сложно

CodeFest 2018. Сергей Лагнер (2ГИС) — Qt под Android — это не сложно

Посмотрите выступление Сергея: https://2018.codefest.ru/lecture/1290/

Сложно назвать разработку на Qt под мобильные платформы очень распространенной. Qt упорно прячет платформо-специфичную логику за своими абстракциями, что наводит на разработчика если не ужас, то как минимум тоску. А зря! В рамках доклада я докажу, что действия «под капотом» вполне логичны и объясню, как десктопная программа на С++ превращается в Activity с жизненным циклом Android-приложения.

16b6c87229eaf58768d25ed7b2bbbf52?s=128

CodeFest

April 09, 2018
Tweet

Transcript

  1. Qt под Android — это не сложно Сергей Лагнер, 2ГИС

  2. Коротко

  3. Коротко • как собирается

  4. Коротко • как собирается • как запускается

  5. Коротко • как собирается • как запускается • как работает

  6. Поддержка Qt в Android Официальная поддержка появилась в Qt 5.2

    в 2013 году Все должно работать из коробки при учете что вы используете инструменты от Qt (qmake, QtCreator)
  7. ApplicationWindow { visible: true Button { anchors.centerIn: parent text: qsTr("Hello

    CodeFest") } } Название раздела
  8. None
  9. Qt C++ часть

  10. Qt C++ часть нет

  11. Qt C++ часть не забыть JNIEXPORT/Q_DECL_EXPORT

  12. androiddeployqt qttools/src/androiddeployqt/main.cpp

  13. androiddeployqt - собрать список зависимостей *.so qttools/src/androiddeployqt/main.cpp

  14. androiddeployqt - собрать список зависимостей *.so - собрать список зависимых

    плагинов для qml qttools/src/androiddeployqt/main.cpp
  15. androiddeployqt - собрать список зависимостей *.so - собрать список зависимых

    плагинов для qml - подготовить gradle проект qttools/src/androiddeployqt/main.cpp
  16. > readelf -d -W libEmptyProject.so | grep NEEDED 0x00000001 (NEEDED)

    Shared library: [libQt5Quick.so] 0x00000001 (NEEDED) Shared library: [libQt5Gui.so] 0x00000001 (NEEDED) Shared library: [libQt5Qml.so] 0x00000001 (NEEDED) Shared library: [libQt5Network.so] 0x00000001 (NEEDED) Shared library: [libgnustl_shared.so] 0x00000001 (NEEDED) Shared library: [liblog.so] 0x00000001 (NEEDED) Shared library: [libz.so] 0x00000001 (NEEDED) Shared library: [libdl.so] 0x00000001 (NEEDED) Shared library: [libc.so] ...
  17. > qmlimportscanner -rootPath . -importPath ~/Qt/qml [ { "classname": "QtQuick2Plugin",

    "name": "QtQuick", "path": "/home/lagner/Qt/5.10.1/android_armv7/qml/QtQuick.2", "plugin": "qtquick2plugin", "relativePath": "QtQuick.2", "type": "module", "version": "2.7" }, { ... androiddeployqt
  18. > cat ~/Qt/lib/Qt5Core-android-dependencies.xml <rules> <dependencies> <lib name="Qt5Core"> <depends> <jar file="jar/QtAndroid.jar"/>

    <jar bundling="1" file="jar/QtAndroid-bundled.jar"/> <lib file="plugins/platforms/android/libqtforandroid.so"/> <permission name="android.permission.INTERNET"/> <permission name="android.permission.WRITE_EXTERNAL_STORAGE"/> </depends> </lib> </dependencies> </rules>
  19. Gradle проект - копируем пустой шаблон gradle - копируем ресурсы

    и исходники - libs.xml, strings.xml, QtActivity.java, AndroidManifest.xml - файлы которые будут перезаписаны
  20. res/libs.xml названия всех *.so библиотек, которые были добавлены в apk.

    Их новое имя и старый путь относительно каталога Qt
  21. None
  22. Android Java часть NativeActivity и android_native_app_glue

  23. Android Java часть QtApplication QtActivity

  24. java QtActivity

  25. java QtActivity - распаковать asset’ы, восстановить структуру каталогов.

  26. java QtActivity - распаковать asset’ы, восстановить структуру каталогов. - предзагрузить

    java классы
  27. java QtActivity - распаковать asset’ы, восстановить структуру каталогов. - предзагрузить

    java классы - загрузить нативные библиотеки
  28. java QtActivity - распаковать asset’ы, восстановить структуру каталогов. - предзагрузить

    java классы - загрузить нативные библиотеки - создать базовые java View
  29. Как работает

  30. Qt QPA Название раздела

  31. Название раздела

  32. APPLICATION_PARAMETERS += "\t--deeplink=foo"; ENVIRONMENT_VARIABLES += "\tLIB_PATH=/system/lib"; > export LIB_PATH=/system/lib >

    app --deeplink=foo QPA
  33. ApplicationWindow { } QtActivityDelegate::createSurface() QPA Qt UI Android UI

  34. QtActivity::onTouchEvent() Button { onClicked: {} } QPA Android UI Qt

    UI
  35. Заключение

  36. None
  37. Заключение

  38. Сергей Лагнер Ведущий программист 2GIS Вопросы?