Что такое Гугл Плей сервисы — подробная информация
Человек, впервые покупающий себе телефон или планшет на базе операционной системы Android, обращает внимание на значок Play Маркет или Google Play и пытается разобраться, что это такое. Об этом более подробно в статье.
Что такое Google Play
В октябре 2008 года американская корпорация Google объявила об открытии интернет-магазина приложений Android Market. Он стал популярным среди пользователей системы Android по всему миру. Позднее разработчики его усовершенствовали и дали современное название Google Play Market. Главное его отличие – это связь с облачными технологиями и доступность не только пользователям ОС Android, но и владельцам персональных компьютеров и ноутбуков.
Логотип Google Play
Обратите внимание! Google Play Market позволяет владельцам устройств на базе Android платно или бесплатно скачивать и устанавливать необходимые программы, игры, музыку, фильмы, книги и прочее.
В Маркете представлены компьютерные разработки программистов со всего мира. Разработчик ПО покупает на Google Play учетную запись и продаёт свой продукт пользователям. 70% прибыли от продажи поступает разработчику, а остальные 30% идут на уплату налогов и обслуживание биллинга. Специалисты сервиса следят за «чистотой» контента, его обновлениями и безопасностью, отсутствием вирусов – вот что такое Гугл Плей. В повседневном общении его ещё называют «Плей Маркет».
Для каких устройств разработан Магазин Google
Он рассчитан для устройств на базе Андроид (планшеты, мобильные телефоны, смартбуки, телевизоры, умные часы), а также для персональных компьютеров и ноутбуков. Просмотр контента возможен на любом из устройств в режиме онлайн.
Магазин Гугл синхронизирует используемый контент на различных устройствах, если это возможно. Поэтому купленный через смартфон фильм можно посмотреть на большом экране телевизора с функцией смарт-ТВ. При покупке нового устройства, например, смартфона, можно добавить его в Google Play. Достаточно лишь зайти в свою учётную запись с нового гаджета. Play Market запоминает все устройства, через которые заходили в аккаунт.
Внимание! Неудобство Google Play Market для пользователя состоит в том, что в нём сохраняются все ранее использованные устройства. Если они не актуальны, то их приходится удалять.
Товары на Google Play для Android
Сказать, что Гугл Плей это магазин – не совсем правильно. Ведь здесь представлена продукция, которую можно скачать совершенно бесплатно. Есть также условно бесплатный контент, расширенные или дополнительные функции которого можно приобрести за деньги.

Интерфейс Google Play
Интерфейс прост в использовании и разбит на 5 категорий:
- Развлечения, игры. Экшены, стратегии, головоломки, казино, гонки и многое другое представлены на сервисе. Есть платный и бесплатный контент.
- Приложения. Справочники, навигаторы, карты, проигрыватели, спортивные тренировки, диеты, браузеры – это очень малый список того, что предлагается требовательному покупателю.
- Фильмы. Представлены комедиями, драмами, детективами, триллерами, ток-шоу, сериалами, ТВ – все, что касается шоу-бизнеса можно найти здесь. Фильмы можно смотреть онлайн на сайте или в приложении. Есть возможность взять за определённую плату фильм напрокат.
- Музыка. В разделе представлены миллионы платных и бесплатных мелодий, песен. Они рассортированы по жанрам, исполнителям. Возможно скачивание или прослушивание онлайн.
- Книги. Библиотека электронных книг на Гугл Плей насчитывает миллионы платных и бесплатных изданий, которые отсортированы по жанрам, популярности.
В каждой из категорий есть рекомендуемый контент, лучшие и платные версии программного обеспечения. Имеются также новики и обновления, самые популярные фильмы, игры, книги, прочее. Для удобного поиска контент можно отсортировать по жанрам. Найти нужное программное обеспечение можно через строку поиска, если известны первые буквы его названия.
Внимание! Список разрешений для установки того или иного контента должен быть обоснован его функциями. Необоснованный доступ к разрешениям может быть связан с рассылкой контекстной рекламы, отслеживающими файлами.
Не сервисе представлен как полезный, так и совершенно ненужный контент. Если к нему оставить комментарии, то будущий пользователь сможет судить о пользе данного продукта для него лично и принимать решение об установке программного обеспечения.

Полезные функции на Google Play:
- Отключение автоматического обновления программного обеспечения для маломощных гаджетов.
- Разрешение или запрет ребенку на доступ к определённому контенту.
- Функция «Список желаний», позволяющая вернуться к интересующему контенту в нужное время.
- Изучение предпочтений своих друзей.
- Установка запрета на обновление программ.
Оплата товаров на Google Play
Большинство пользователей скачивают бесплатный контент. Но за пользование определённой информацией необходимо расплачиваться. Для этого предусмотрены следующие способы оплаты:
- банковские карты всемирных платёжных систем (Visa, MasterCard, American Express, прочие);
- списание средств со счета мобильного телефона;
- международная система интернет-платежей PayPal;
- для граждан США и Великобритании – Google кошелёк.
Обратите внимание! Способ оплаты зависит от страны и региона проживания пользователя Google Play.
Пополнение и безопасность контента
Google Play постоянно следит за пополнением контента, его качеством и вредоносностью. К разработчикам программного обеспечения компания выдвигает серьёзные требования. Она блокирует тех, чьи аккаунты не соответствуют определённым параметрам: количество символов в названии, размеры иконок, скриншотов, длительность рекламы. Нельзя нарушать авторские права, использовать чёрное SEO, накрутку, чужие товарные знаки без разрешения их владельца и прочее.
Несколько лет назад компания разработала Google Play Protect (Защита), которая сканирует гаджет на наличие вирусов. Программа работает как встроенный антивирус для Android. Защита сканирует до 50 миллионов программных разработок в день. Проверяет работу операционной системы и программного обеспечения, установленного пользователем не только из Google Play, но и с других источников.

