mafulechkaJuly 8, 2019, 5:21 a.m.

Как соответствовать новым требованиям Google Play

Content

Начиная с 1 августа Google Play больше не будет принимать новые приложения или обновления приложений без 64-битной версии (если, конечно, вообще не существует нативного кода). Для пользователей Qt это означает, что вам нужно создать дополнительный APK, содержащий 64-битные двоичные файлы.

Qt поставляет 64-битные двоичные файлы для Android (начиная с Qt 5.12.0), поэтому с технической точки зрения соблюдение нового требования не представляет особой проблемы. Но после обсуждения с пользователями стало ясно, что не всем понятно, как настроить приложение в Google Play, которое поддерживает несколько архитектур одновременно.

Этот призыв о помощи в сочетании с тем фактом, что сейчас настраивается новая рабочая станция Windows (Windows work station), предоставило прекрасную возможность взглянуть на разработку приложений Qt для Android в целом. В этом блоге мы начнем с чистого листа и покажем, как начать работу на Android, а также как опубликовать приложение, соответствующее требованиям Google Play.

Мы будем:

  • проходить через все этапы установки, необходимые для создания рабочей среды;
  • описывать процесс построения приложения для нескольких архитектур,
  • и покажем вам, как загрузить свои двоичные файлы в Google Play.

Первые несколько частей могут быть знакомы многим из вас, поэтому, если вам скучно, и вы хотите ознакомиться с основной темой, можете смело переходить к шагу 4.

Примечание о версиях SDK

SDK Android находится в стадии интенсивной разработки и довольно часто не имеет обратной совместимости, что вызывает проблемы с интеграцией в Qt. Хотя мы максимально быстро реагируем на проблемы, возникающие из-за изменений или регрессий в SDK, но общее практическое правило заключается в том, чтобы подождать, прежде чем обновиться до последних и самых лучших версий Android tools (инструментов Android), пока не появится возможность адаптироваться к несовместимости с Qt.

Хотя на других платформах также были некоторые проблемы, большинство проблем, которые мы видели, были связаны с Windows. Поэтому, если вы находитесь в этой хост-системе, будьте особенно внимательны и проверяйте наличие известных хороших версий перед настройкой среды.

В настоящее время мы рекомендуем использовать следующие инструменты вместе с Qt 5.13.0:

• Android build tools (Инструменты сборки Android) версии 28
• Android NDK r19
• Java Development Kit 8

Шаг 1: Установка JDK

Android - это, прежде всего, платформа на основе Java, и, хотя вы можете писать свои приложения Qt полностью в C++ и/или QML, вам потребуется Java Development Kit для компиляции файлов, которые делают возможной интеграцию.

Обратите внимание, что существует несовместимость между инструментом Android SDK Manager и более поздними версиями Oracle JDK, что делает последние версии JDK непригодными для использования вместе со средой Android. Чтобы обойти это, мы рекомендуем вам загрузить JDK версии 8 для использования с Android.

Вы можете использовать официальные двоичные файлы Oracle или другой вариант, такой как проект AdoptOpenJDK.
Загрузите и запустите установщик и установите его в папку по умолчанию.

Шаг 2. Настройка среды Android

Вторым шагом является получение фактической среды разработки Android. Начните с загрузки и установки Android Studio . Пролистайте различные “beta” и “canary” релизы (версии), и вы найдете последний стабильный выпуск.

Когда Android Studio установлена, вы можете использовать ее для установки “SDK Platform” («Платформы SDK») . Это фактическая коллекция классов Java для конкретного дистрибутива Android. При первом запуске Android Studio вам будет предложено установить платформу SDK. Вы можете безопасно использовать последнюю версию SDK, платформа 29 (platform 29), которая является рекомендуемой по умолчанию.

В дополнение к SDK нам также необходимо установить NDK. Это набор разработчика, используемый для кросс-компиляции кода C++ для запуска на Android. Как упоминалось выше, мы будем использовать Android NDK r19c, а не последний выпуск, поскольку существуют проблемы с Android NDK r20 вызывают ошибки компиляции. Проблема будет решена в Qt 5.13.1 и Qt 5.12.5, поэтому, когда вы начнете использовать их, возможно обновление до Android NDK r20.

