Заметки по платформе и компилятору - Android
Эта страница содержит информацию, специфичную для создания приложений Qt для платформы Android и их запуска на ней. Qt поддерживает версии Android 4.1 (уровень API 16) и более поздние.
Разработка под Android в Qt Creator
Самый простой способ разработки приложений Qt для Android — использование Qt Creator. При применении набора инструментов Qt для Android к проекту Qt Creator он создаст и будет поддерживать набор файлов, необходимых для запуска вашего приложения на Android.
Добавляемые в ваш проект файлы:
- Файлы .java будут служить точкой входа в ваше приложение и автоматически загружать Qt для выполнения нативного кода в вашем приложении
- AndroidManifest.xml, который предоставляет метаинформацию о вашем приложении
- Другие XML-файлы, описывающие зависимости вашего приложения
- Файлы ресурсов
- В зависимости от выбранного метода развертывания в Qt Creator, в проект могут быть добавлены дополнительные файлы, такие как библиотеки и файлы QML.
Qt Creator добавляет эти файлы в подкаталог вашего проекта с именем android. Содержимое папки android используется в качестве основы для пакета распространяемого приложения.
Пакет приложения
На Android приложения распространяются в пакетах, называемых APK. Qt Creator создаёт APK для вас, но если вы по какой-то причине хотите сделать это вручную, вы должны сначала убедиться, что на месте находятся соответствующие файлы пакета и сборки. Более подробную информацию о том, как происходит упаковка, см. в Развёртывание приложения на Android.
Развертывание
Qt Creator в настоящее время поддерживает три метода развертывания для приложений Android: по умолчанию метод развертывания подходит для распространения файла APK. С этим методом развертывания необходимые библиотеки и файлы Qt будут скопированы в вашу директорию проекта и включены в APK, так что вы получите автономный, готовый к распространению пакет приложения.
Развертывание с Ministro
Второй метод подходит, если вы хотите минимизировать размер вашего APK, и его можно выбрать, открыв настройки Запуск вашего проекта, развернув Настройки развертывания и сняв отметку с поля Использовать локальные библиотеки Qt. В этом случае ваше приложение будет иметь внешнюю зависимость под названием Ministro. Если пользователь загрузит ваше приложение, и это первое приложение на его устройстве, зависящее от Ministro, ему будет предложено установить его, прежде чем он сможет запустить ваше приложение. Ministro загружает библиотеки Qt из репозитория по вашему выбору. URL репозитория можно задать, отредактировав файл android/res/values/libs.xml, который создаётся Qt Creator при настройке вашего проекта. Ministro затем будет служить центральным репозиторием для библиотек Qt, и несколько приложений могут использовать общие библиотеки, чтобы ограничить количество дублирования. Обратите внимание, что использование этого метода развертывания требует репозитория для библиотек, которые вы хотите распространять.
Развертывание для отладки
Третий метод удобнее, когда вы просто тестируете ваше приложение на устройстве, физически подключённом к вашей машине разработки (или эмуляторе). Он скопирует библиотеки Qt в временную папку на вашем устройстве и запустит приложение с использованием этих библиотек вместо них. APK, созданный таким образом, не подходит для распространения, поскольку он зависит от подготовки устройства для размещения библиотек Qt в нужном месте. Однако, поскольку библиотеки Qt копируются на устройство только один раз, это обеспечивает более быструю скорость обратной связи, поэтому это больше подходит для тестирования изменений в вашем приложении во время разработки. Этот метод развертывания можно выбрать, открыв настройки Запуск вашего проекта, развернув Настройки развертывания и выбрав Развернуть локальные библиотеки Qt. Убедитесь, что флажок Использовать локальные библиотеки Qt также установлен.
Особые моменты для плагинов и импортов
Если приложение использует плагины или импорты, которые зависят от других модулей, эти модули должны быть перечислены в зависимостях приложения. Это связано с тем, что Qt Creator не знает заранее, какие импорты или плагины загрузит ваше приложение.
Например, если код QML вашего приложения импортирует Qt Multimedia, то модуль Qt Multimedia должен явно быть зависимостью приложения. Вы можете сделать это, добавив его в файл .pro приложения:
QT += multimedia
Также возможно вручную включить зависимости от библиотек Qt, открыв настройки Запуск вашего проекта, развернув Настройки пакета и выбрав вкладку Библиотеки. Вручную отметьте библиотеки, которые являются зависимостями вашего проекта.
Особые моменты для текста
Из-за ошибки в некоторых драйверах OpenGL механизм, используемый Qt для кэширования глифов текста, не работает должным образом на всех устройствах Android, что приводит к искажению текста. Для решения этой проблемы применено решение, которое увеличивает потребление памяти и может повлиять на производительность отображения текста. До Qt 5.3.2 это решение применялось только для определённого набора устройств. Теперь оно используется по умолчанию на всех устройствах.
Вы можете отключить это решение, установив переменную среды QT_ANDROID_DISABLE_GLYPH_CACHE_WORKAROUND на значение 1. Вы должны сделать это только после проверки того, что текст отображается корректно на всех целевых устройствах.
Особые моменты для OpenGL
При использовании OpenGL следует учитывать некоторые особенности. Плагин платформы поддерживает только полноэкранные окна OpenGL верхнего уровня. Это означает, что даже диалоги и всплывающие окна будут отображаться в полноэкранном режиме. Также могут возникнуть ошибки отрисовки, если вы попытаетесь разместить окна, имеющие анимацию или требующие обновления своего интерфейса, когда они скрыты другим окном.
Рекомендуется избегать нескольких окон верхнего уровня в случае приложений Android, так как на этой платформе нет традиционной системы окон.
Примечание: Встраивание QGLWidget внутри иерархии виджетов не поддерживается. Когда используется QGLWidget, он должен быть виджетом верхнего уровня.
Примечание: Избегайте использования устаревшего QGLWidget. Для встраивания содержимого OpenGL или Qt Quick в интерфейс пользователя на основе виджетов предпочтительнее использовать QOpenGLWidget и QQuickWidget.
Современные устройства часто поддерживают OpenGL ES 3.0 или 3.1 в дополнение к 2.0. Для получения подходящего контекста OpenGL установите запрашиваемую версию с помощью QSurfaceFormat::setVersion(). Однако обратите внимание, что заголовочные файлы доступны только в последних уровнях API, например, чтобы включить gl31.h, необходимо нацеливаться на уровень API 21. Также следует учитывать, что использование функций OpenGL ES 3.x приведёт к тому, что приложение перестанет работать на более старых устройствах, которые поддерживают только 2.0.
Особые моменты для мультимедиа
Модуль Qt Multimedia Widgets не поддерживается на Android, что означает, что отображение видео доступно только с помощью VideoOutput и типа QML Video.
Файловая система ресурсов
Qt для Android предоставляет специальную виртуальную файловую систему, основанную на механизме assets в Android. Файлы, помещённые в папку assets в папке android, созданной Qt Creator, будут включены в ваш пакет приложения. В Qt к этим файлам можно получить доступ, добавив префикс к путям assets:/. Например, чтобы получить доступ к изображению logo.png в папке assets/images, можно использовать QPixmap("assets:/images/logo.png").
Если механизм ресурсов не требуется для вашего приложения, рекомендуемый способ распространения ресурсов с вашим приложением Qt — использование Системы ресурсов Qt, которая является кроссплатформенным механизмом для распространения ресурсов с вашим приложением.
Поддерживаемые архитектуры
Qt для Android в настоящее время имеет двоичные файлы для ARMv7 и x86. Убедитесь, что вы выбрали правильную архитектуру для устройства или эмулятора, на который вы нацеливаетесь, иначе ваше приложение будет аварийно завершено. Архитектура MIPS в настоящее время не поддерживается Qt.
Если вы хотите поддерживать несколько различных архитектур в своём приложении, рекомендуется создавать отдельные APK для каждой архитектуры, чтобы каждый APK содержал только двоичные файлы, необходимые для целевой архитектуры. Более подробную информацию об этом см. в документации Android о Поддержке нескольких APK.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.12/android-platform-notes.html