При обнаружении подозрительной программы Google Play Защита предлагает её отключить или предупреждает пользователя об имеющейся проблеме. Также на подозрительных сайтах Защита включает функцию безопасного просмотра. Таким образом гаджет защищён в любое время суток от проникновения вирусов.
Важно! Система безопасности установлена по умолчанию и поддерживается на устройствах, работающих с 11 версией Google Play и выше.
Play Market пользуется популярностью как безопасный проект для поиска различного контента. Зачем использовать другие источники, если здесь имеется отличный выбор программных продуктов, которые просто устанавливаются, постоянно обновляются и проверяются на наличие вирусов.
Google Play удалил наши аккаунты без предупреждения и лишил семью заработка
Я около семи лет занимаюсь разработкой приложений на Android. Начал с того, что делал приложения в свободное время, чтобы ближе познакомиться с этим замечательным миром, а потом присоединился к компании, которая учит людей создавать собственные продукты и выводить их на рынок.
На мой взгляд, Google Play – лучшая платформа для распространения приложений. Но вместе с тем, ее руководство плохо справляется с очень важной проблемой – пользовательской поддержкой для разработчиков.
Существуют и другие сервисы Google – например, Admob или Google Ads. И когда у меня возникают трудности со, скажем, Google Ads, я могу быстро связаться с администрацией и получить помощь. Чтобы улучшить что-то в рекламной кампании, не нужно даже к ним обращаться, они сами присылают письма, где напоминают, что сотрудники поддержки к моим услугам. Был случай, когда мне даже довелось пообщаться с очень приятной женщиной по Google Meet.
Если же с проблемами сталкивается разработчик с аккаунтом на Google Play, всё происходит совсем иначе. Приходится довольствоваться текстовым полем, а в ответ неизменно получаешь письма, составленные по шаблону – обсудить свою проблему с человеком практически нереально.
Можно, конечно, предположить, что с приложениями просто не возникает особых сложностей, разве что в очень редких случаях. Но на самом деле, проблемы появляются намного чаще, чем мы склонны думать. Обычно в таких случаях команда техподдержки присылает письмо, где сообщается, что именно не так с приложением, разработчик исправляет и высылает обновленную версию, которая проходит модерацию, чтобы сотрудники убедились, что всё в порядке. Но в некоторых случаях приложение удаляют с маркета. Тогда положение для разработчика становится уже серьезнее, он лишается прибыли от рекламы, пока не опубликует продукт заново.
Но и это еще не предел, бывает и хуже. Например, вам – как это случилось со мной – может прийти письмо с текстом «Ваш аккаунт разработчика на Google Play удален». Как говорится, лучше один раз увидеть, чем сто раз услышать, так что вот скриншот письма:

Перевод письма
Это оповещение о том, что Ваш аккаунт на Google Play был удален.
Причина удаления: предшествующие нарушения правил программы для разработчиков и соглашения по распространению для разработчиков на данном аккаунте или на аккаунтах, связанных с ним, которые освещались в предшествующих письмах, отправлявшихся на зарегистрированный для аккаунта почтовый адрес или адреса.
Согласно изложенному в политике обеспечения соблюдения правил, многократные или серьезные нарушения правил могут привести к удалению аккаунта разработчика на Google Play, а также всех связанных с ним аккаунтов.
Вы можете посетить центр правил для разработчиков, чтобы лучше понять, как мы внедряем правила программы разработчиков. Если вы изучили правила и полагаете, что удаление произошло по ошибке, пожалуйста, свяжитесь с нашей командой техподдержки по вопросам, связанным с правилами.
Пожалуйста, не пытайтесь создавать новые аккаунты. Мы не будем восстанавливать ваш аккаунт на текущем этапе.
Да, в декабре 2021 года мой личный аккаунт был удален. В письме говорилось: если я полагаю, что произошла ошибка, то могу связаться с командой поддержки, занимающейся правилами. Связь с командой, как выяснилось, сводится к заполнению текстового поля с ограничением по символам под заголовком «Запрос на восстановление». Я заполнил поле текстом с просьбой дать более подробные объяснения. Это было двадцать первого декабря и, несмотря на их обещание ответить в течение семи дней, на момент написания статьи (тридцать первое января) никакой реакции я не увидел.
Но история на этом не кончается. Моя жена, как и я, занимается разработкой, и у нее есть собственный аккаунт разработчика. Спустя четыре дня после того, как я получил оповещение, пришел рождественский подарочек и для нее. Двадцать пятого января жена обнаружила в ящике роковое письмо. К моему удивлению, ее оповещение об удалении аккаунта было как под копирку списано с моего.

Разумеется, жена тоже отправила им запрос, и спустя месяц и еще четыре дня, двадцать восьмого января (вы еще помните про обещание ответить в течение семи дней?), ей пришло два ответных письма. В первом ей написали, что рассмотрят ее запрос, а во втором, которое пришло несколькими часами позже, сообщалось о его отклонении.

