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

CodeFest 2018. Сергей Лагнер (2ГИС) — Qt под An...

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

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

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

CodeFest

April 09, 2018
Tweet

More Decks by CodeFest

Other Decks in Programming

Transcript

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

    в 2013 году Все должно работать из коробки при учете что вы используете инструменты от Qt (qmake, QtCreator)
  2. androiddeployqt - собрать список зависимостей *.so - собрать список зависимых

    плагинов для qml - подготовить gradle проект qttools/src/androiddeployqt/main.cpp
  3. > 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] ...
  4. > 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
  5. > 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>
  6. Gradle проект - копируем пустой шаблон gradle - копируем ресурсы

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

    Их новое имя и старый путь относительно каталога Qt
  8. java QtActivity - распаковать asset’ы, восстановить структуру каталогов. - предзагрузить

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