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. 6.

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

    в 2013 году Все должно работать из коробки при учете что вы используете инструменты от Qt (qmake, QtCreator)
  2. 8.
  3. 15.

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

    плагинов для qml - подготовить gradle проект qttools/src/androiddeployqt/main.cpp
  4. 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] ...
  5. 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
  6. 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>
  7. 19.

    Gradle проект - копируем пустой шаблон gradle - копируем ресурсы

    и исходники - libs.xml, strings.xml, QtActivity.java, AndroidManifest.xml - файлы которые будут перезаписаны
  8. 20.

    res/libs.xml названия всех *.so библиотек, которые были добавлены в apk.

    Их новое имя и старый путь относительно каталога Qt
  9. 21.
  10. 28.

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

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