Перевод второго письма
Спасибо, что обратились к команде Google Play. Обработав Ваш запрос, мы не можем восстановить Ваш аккаунт.
Ваш аккаунт разработчика на Google Play был удален в связи с многократными нарушениями правил программы для разработчиков. Мы проверили и подтвердили эти сведения.
Удаление аккаунта разработчика на Google Play связано с личностью разработчика и может затрагивать другие зарегистрированные аккаунты и сервисы Google. Не пытайтесь создавать новые аккаунты. Все новые аккаунты будут удаляться без возмещения взноса. Рекомендуем в будущем пользоваться другими способами распространения приложений.
Я погуглил и выяснил, что то же самое произошло со многими другими разработчиками, и все они получали письма с точь-в-точь таким же шаблонным текстом. Мы пытались попросить о помощи через другие каналы, например GooglePlayDev на Твиттере, но получали только ссылку на всё то же текстовое поле.
Глубоко разочарованные, мы спрашивали себя: почему в Google такое допускают? Разве можно принимать такие радикальные решения, не обсудив ситуацию предварительно с разработчиком? Кто такой sahilbansal, другой получатель одного из писем, и кто такая Миа, чьим именем подписаны эти письма? Они реальные люди? Они боты? Это они принимают подобные решения? Есть ли у них хоть какое-то представление о том, что это значит – написать и опубликовать приложение?
- Мы потеряли всё, чего сумели добиться на маркете за эти шесть лет – репутацию, скачивания, позиции в рейтингах.
- Мы потеряли деньги, которые получали от рекламы в приложениях – единственный источник дохода.
- Наши пользователи потеряли возможность обновлять приложение в будущем; они так никогда и не узнают, что вообще произошло.
- Возможно, мы потеряли и работу, так как в письмах нас предупреждают: «Не пытайтесь создавать новые аккаунты. Все новые аккаунты будут удаляться без возмещения взноса. Рекомендуем в будущем пользоваться другими способами распространения приложений».
Кто решает, что аккаунт подлежит удалению? Их массово удаляют только под Рождество (я заметил, что многие разработчики получили оповещение именно в этот период)? И, раз уж отправлять запросы на восстановление, похоже, бессмысленно… что, неужели ошибок совсем не бывает?
Всё, что я могу теперь сделать – предупредить других разработчиков на Android о том, что Google Play может удалить их аккаунт в любой момент, не предупредив заранее и не предоставив ясных объяснений. Опыт множества других людей, как я сумел убедиться, это подтверждает.
Думаю, что для разрешения сложностей, которые возникают в ходе работы с маркетом, разработчики нуждаются в большей прозрачности со стороны администрации и в адекватном канале связи, где с ними будут общаться люди, и имеют полное право на то и другое. Этот текст я написал, чтобы обозначить проблему и привлечь к ней внимание людей, способных ее решить. Если вы работаете на Google, пожалуйста, распространите эту информацию по внутренним каналам, чтобы она дошла до тех, кто может что-то сделать. С точки зрения разработчика представляется, что у Google Play не все благополучно, и исправить дело может только сам Google.
- google play
- распространение приложений
- Блог компании Productivity Inside
- Разработка мобильных приложений
Автоматизация публикации Android приложений в Google Play и Huawei AppGallery — инструкция от А до Я
В данной руководстве мы расскажем как автоматизировать процесс релизов Android-приложений в Google Play и Huawei AppStore (пока что без RuStore). Вы навсегда забудете как это делать вручную и сможете потратить время на что-нибудь более полезное, экономя сотни часов в год.
Структура Gradle-проекта
Для начала наведем порядок в самом Android проекте. В build.gradle проекта мы используем весьма стандартную матрицу из flavors x buildTypes:
android < // flavorDimensions 'default' productFlavors < google < dimension "default" versionName = android.defaultConfig.versionName + '-Google' >huawei < dimension "default" versionName = android.defaultConfig.versionName + '-Huawei' >> // buildTypes < debug < applicationIdSuffix '.debug' versionNameSuffix '-debug' signingConfig signingConfigs.debug // > beta < applicationIdSuffix '.beta' versionNameSuffix '-beta' signingConfig signingConfigs.release // > release < signingConfig signingConfigs.release minifyEnabled true shrinkResources true // > >
Такая матрица дает комбинацию из GoogleDebug, GoogleBeta, GoogleRelease, HuaweiDebug, и т.д. В целом кастомизация по stores не обязательна, но полезна для управления специальными возможностями, таким как in-app. Настраивайте матрицу исходя из ваших потребностей.
Полезные ссылки:
- Полный пример build.gradle
- Настройка build variants
Android App Bundles (AAB) vs Android Packages (APK)
С самого момента зарождения Android все приложения распространялись в виде так называемых .apk файлов, которые по сути представляют из себя ZIP архивы с скомпилированным кодом и ресурсами под различные архитектуры, локализации и API-levels. Вы компилируете свой код и ресурсы, собираете архив, подписываете его своей сигнатурой. А дальше можете распространять хоть через Google Play, хоть через RuStore, хоть просто на сайте выкладывать.
Ситуация поменялась в 2021 году. Google решил, что неплохо бы отправлять клиентами Google Play только те ресурсы, которые соответствуют API-level и архитектуре приложения. И действительно, зачем отправлять библиотеки armeabi-v7a для устройств arm64-v8a ? Зачем устройствам с API level = 31 нужны compatibility файлы для API level = 21? Зачем локализации на 30 языках, если в системе всего один? В целом идея неплохая, но есть нюансы.
Чтобы всё это работало, Google придумал новый промежуточный формат Android App Bundles ( .aab ), который аналогично .apk вы собираете и подписываете своим ключом. Однако, .aab файлы не могут быть непосредственно установлены на устройства. Google Play для каждого конкретного устройства создает из .aab файла .apk файл с необходимым ресурсами и отправляет его на девайс. Вместо, условно, 50 мегабайт .apk файла вы качаете условные 20 мегабайт таргетированного .apk файла специально под ваше устройство. Profit!
Важно! При использовании Android App Bundles, финальная сборка и подпись APK будет находится на стороне Google (и, теперь и Huawei). Каждый app store использует свои ключи для подписи. Google — свои, Huawei — свои. Android работает таким образом, что установка новой версии приложения, подписанного другим ключом, невозможна без удаления предыдущей версии приложения вмести со всеми данными. Если ваши пользователи установят bundle приложения из Google Play, то они не смогут обновить его через Huawei.
Классический подход с APK не имеет данной проблемы. Однако, начиная с августа 2021 у вас больше нет выбора и все новые приложения надо загружать только в формате .aab , отдавая подпись на сторону Google Play. Теперь также можно забить на все эти split APK, а также APK expansion files и прочие костыли. Пользователи не будут качать ненужные мегабайты через скоростной EDGE^W5G Интернет. Больше свободного места на устройстве! И, в конце концов, практически полное отсутствие возможности перейти с Google Play на альтернативные сторы для таких приложений. Win-win-win.
Полезные ссылки:
Генерация номеров версий
Первая и одна из самых важных задач, которую необходимо решить для реализации continuous deployment хоть для онлайн сервиса, хоть для package software — это обеспечения детерминированного алгоритма генерации версий. Требование простое: для каждого git commit в релизной ветке должен существовать уникальный номер версии. Перестаньте уже делать «bump versions» (1.0.2 -> 1.0.3 -> 1.0.4 и т.д.) каждый раз вручную. Нужна система, где номер версии (хотя бы последняя его .patch-level часть) будет генерироваться автоматически.
Есть два неплохих подхода, которые позволяют закрыть данный вопрос раз и навсегда полностью.
Подход 1. Использование git describe
Особенность Android (и Google Play и AppGallery соответственно) в том, что downgrade версий приложений невозможен. Код номера версии всегда должен возрастать. Но ведь точно также и всегда растёт git история релизной ветки, если же, конечно, вы не хулиганите с rewrite истории и force-pushes.
Крайне логичным является использовать число git commit в ветке для нумерации. Можно, например, сделать так, что вы периодически ставите annotated tag вида v$major.$minor (например, v1.0, v2.0), тогда как третий компонент (patch) генерируется как число коммитов от предыдущего тега.
Для реализации удобнее всего использовать команду git describe —long :
> git tag -a v1.0 -m "New minor release" > git describe --long v1.0-0-gbc2d1a8 > touch test2.txt > git add . > git commit -m "Add some changes" > git describe --long v1.0-1-gaa7263d . > touch test3.txt > git add . > git commit -m "Add some more changes" > git describe --long v1.0-2-g6a48c84
Данный подход дает вполне себе semver v1.0.0, v1.0.1, v1.0.2 и т.д, где последняя цифра версии (patch) назначается автоматически, а major.minor контролируется вами. Для каждого git commit у вас будет уникальный номер версии. Найти git коммит по тегу и числу коммитов от него также не представляется сложным. Просто и практично.
Подход 2. Использование даты
Более радикальным подходом является использование даты git коммита в качестве версии. Например, 2023.04.23-2. А как же semver, спросите вы? Ну а вот а зачем он вам в мире Android приложений, если у вас всё равно идет непрерывное обновление приложений из Google Play и нет никакого способа откатиться назад или обеспечить доступность нескольких версий? Можете жарко поспорить об этом в комментариях.
В git есть две даты:
- Author Date — то, что указал автор и то, что вы можете видеть в git log и git show. Может быть насколько угодно в прошлом, особенно если вы мержите какой-нибудь PR годовалой давности.
- Commit Date — дата, когда коммит был добавлен в бранч. Обычно соответствует реальному времени, когда merge произошел в бранч. Время всегда идет вперед и Commit Date не исключение, если же, конечно, вы не будете намеренно экспериментировать с показанием ваших часов.
Мы будем использовать Commit Date, которую можно получить через %cd форматинг в git log:
TZ=UTC0 git log --max-count=128 --pretty=format:%cd --date=iso-local
2023-04-23 10:37:01 +0000
2023-04-23 09:02:18 +0000
2023-04-19 14:43:21 +0000
2023-04-19 14:43:21 +0000
2023-04-19 01:39:03 +0000
Одной даты недостаточно, если же, конечно, вы не хотите себя ограничить одним коммитом в день. В качестве дополнительной цифры будем считать число коммитов с начала дня. Получим что-то вроде 2023.04.23-1, 2023.04.23-3, 2023.04.23-4 и т.д. Также можно взять в качестве последней цифры час x 60 + минуты или даже просто час (up to you). Но нам вариант с числом коммитов с начала дня показался вполне рабочим.
Не забывайте, в конечном итоге всё это надо запихать в т.н. versionCode , который ограничен пространством 0 — 2_100_000_000 (чуть меньше 31 бита). Version Code — это именно то, с чем работает Android и stores для версионирования, тогда как Version Name это просто строка с текстом где может быть всё, что вы пожелаете показать пользователю.
Для генерации версии будем использовать следующий код в Gradle (смотрите внимательно комментарии):
def getVersion() < def time = Integer.parseInt(run(['git', 'log', '-1', '--format=%ct']).trim()) def cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"), Locale.ENGLISH) cal.setTimeInMillis((long) time * 1000) def year = cal.get(Calendar.YEAR) def month = cal.get(Calendar.MONTH) + 1 def day = cal.get(Calendar.DAY_OF_MONTH) def date_of_last_commit = String.format("%04d-%02d-%02d", year, month, day) def build = Integer.parseInt(run(['git', 'rev-list', '--count', '--after="' + date_of_last_commit + 'T00:00:00Z"', 'HEAD']).trim()) // Use the last git commit date to generate the version code: // RR_yy_MM_dd_CC // - RR - reserved to identify special markets, max value is 21. // - yy - year // - MM - month // - dd - day // - CC - the number of commits from the current day // 21_00_00_00_00 is the the greatest value Google Play allows for versionCode. // See https://developer.android.com/studio/publish/versioning for details. def versionCode = (year - 2000) * 1_00_00_00 + month * 1_00_00 + day * 1_00 + build // Use the current date to generate the version name: // 2021.04.11-12-Google (-Google added by flavor) def versionName = String.format("%04d.%02d.%02d-%d", year, month, day, build) return new Tuple2(versionCode, versionName) >
Дальше устанавливаете versionCode и versionName из результата вызова getVersion() :
android < // defaultConfig < def ver = getVersion() versionCode = ver.V1 versionName = ver.V2 println('Version: ' + versionName) println('VersionCode: ' + versionCode) // > // >
Можете убедиться, что каждый запуск gradle будет генерировать уникальный номер версии для каждого git коммита. Данный подход закрывает вопрос версионирования навсегда и вы не думаете про это.
Получение ключей доступа от Google Play
Чтобы загружать что-либо в Google Play автоматизированно, надо для начала получить ключи доступа в API. Кажется, что Google Play весьма плотно интегрировался с IAM Google Cloud и вам нужно создать новый Service Account с необходимыми правами и получить .json файл с credentials. Но давайте по порядку.
Шаг 1. Связь Google Play Developer account Google Cloud project
Вроде как новые Google Play Developer Accounts должны связываться с Google Cloud как-то полумагически, особенно если вдруг вы использовали Firebase.
Идете в Google Play Console -> Setup -> API Access. Если Linked Project уже есть, то у вас всё хорошо и можно переходить к следующему шагу. Если нет, то проверьте в Google Cloud Console какие у вас уже есть проекты и, при необходимости, создайте новый. Firebase неявно создает Google Cloud проект и вы можете использовать его же.