И как последний шаг, мы должны убедиться, что используем версию 28.0.3 Android build tools (инструментов сборки Android), а не последнюю версию. Обратите внимание, что это проблема только для хостов Windows.

В начальном диалоговом окне Android Studio нажмите Configure (Настроить) , а затем выберите SDK Manager (Менеджер SDK) . Перейдите на вкладку SDK Tools (Инструменты SDK) и убедитесь, что флажок Show Package Details (Показать подробности пакета) установлен. Под Android build tools (инструментами сборки Android) убедитесь, что вы отменили выбор 29.0.0 и выбрали 28.0.3 вместо этого.

Это приведет к удалению неработающей версии инструментов сборки и установке более старой версии. Нажмите Apply (Применить) , чтобы начать процесс, и когда он будет завершен, у вас будет установлена работающая среда Android.

Шаг 3: Установите Qt

Мы будем использовать Qt 5.13.0. Если вы этого еще не сделали, начните с загрузки онлайн-установщика из своей учетной записи Qt (Qt Account).

При запуске установщика убедитесь, что вы выбрали целевые архитектуры arm64-v8a и armv7a. Это технические названия, соответственно, для 64-битных и 32-битных версий процессоров семейства ARM, которые являются наиболее часто используемыми процессорами на устройствах Android.

Примечание. В частности, для этого примера нам понадобится Qt Purchasing (Qt Покупки), поскольку он содержит приложение, которое мы планируем использовать в качестве демонстрации. Его также можно выбрать из списка.

Когда Qt закончит установку, запустите Qt Creator и откройте Options (Опции) . В разделе Devices (Устройства) перейдите во вкладку Android и выберите каталоги, в которые вы установили различные пакеты на предыдущих шагах.

Если все настроено правильно, Qt Creator покажет зеленую галочку, и вы будете готовы приступить к разработке Android с помощью Qt.

Шаг 4: Настройка проекта в Qt Creator

Для этого примера мы будем использовать Qt Hangman . Это небольшой пример, который мы сделали, чтобы показать, как осуществлять покупки в приложении кроссплатформенным способом.

Сначала мы откроем Qt Creator, что можно сделать с экрана приветствия. После того, как он был открыт, Qt Creator попросит нас выбрать, какие версии Qt мы хотим использовать для его сборки.

Выберите 64-битную и 32-битную версии Qt и нажмите Configure Project .

Чтобы соответствовать дополнительным требованиям в Google Play, мы хотим создать два пакета APK: один для 32-разрядных устройств и один для 64-разрядных устройств. Нам нужно настроить каждый из них в отдельности.

На этом снимке экрана показан пример установки для 32-разрядной сборки. Важные вещи, на которые следует обратить внимание:

• Используйте разные директории теневых сборок для каждой из сборок.
• Убедитесь, что вы выбрали Release конфигурацию (Release configuration) .
• Вы также должны поставить галочку в Sign package (Подписи пакета) , чтобы подписать пакет, в противном случае магазин Google Play отклонит его.

За исключением директории сборки, настройка для 64-битной сборки должна быть такой же. Выберите 64-битный комплект с левой стороны и внесите в него эквивалентные настройки.

Шаг 5: Подготовка манифеста

Кроме того, для двух пакетов потребуются идентичные файлы AndroidManifest.xml , за исключением одной детали: version code (код версии) двух должен различаться. Код версии может быть почти любым, который вы выберете, но нужно учесть, что, когда APK установлен на устройстве из магазина, он выберет APK с наивысшим кодом версии. Как отметил пользователь Qt Фабьен Шеро в комментарии к отчету об ошибке, вы, как правило, хотите установить version code 64-битной версии выше, чем для 32-битной, чтобы устройство, которое поддерживает обе версии, предпочитало 64-битный.

Как отметил Феликс Барз в той же теме, это можно автоматизировать в файле .pro проекта. Вот слегка измененная версия его кода:

defineReplace(droidVersionCode) {
        segments = $$split(1, ".")
        for (segment, segments): vCode = "$$first(vCode)$$format_number($$segment, width=3 zeropad)"

        contains(ANDROID_TARGET_ARCH, arm64-v8a): \
            suffix = 1
        else:contains(ANDROID_TARGET_ARCH, armeabi-v7a): \
            suffix = 0
        # add more cases as needed

        return($$first(vCode)$$first(suffix))
}

