Заметки по платформе и компилятору - Android
Эта страница содержит информацию, специфичную для создания приложений Qt и их запуска на платформе Android. Qt поддерживает версии Android 4.1 (уровень API 16) и выше.
Разработка под Android в Qt Creator
Самый простой способ разработки под Android с Qt — использовать 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.
Файловая система Assets
Qt для Android предоставляет специальную виртуальную файловую систему, основанную на механизме assets в Android. Файлы, помещенные в assets в папке android, созданной Qt Creator, будут упакованы в пакет вашего приложения. К ним можно получить доступ в Qt, добавив префикс к путям assets:/. Например, чтобы получить доступ к изображению logo.png в папке assets/images, можно использовать QPixmap("assets:/images/logo.png").
Если механизм assets не требуется для вашего приложения, рекомендуемый способ распространения ресурсов с вашим приложением 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.13/android-platform-notes.html