Шаг 2. Создание Google Service Account
Service Account это такая сущность для «роботов», которая имеет credentials и на которую можно назначать роли и права доступа. Рекомендуется использовать robot Service Account, а не свой human Google Account.
Кликайте на «View in Google Cloud Platform» или же просто переходите в Google Cloud Console и выбирайте нужный проект в списке. Переходите в раздел «Service Accounts». Кликайте «Create Service Account».

Введите имя для Service Account, например, Google Play Automatic Upload. Введите ID (email) для Service Account, например google-play-uploaded . Жмите «CREATE AND CONTINUE».

Добавьте роль Viewer, без этого Service Account не добавляется в Google Play Console. Жмите «DONE», пропуская третий шаг ( Grant users access to this service account (optional)).

Шаг 3. Получение ключа доступа
Кликайте по только что созданному Service Account. Переходите на вкладку «Keys». Нажимайте кнопку «ADD KEY» -> «Create new» -> JSON.

После клика на «CREATE» будет скачан JSON файл с приватным ключом Service Account:
< "type": "service_account", "project_id": "", "private_key_id": "", "private_key": "-----BEGIN PRIVATE KEY-----\n\n-----END PRIVATE KEY-----\n", "client_email": "google-play-uploaded@.iam.gserviceaccount.com", "client_id": "", "auth_uri": "https://accounts.google.com/o/oauth2/auth", "token_uri": "https://oauth2.googleapis.com/token", "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/google-play%40.iam.gserviceaccount.com" >
Храните этот ключ в надежном секретном месте!
Шаг 4. Добавление Google Cloud Service Account в Google Play Console
Последний шаг — дать права на загрузку приложений для нового Service Account. Кажется, эта часть пока еще не интегрирована до конца с Google Cloud и права необходимо выдавать в Google Play Console.
Переходите в Google Play Console, раздел «Users and permissions». Жмете на меню с трёмя точками, дальше «Invite new users».


