Сборка и подписание билдов игр для Google Play
APK залит в Play Console, проходит ревью — и через два часа приходит отказ: «Your APK is not signed with the upload key». Или сборка принята, но через неделю пользователи сообщают, что при обновлении Android просит «удалить старую версию перед установкой» — потому что keystore сменился между релизами, а Play App Signing не был активирован вовремя.
Android-сборка для Google Play менее церемониальна, чем iOS, но ошибки в управлении ключами подписи могут обернуться потерей аккаунта или невозможностью обновить уже опубликованное приложение.
Keystore и Play App Signing — в чём разница
До Play App Signing (обязательно с августа 2021 для новых приложений) разработчик подписывал APK своим ключом — и этот же ключ видел пользователь. Потеря keystore = невозможность выпускать обновления навсегда.
С Play App Signing схема двухуровневая: upload key (в руках разработчика) подписывает APK при загрузке в Play Console, Google его верифицирует и переподписывает финальный APK своим app signing key перед доставкой пользователям. Потеря upload key решаема — Google позволяет его сменить по запросу. Потеря app signing key — нет, но он хранится у Google.
При первой публикации нового приложения Play App Signing включается автоматически. Для существующих приложений — нужна явная активация с загрузкой текущего ключа.
Сборка AAB вместо APK
С 2021 года Google Play требует Android App Bundle (.aab) для новых приложений. Unity генерирует AAB через BuildOptions с BuildAppBundle = true. AAB весит меньше APK и позволяет Play Console генерировать оптимизированные APK под конкретное устройство (ABI split, texture compression split).
Важный нюанс для Unity-игр: при использовании IL2CPP и AAB нужно проверить, что Split Application Binary включён в Player Settings — иначе AAB может превысить лимит в 150 МБ при загрузке. Дополнительные ассеты (Addressables, StreamingAssets) должны поставляться через Play Asset Delivery (PAD), а не включаться напрямую в бандл.
Play Asset Delivery — обязательная тема для игр с крупными ресурсами. Три режима доставки: install-time (вместе с установкой, до 1 ГБ), fast-follow (сразу после установки), on-demand (по запросу во время игры). Интеграция с Unity через Google.Play.AssetDelivery пакет — требует переработки системы загрузки ресурсов, если она не проектировалась под PAD с самого начала.
Автоматизация через Fastlane
supply (Fastlane lane для Google Play) умеет загружать AAB в конкретный трек (internal, alpha, beta, production), управлять rollout percentage, обновлять store listing.
Аутентификация — через Service Account JSON с ролью «Release Manager» в Play Console. Это надёжнее OAuth — токен не истекает и не требует интерактивной авторизации на CI.
Пример минимального Fastfile:
-
gradleaction для сборки AAB с нужным build type -
signчерезjarsignerилиzipalign+apksignerс keystore из переменных окружения -
supplyдля загрузки в internal track
Keystore хранится в зашифрованном виде в CI (GitHub Secrets, GitLab CI Variables, Vault). Никогда не коммитим .jks или .keystore файлы в репозиторий — даже в приватный.
Версионирование
versionCode в Android должен монотонно возрастать. В Unity — это PlayerSettings.Android.bundleVersionCode. Автоматически инкрементируем через скрипт в pre-build hook или через Fastlane increment_version_code. Для CI-сборок удобно использовать номер билда пайплайна как вклад в versionCode: baseVersion * 1000 + buildNumber.
Сроки
| Задача | Срок |
|---|---|
| Разовая сборка AAB и загрузка в internal track | 0.5–1 день |
| Настройка Play App Signing + ключей для CI | 1–2 дня |
| Полный пайплайн (GameCI + Fastlane supply + треки) | 2–5 дней |
| Play Asset Delivery интеграция | 1–3 недели |
Стоимость рассчитывается после анализа текущей структуры проекта и состояния ключей подписи.