VERSION = 1.2.3
ANDROID_VERSION_NAME = $$VERSION
ANDROID_VERSION_CODE = $$droidVersionCode($$ANDROID_VERSION_NAME)

Этот трюк преобразует VERSION приложения в целое число и добавляет новую цифру, в наименее значимом конце, для обозначения архитектуры. Так, например, для версии 1.2.3 код версии будет 0010020030 для 32-разрядного пакета и 0010020031 для 64-разрядного.

Когда вы генерируете AndroidManifest.xml, используя кнопку Build APK в настройках проекта, он автоматически забирает этот код версии из проекта. После того, как вы это сделали и отредактировали манифест, получив имя и название пакета вашего приложения, последний шаг - это сборка пакета: сначала вы делаете сборку с помощью одного из двух наборов, а затем вы должны активировать другой набор и построить снова.

Когда вы закончите, у вас будет два выпускаемых пакета APK (releasable APK packages), по одному в каждой из директорий сборки, которые вы установили ранее. Относительно директории сборки, пакет будет находиться в android-build\build\output\apk\release .

Обратите внимание, что для более эффективной настройки вы, вероятно, захотите автоматизировать этот процесс. Это также вполне возможно, поскольку все инструменты, используемые Qt Creator, могут запускаться из командной строки. Посмотрите на androiddeployqt documentation для получения дополнительной информации.

Шаг 6: Опубликуем приложение в Google Play

Страница публикации в Google Play (Google Play publishing page) довольно-таки самодокументирована, и есть много хороших руководств о том, как это сделать, поэтому мы не будем проходить все этапы заполнения формы. В общем, просто заполните всю запрашиваемую информацию, предоставьте нужные изображения и убедитесь, что все галочки на левой боковой панели имеют зеленый цвет. Вы можете добавить все виды контента здесь, так что не торопитесь с этим. В конце концов, это повлияет на популярность вашего приложения.

Как только это будет сделано, вы можете создать новый выпуск в разделе App Releases (Выпуски приложений) и загрузить в него свои APK.

Стоит отметить, что при первом запуске вам будет предложено разрешить Google Play управлять ключом подписи вашего приложения.

Пока вам нужно будет отказаться от этого, выбрав Opt Out. Чтобы использовать эту функцию, приложение должно быть в новом формате «Android App Bundle». Он пока не поддерживается Qt, но разработчики также работают над этим. На самом деле, Богдан Ватра из KDAB (который также поддерживает порт Android на Qt) уже опубликовал патч (patch), который решает самую сложную задачу получения такой поддержки.

Когда мы получим поддержку, это сделает процесс выпуска более удобным. С форматом AAB Google Play будет генерировать оптимизированные APK-файлы для различных архитектур, но сейчас мы должны сделать это вручную, настроив несколько комплектов и создав несколько APK, как было описано ранее в этом руководстве.

Когда два APK-файла были загружены в релиз (release), вы должны увидеть список, такой как представлен на изображении выше: два отдельных пакета APK, каждый из которых охватывает одну собственную платформу. Развернув каждую из записей, вы можете увидеть, что такое “Differentiating APK details” («Дифференцирующая информация об APK»). Эти критерии используются для выбора одного из другого, когда устройство загружает APK из магазина Google Play (Google Play Store). В этом случае дифференцирующая деталь должна быть родной платформой.

Так что все, что вам нужно сделать - это создание и выпуск приложения Qt в Google Play с 32-битными и 64-битными двоичными файлами. Когда APK будут загружены, вы можете нажать Publish (Опубликовать) и подождать, пока Google Play выполнит свою автоматизацию. И если на данный момент у вас есть 32-битные приложения в магазине, убедитесь, что вы обновили их до 64-битной версии задолго до августа 2021 года, поскольку именно тогда несовместимые приложения больше не будут обслуживаться 64-битными устройства, даже если они также поддерживают 32-разрядные двоичные файлы.

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.
Support the author Donate