Необходимо дать следущие права
- View app information and download bulk reports (read only)
View all app information, including any associated Play Games services projects – but not financial data. Users with this permission can also download bulk reports, and will be able to view any new apps that you add to Play Console in the future. - Create, edit and delete draft apps
This permission does not allow users to publish apps on Google Play - Release to production, exclude devices and use Play app signing
Create, edit and roll out releases to production, unpublish and republish apps, exclude devices in the device catalogue, and use app signing by Google Play to sign APKs. Users with this permission can publish apps to users on Google Play. - Release apps to testing tracks
Upload draft apps; create, edit and rollout releases to testing tracks; unpublish and republish apps that have already been published to a testing track; upload and modify .obb files; edit release notes for apps which are not active in production; and upload app bundles for internal sharing. This permission does not allow users to publish apps to production on Google Play.
Готово. В результате выполнения инструкций в данном разделе у вас должен появиться .json файл с credentials доступа к Google Play, позволяющие загружать приложения.
Полезные ссылки:
Загрузка сборок в Google Play
Загрузку в Google Play будем осуществлять через Triple T Gradle Play Publisher плагин для Gradle. Альтернативой является всем известный Fastlane, который мы тоже используем, но только для iOS. Triple-T Play Publisher субъективно кажется более удобным как минимум за счет за счет интеграции с Gradle и отсутствия необходимости возиться с набором портянок на Ruby.
Добавление библиотеки
buildscript < repositories < google() mavenCentral() >// dependencies < classpath 'com.android.tools.build:gradle:7.4.2' // classpath("com.github.triplet.gradle:play-publisher:3.8.1") > >
Версия в статье быстро устареет. Пожалуйста, всегда используйте последнюю доступную версию.
Добавление вызова плагина
Добавьте вызов плагина com.github.triplet.play в build.gradle сразу после секции `android <>`:
android < // > apply plugin: 'com.github.triplet.play'
Настройка плагина
Плагин настраивается через глобальную секцию конфигурации play <> , а также дополнительно в каждом flavor:
android < defaultConfig < // > // defaultConfig // playConfigs < googleRelease < enabled.set(true) >> // playConfigs > // android play < enabled.set(false) track.set("production") userFraction.set(Double.valueOf(0.10)) // 10% defaultToAppBundles.set(true) releaseStatus.set(ReleaseStatus.DRAFT) serviceAccountCredentials.set(file("google-play.json")) >
- track — говорим в какой track заливать. Конечно же, сразу в продакшен!
- userFraction — включаем stage rollout на 10% чтобы не быть совсем сумашедшими.
- defaultToAppBundles — включаем Android App Bundles (AAB) вместо Android Packages (APK).
- releaseStatus.set(ReleaseStatus.DRAFT) — создаем черновик, но пока сразу не отправляем на ревью. После тестирования можно будет поменять на ReleaseStatus.IN_PROGRESS .
А вы сейчас делаете stage rollout? Расскажите, пожалуйста, об этом в комментариях.
Тестирование загрузки в Google Play
Запускаем таск bundleGoogleRelease для сборки релизной версии aab приложения для последующей загрузки:
gradle bundleGoogleRelease
Проверяем, что у нас реально что-то собралось:
ls build/outputs/bundle/googleRelease OrganicMaps-23043001-google-release.aab
Запускаем таску publishGoogleReleaseBundle для загрузки cобравшегося aab в Google Play:
gradle publishGoogleReleaseBundle
> Task :publishGoogleReleaseBundle Starting App Bundle upload: OrganicMaps-23043001-google-release.aab Uploading App Bundle: 10% complete Uploading App Bundle: 19% complete Uploading App Bundle: 29% complete Uploading App Bundle: 39% complete Uploading App Bundle: 49% complete Uploading App Bundle: 58% complete Uploading App Bundle: 68% complete Uploading App Bundle: 78% complete Uploading App Bundle: 88% complete Uploading App Bundle: 97% complete App Bundle upload complete Updating [completed, inProgress] release (app.organicmaps:[23030505, 23040207]) in track 'production'
В целом часть с заливкой готова и вы сможете увидеть сможете увидеть черновик релиза Google Play Console и отправить его на review.

