Заметки по платформе и компилятору - 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/archives/qt-5.11/platform-notes-android.html