Спасибо. Я ждал эту информацию.
Правда требования не такие уж новые. Я первое письмо от гугла получил почти год назад, а еще у вас на форуме тему создавал: https://evileg.com/ru/forum/topic/909/ (думаю, ее как-то стоит слить со статьей или хотя бы ссылку поставить, т.к. по запросу google android 64 bit она одна из первых в выдаче гугла).

К сожалению, нет возможности оперативно разбираться в подобных вещах самостоятельно. Объём проработки информации слишком большой для маленького информационного ресурса. Но как только на блоге Qt вышла подобная полезная статья, так сразу сделали перевод.

Очень полезная информация, увы уже выкинул поддержку 32 битных бедняг.

да, наверное, 32-х разрядную поддержку уже давно поа было выкинуть. К слову, у вас много проектов под Android? Часто много где вижу вопросы о том, пишет ли кто-то вообще на Qt под мобильные системы. При этом вижу мнения, что под мобильные системы стоит писать вообще на нативных средствах. При этом у меня складывается мнение, что проекты есть и их не мало, просто народ об этом обычно не трубит на каждом повороте.

SS

Добрый день.
Спасибо вам огромное за вашу статью!
только начинаю изучать QT под Андроид
4 дня потратил на то чтобы подобрать версию QT которая наконец то скомпилирует мне на windows.
Уже думал вторую операционку ставить Линукс.
Но благодаря вашей статье -поставив все строго как вы описывали - все заработало.

Comments

Only authorized users can post comments.
Please, Log in or Sign up
Timeweb

Let me recommend you the excellent hosting on which EVILEG is located.

For many years, Timeweb has been proving his stability.

For projects on Django I recommend VDS hosting

View Hosting
VS

C++ - Тест 003. Условия и циклы

  • Result:14points,
  • Rating points-10
VS

C++ - Тест 003. Условия и циклы

  • Result:14points,
  • Rating points-10
IP

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:10points,
  • Rating points-10
Last comments
A
  • Andrey
  • April 28, 2021, 1:25 a.m.

Django - Tutorial 036. How to add authentication through social networks. VKontakte

после того как дам разрешение для просмотра моего емайл, вот такая ошибка: AuthForbidden at /social-auth/complete/vk-oauth2/ Your credentials aren't allowed Вот сетингс: SOC…
DV

Qt/C++ - Lesson 051. QMediaPlayer – simple audio player

Добрый вечер. Хотел бы получить консультацию по работе с проектом на Mac OS. Открыл проект в QT и собрал его. Проблема в том, что он не воспроизводит треки и их названия зацикленно мелькают в по…
SS

Как соответствовать новым требованиям Google Play

Добрый день. Спасибо вам огромное за вашу статью! только начинаю изучать QT под Андроид 4 дня потратил на то чтобы подобрать версию QT которая наконец то скомпилирует мне на windo…
YA

PyQt5 - Tutorial 009. Using QThread with MoveToThread

Hello. Let's say I want to send some variables to "run" define. How can we do that? I modified your code, I tried something like below, but the GUI is frozen that way. I could not be able to und…
R

Распознавание изображений на Python с помощью TensorFlow и Keras

почему то вместо 50000 обрабатывает по 782 картинки кажду. эпоху
Now discuss on the forum

Потеря данных в сигнал/слот

вопрос решен
M

Qt/QML/Android(navigation button) - Стандартные клавиши навигации Андроид

Здравствуйте, пытаюсь заставить работать стандартную андроид-клавишу "назад", пытался разными способоами, они приведены в закомментированном коде. В том числе использовал https://evileg.com/ru/f…
M

Как включить OpenGL в Adnroid эмуляторе QtCreator

Здравствуйте, у меня работают виртуальные машины с Android, но только в дефолтной был включен OpenGL. Потом я удалил дефолтную, создал новые, а в них OpenGL отключен. Справа на втором скриншоте …

QScrollArea dynamically add QCheckBoxes

Всё правильно. Это просто спамер, который отправился в вечный бан.

qml зажатая кнопка мыши в одной MouseArea и сигналы мыши из другой MouseArea

добрый, вы не пробовали отслеживать область видимости мышки через: _mouseArea.containsMouse и когда мышка будет в другой зоне видимости обрабатывать ее состояния?
About
Services
© EVILEG 2015-2021
Recommend hosting TIMEWEB