Если всё соответствует ожиданиями, то дальше можно поменять releaseStatus.set(ReleaseStatus.DRAFT) на releaseStatus.set(ReleaseStatus.IN_PROGRESS) чтобы лишний раз не бегать в Google Play Console для нажатия кнопки. Кнопка должна быть где-то в вашем CI/CD, чтобы вы там не использовали.
Полезные ссылки:
- Полный пример build.gradle
- Документация по Triple-T Gradle Play Publisher
Управление метаданными Google Play
Следующий шаг — это научиться также обновлять метаданные (описание приложения, скриншоты и т.п.) в Google Play. После добавления данной автоматизации станет возможным обновлять метаданные в git репозитории вместо Google Play. Работу по обновлению в Google Play сделает плагин.
Скачивание метаданных из Google Play
Для начала необходимо скачать уже имеющиеся в Google Play метаданные в репозиторий. Запускаем задачу `bootstrapGoogleReleaseListing`:
gradlew bootstrapGoogleReleaseListing
Пошуршав диском, gradle выкачает все текущие метаданные в репозиторий.
> Configure project : Building with Google Mobile Services Building without Google Firebase Services Version: 2023.04.23-2 VersionCode: 23042302 Building for [armeabi-v7a, arm64-v8a, x86_64] archs. Create separate apks: false > Task :bootstrapGoogleReleaseListing Downloading app details Downloading listings Downloading in-app products Downloading release notes Downloading en-US listing Downloading tr-TR listing Downloading en-US listing graphics for type 'featureGraphic' Downloading en-US listing graphics for type 'icon' Downloading en-US listing graphics for type 'phoneScreenshots' Downloading en-US listing graphics for type 'tenInchScreenshots' Downloading en-US listing graphics for type 'sevenInchScreenshots' Downloading tr-TR listing graphics for type 'sevenInchScreenshots' Downloading tr-TR listing graphics for type 'phoneScreenshots'
Новые файлы появятся в src//play :
contact-email.txt contact-website.txt default-language.txt listings/ en-US full-description.txt graphics/ icon/ 1.png phone-screenshots/ 1.jpg 2.jpg 3.jpg 4.jpg release-notes.txt short-description.txt title.txt video-url.txt release-notes/ en-US/ default.txt
Редактирование данных
После скачивания данных из Google Play добавьте их в git и далее используйте git как первоисточник, избегая ручных действий в Google Play Console. Это даёт огромное число плюсов, начиная от понятного версионирования, до возможности добавления инструментов для переводов. Например, мы используем Weblate для перевода описаний Google Play на другие языки. Данные Google Play также будут переиспользованы далее для Huawei AppGallery.
Загрузка метаданных в Google Play
Для загрузки обновленных метаданных обратно в Google Play существует задача publishGoogleReleaseListing (где GoogleRelease - ваш flavor):
./gradlew publishGoogleReleaseListing > Configure project : Building with Google Mobile Services Building without Google Firebase Services Version: 2023.05.01-1 VersionCode: 23050101 Building for [armeabi-v7a, arm64-v8a, x86_64] archs. Create separate apks: false > Task :publishGoogleReleaseListing Uploading app details Uploading ar listing Uploading zh-TW listing
Важно. Обновление метаданных в Google Play не привязано к выпуску релизов. Вы можете обновлять описания и скриншоты приложений в любой момент, вне зависимости от текущего состояния review сборки приложения. Review изменения метаданных происходит отдельно!

Мы используем данный подход чтобы обновлять данные на всех 59 языках, поддерживаемых Google Play Console на момент написания статьи.
Полезные ссылки:
- Полный пример build.gradle
- Документация по Triple-T Gradle Play Publisher
Получение ключей доступа от Huawei AppGallery
Чтобы загружать что-то в Huawei AppGallery нам необходимо сначала получить ключи доступа к Huawei AppGallery Connect. Интерфейс Huawei AppGallery Connect, скажем так, местами весьма запутан. Но надо разобраться один раз чтобы в дальнейшем туда вообще не заходить.
Заходите в AppGallery Connect и нажимайте Users and permissions. Переходите к API key > Connect API и нажимайте Create:

Можете ввести любое название. Укажите следующие роли:

