mafulechka
mafulechka8 июля 2019 г. 5:21

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

Начиная с 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-разрядные двоичные файлы.

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

Vladimir Sergeevich
  • 8 июля 2019 г. 5:49

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

Evgenii Legotckoi
  • 8 июля 2019 г. 5:52

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

Andrei Yankovich
  • 20 июля 2019 г. 14:41

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

Evgenii Legotckoi
  • 21 июля 2019 г. 6:03

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

SS
  • 24 апреля 2021 г. 9:09
  • (ред.)

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

ЯО
  • 17 июня 2021 г. 15:37

Ку всем! Вопрос! Как с помощью JNI вызвать оплату на android устройстве? Попробовал Qt Purchasing вроде пошло... но android пишет что библиотека устарела. В qt6 пока поддержки purchasing нет. Работать начал с Qt 5.15

Добрый день! Честно, не подскажу. Вообще я мог бы вам посоветовать посмотреть в сторону Qt-based фреймворка Felgo. У них сейчас в бесплатном тарифе есть как поддержка покупок внутри приложения, так и поддержка рекламных блоков.

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Дмитрий

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:60баллов,
  • Очки рейтинга-1
Дмитрий

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

  • Результат:92баллов,
  • Очки рейтинга8
d
  • dsfs
  • 26 апреля 2024 г. 1:56

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:80баллов,
  • Очки рейтинга4
Последние комментарии
k
kmssr8 февраля 2024 г. 15:43
Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий Кононенко4 февраля 2024 г. 22:50
Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25 декабря 2023 г. 7:30
Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
J
JonnyJo25 декабря 2023 г. 5:38
Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
G
Gvozdik18 декабря 2023 г. 18:01
Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
Сейчас обсуждают на форуме
G
George136 мая 2024 г. 21:27
добавить qlineseries в функции в функции: "GPlotter::addSeries(QString title, QVector &arr)" я вызываю метод setChart(...), я в конструктор передал адрес на QChartView элемент
BlinCT
BlinCT5 мая 2024 г. 2:46
Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
PS
Peter Son3 мая 2024 г. 14:57
Best Indian Food Restaurant In Cincinnati OH Ready to embark on a gastronomic journey like no other? Join us at App india restaurant and discover why we're renowned as the Best Indian Food Restaurant In Cincinnati OH . Whether y…
Evgenii Legotckoi
Evgenii Legotckoi2 мая 2024 г. 11:07
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.
IscanderChe
IscanderChe30 апреля 2024 г. 1:22
Во Flask рендер шаблона не передаётся в браузер Доброе утро! Имеется вот такой шаблон: <!doctype html><html> <head> <title>{{ title }}</title> <link rel="stylesheet" href="{{ url_…

Следите за нами в социальных сетях