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

Chart, Qt, Plot, Blog

Начиная с 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 под мобильные системы. При этом вижу мнения, что под мобильные системы стоит писать вообще на нативных средствах. При этом у меня складывается мнение, что проекты есть и их не мало, просто народ об этом обычно не трубит на каждом повороте.

Comments

Only authorized users can post comments.
Please, Log in or Sign up
Looking for a Job?
25,000.00 руб. - 30,000.00 руб.
Разработчик Qt/C++
Barnaul, Altai Krai, Russia

For registered users on the site there is a minimum amount of advertising

DSh
Sept. 21, 2019, 2:55 p.m.
Dmitrij Shilkov

C++ - Test 001. The first program and data types

  • Result:46points,
  • Rating points-6
s
Sept. 18, 2019, 5:19 p.m.
sanyalitv

C++ - Test 002. Constants

  • Result:33points,
  • Rating points-10
s
Sept. 18, 2019, 5:12 p.m.
sanyalitv

C++ - Test 001. The first program and data types

  • Result:80points,
  • Rating points4
Last comments
M
Sept. 20, 2019, 11:25 a.m.
Mark

вызываю метод get у m_downloader в другом методе и приложение начинает вылетать. В чем ошибка?
M
Sept. 19, 2019, 5:45 a.m.
Mark

А вот как выгрузить файл на сервер по http протоколу? Допустим на regRu. И как получить путь файла, которой отображается в файловом менеджере regRu, чтобы загрузить его.
Sept. 17, 2019, 6:07 a.m.
Misha Lebedev

Кстати интересные темы нашёл тут https://emacsway.github.io/ru/django-framework/#django-models Может что полезного тоже Евгений найдёте
Sept. 17, 2019, 4:50 a.m.
Misha Lebedev

Доброго времени суток. Спасибо за хороший ответ, У меня ситуация така что в галлереи будет несколько миллионов фотографий с фильтрами и тегами , и я опасаюсь за производительност . Это ос…
Sept. 17, 2019, 3:23 a.m.
Evgenij Legotskoj

Добрый день. Да, я тоже читал ту статью в своё время и согласен с тем, что внешние ключи гораздо лучше, чем GenericForeignKey. Выборки в ряде случае работают быстрее. Но лично мне про…
Now discuss on the forum
M
Sept. 22, 2019, 1:54 a.m.
Mark

Пока реализовал так: на сервере лежат сами файлы и файл с именами всех файлов и их версий, который админ обновляет при довавлении файла. Клиентское по парсит этот файл и таким образом понимает к…
MS
Sept. 21, 2019, 12:51 p.m.
Mihail Sermjazhko

Так работает import QtQuick 2.7import QtQuick.Window 2.2import QtQuick.Controls 2.0Window { id: demo width: 800 height: 600 visible: true color: "#ff303030" prope…
MS
Sept. 21, 2019, 11:46 a.m.
Mihail Sermjazhko

Говорят через делегат должно работать: ListView{ id:l anchors.fill: parent model: ["data 1","data 2","data 3"] currentIndex : 2 delegate: Text { Rectangle{ …
C
Sept. 21, 2019, 9:08 a.m.
Cobra91151

Здравствуйте! Я хочу подключатся к сетям WiFi Enterprise через свою программу. Настроил Radius Server, поключение к сети через Windows работает. Но при подключении через программу пишет: о…
Sept. 20, 2019, 4:56 a.m.
Pavel K.

Привет , подскажите кто-нибудь , как сделать драг н дроп , не нарушая при этом логику работы зума? import QtQuick 2.6 import QtGraphicalEffects 1.0 Page { id:win property string fi…
EVILEG
About
Services
© EVILEG 2015-2019
Recommend hosting TIMEWEB