- Development
- Operations
- Customer service (будет выбрано автоматически)
После этого вы сможете скачать .json ключ доступа к Huawei AppGallery Connect:
< "type":"team_client_id", "developer_id":"", "client_id":"", "client_secret":"", "configuration_version":"3.0" >
Готово. Данный файл понадобится на следущем этапе для автоматизации загрузки.
Полезные ссылки:
- AppGallery Connect -> Getting Started -> Creating an API client
- Документация по Huawei App Gallery Publishing
Загрузка сборок и release notes в Huawei AppGallery
Для автоматизации загрузки в Huawei AppGallery будем использовать Gradle plugin ru.cian:huawei-publish-gradle-plugin, разрабатываемый Aleksandr Mirko из Омска. Скажем спасибо Александру за столь прекрасный безальтернативный плагин для загрузки в Huawei AppGallery без которого пришлось бы страдать.
Добавление плагина в Gradle
buildscript < repositories < google() mavenCentral() >// dependencies < classpath 'com.android.tools.build:gradle:7.4.2' // classpath("ru.cian:huawei-publish-gradle-plugin:1.3.6") > >
Включение плагина
Включаем плагин ru.cian.huawei-publish-gradle-plugin в build.gradle после секции android <> :
apply plugin: 'ru.cian.huawei-publish-gradle-plugin'
Настройка плагина
Плагин имеет отдельную секцию для конфигурции huaweiPublish <> . Добавляем новую секцию с настройками в конец build.gradle :
huaweiPublish < instances < huaweiRelease < credentialsPath = "$rootDir/huawei-appgallery.json" buildFormat = 'aab' deployType = 'draft' // confirm manually releaseNotes = [] def localeOverride = [ 'am' : 'am-ET', 'gu': 'gu_IN', 'iw-IL': 'he_IL', 'kn-IN': 'kn_IN', 'ml-IN': 'ml_IN', 'mn-MN': 'mn_MN', 'mr-IN': 'mr_IN', 'ta-IN': 'ta_IN', 'te-IN': 'te_IN', ] def files = fileTree(dir: "$projectDir/src/google/play/listings", include: '**/release-notes.txt') files.each < File file ->def path = file.getPath() def locale = file.parentFile.getName() locale = localeOverride.get(locale, locale) releaseNotes.add(new ru.cian.huawei.publish.ReleaseNote(locale, path)) > > > >
- credentialsPath - задает путь к файлу с ключами от AppGallery Connect
- deployType = 'draft' - говорим плагину создавать черновик релиза, но не отправлять сразу на review. После тестирования и обкатки можно будет поменять на publish .
- buildFormat = 'aab' - также как и в Google Play используем для Huawei AppGallery Android App Bundles (AAB) вместо Android Packages (APK).
- localeOverride - здесь и ниже делается делается магия для переиспользования release notes из плагина для Google Play. Есть небольшие неудобства из-за того, что небольшая группа кодов локалей для Huawei AppGallery почему-то пишется с _ (underscore) вместо - (dash) как Google Play. Остальные совпадают.
Подробнее по параметрам настройки можно посмотреть в README плагина на GitHub.
Тестирование загрузки
Запускаем таск bundleHuaweiRelease для сборки релизной версии aab приложения для последующей загрузки:
gradle bundleHuaweiRelease
Проверяем, что у нас реально что-то собралось:
ls build/outputs/bundle/huaweiRelease OrganicMaps-23043001-huawei-release.aab
Запускаем таску publishHuaweiAppGalleryHuaweiRelease для загрузки cобравшегося aab в Huawei AppGalery Connect:
gradle publishHuaweiAppGalleryHuaweiRelease
Внимание: задача publish почему-то не имеет явной зависимости на bundle, поэтому надо не забывать запускать bundle задачу каждый раз, можно обе команды сразу в одном запуске gradle:
gradle bundleHuaweiRelease publishHuaweiAppGalleryHuaweiRelease
Смотрим внимательно, что пишет gradle в процессе загрузки:
> Task :publishHuaweiAppGalleryHuaweiRelease Huawei AppGallery Publishing API: Prepare input config Huawei AppGallery Publishing API: Found build file: `OrganicMaps-23043001-huawei-release.aab` Huawei AppGallery Publishing API: Get Access Token Huawei AppGallery Publishing API: Get App ID Huawei AppGallery Publishing API: Get Upload Url Huawei AppGallery Publishing API: Upload build file '/home/runner/work/organicmaps/organicmaps/android/build/outputs/bundle/huaweiRelease/OrganicMaps-23040207-huawei-release.aab' Huawei AppGallery Publishing API: Upload release notes: 1/59, lang=et Huawei AppGallery Publishing API: Upload release notes: 2/59, lang=kk [REDACTED] Huawei AppGallery Publishing API: Upload release notes: 59/59, lang=ar Huawei AppGallery Publishing API: Update App File Info Huawei AppGallery Publishing API: Upload build file draft without submit on users - Successfully Done! BUILD SUCCESSFUL in 1m 36s 1 actionable task: 1 executed
В случае каких-либо проблем с credentials в файле huawei-appgallery.json плагин зафейлится еще на "Get Access Token".

Также возможны ситуации, когда число символов в тексте release notes превращает лимиты, что приводит к созданию draft без полного обновления release notes. В таком случае лучше исправить проблему, удалить draft релиза вручную в AppGallery Connect и попробовать еще раз. В данном примере мы загружаем release notes почти для всех доступных локализаций, хотя в большинстве случаев текст просто совпадает с английским.


Готово. После этого шага заливка в Huawei AppGallery также возможна через Gradle.
Полезные ссылки:
Добавление CI/CD
Последний, но важный шаг - добавить всё вышеописанное в вашу систему CI/CD. Здесь нет особых сложностей, так как вся автоматизация уже сделана в gradle и вам надо лишь запускать соответствующие задачи.
Мы используем GitHub Actions, поэтому расскажем кратко про них.
В первую очередь надо будет добавить файлы с ключами google-play.json и huawei-appgallery.json в GitHub Actions Secrets. Также вам понадобятся ключи для подписи, которые можно сохранить в base64. Переходите в Settings -> Secrets and variables -> Actions и добавляйте две новых переменных для каждого файла:

Дальше создаем новый workflow файл .github/workflows/android-release.yaml :
name: Android Release on: workflow_dispatch: # Manual trigger
Добавляем одну задачу с матрицу из нескольких вариантов (google, huawei, web):
jobs: android-release: name: Android Release runs-on: ubuntu-latest environment: production needs: tag strategy: fail-fast: false matrix: include: - flavor: google - flavor: huawei
steps: - name: Checkout sources uses: actions/checkout@v3 with: fetch-depth: 200 # enough to get all commits for the current day
В случае shared GitHub Runners все зависимости вроде Android SDK уже установлены, но вы можете установить что-нибудь еще, нужное для вашего проекта:
- name: Install build tools and dependencies shell: bash run: | sudo apt-get update -y sudo apt-get install -y ninja-build
Создаем файлы google-play.json и huawei-appgallery.json из GitHub Secrets:
- name: Get credenials shell: bash run: | echo "$>" > google-play.json echo "$>" > huawei-appgallery.json
Также аналогично надо будет добавить ключи для подписи приложений и другие ключи. Можно вместо работы с индивидуальными секретами сделать отдельный репозиторий и применять его поверх основного в момент сборки приложения.
Добавляем задачи для сборки и заливки в Google Play и Huawei AppGallery используя инструкции, описанные ранее в данной статье:
- name: Compile and upload to Google Play shell: bash working-directory: android run: | gradle bundleGoogleRelease publishGoogleReleaseBundle if: $> - name: Compile and upload to Huawei AppGallery shell: bash working-directory: android run: | gradle bundleHuaweiRelease gradle publishHuaweiAppGalleryHuaweiRelease if: $>
В целом готово. При запуске будет выглядеть примерно так:

Также можно добавить задачу для обновления метаданных Google Play Store. Можно добавить задачу в тот же workflow файл или сделать отдельный файл, так как в Google Play данная операция может выполняться вне зависимости от текущего состояния релиза.
- name: Update Google Play Metadata shell: bash run: ./gradlew publishGoogleReleaseListing working-directory: android timeout-minutes: 5
Полезные ссылки:
- Добавление encrypted secrets для GitHub Actions
- Пример android-release.yaml для GitHub Actions
Заключение
Выпуск новых релизов в сторах - это рутинная операция, которую приходиться делать на периодической основе - каждую неделю, каждый месяц, год от года. И на каждом шаге постоянно будет что-то забываться или делаться с ошибками. Релиз от релиза. Вы будете тратить время каждый раз.
Прежде чем добавлять описанную в статье автоматизацию, мы провели тщательную работу по документированию существующего процесса. Получилось больше 30 страниц текста со скриншотами. Настроенное CI/CD работает уже второй год и позволяет экономить сотни часов в год, которые можно потратить на более полезные вещи.
- Разработка мобильных приложений
- Разработка под Android
- DevOps
- Gradle
Разработка безопасных приложений, которым будут доверять
Правила Google Play нужны для того, чтобы миллиарды пользователей во всем мире могли безопасно работать с вашими приложениями и играми. На этой странице вы найдете сведения о наших правилах, а также ссылки на Соглашение о распространении программных продуктов и дополнительные обучающие ресурсы.
Наши правила и ресурсы
Запрещенный контент
Прежде чем опубликовать приложение в Google Play, убедитесь, что оно соответствует нашим правилам в отношении контента и законам страны, для которой оно предназначено.
Выдача себя за другое лицо
Когда разработчик выдает себя за другое лицо, это вредит и клиентам, и всему сообществу разработчиков. Запрещено публиковать приложения, которые вводят пользователей в заблуждение путем выдачи автора за другое лицо.
Интеллектуальная собственность
Когда недобросовестный разработчик копирует чужую работу или пытается ввести пользователей в заблуждение, это вредит и клиентам, и всему сообществу разработчиков. Призываем вас отказаться от плагиата в своих приложениях.
Нарушение конфиденциальности, злоупотребление ресурсами устройства и мошенничество
Конфиденциальность пользователей и безопасность сервисов очень важны для нас. Поэтому в Google Play строго запрещается публиковать вредоносные, мошеннические и другие приложения, которые недопустимым образом используют ресурсы сети или устройства, а также персональные данные.
Монетизация и реклама
Google Play поддерживает различные способы монетизации, включая платное распространение, продажу контента через приложение, подписки и рекламу. Чтобы обеспечить удобство для пользователей, мы требуем, чтобы вы соблюдали правила, описанные по ссылкам ниже.
Данные для Google Play и продвижение
Методы, которые вы применяете для продвижения своего приложения, значительно влияют на восприятие Google Play посетителями. Не используйте спам и рекламу низкого качества, а также не завышайте популярность приложения искусственно.
Спам и функциональность
Приложения должны содержать хотя бы минимальный набор функций и работать корректно. Если в приложении постоянно происходят сбои, а также если оно бесполезно для пользователей, его нельзя публиковать в Google Play.
Вредоносное ПО
Вредоносным ПО считается любой код, который может представлять угрозу для пользователя, а также его данных или устройств. Приложения, содержащие такой код, категорически запрещено публиковать в Google Play.
Нежелательное ПО для мобильных устройств
Приложения, которые нарушают принципы в отношении нежелательного ПО для мобильных устройств, потенциально опасны. Мы стараемся защищать пользователей от подобных программ.
Приложения для всей семьи
Прежде чем добавлять в Google Play приложение, целевой аудиторией которого являются дети, убедитесь, что оно действительно подходит для детей и соответствует законодательству.
Другие программы
Все приложения, распространяемые через Google Play, должны соответствовать требованиям к контенту, которые размещены в этом Центре правил для разработчиков. Однако если приложение создано для особенных функций Android, в отношении него могут применяться дополнительные условия. Ознакомьтесь с правилами по ссылкам ниже. Возможно, какие-то из этих требований относятся к вашему приложению.
Контроль за соблюдением правил
Узнайте, как действуют наши правила, как мы контролируем их соблюдение и как устранить нарушения.