Android-приложения: настройка Keystore, Gradle, CI/CD и Play App Signing

TRUETECH занимается разработкой, поддержкой и обслуживанием мобильных приложений iOS, Android, PWA. Имеем большой опыт и экспертизу для публикации мобильных приложений в популярные маркеты Google Play, App Store, Amazon, AppGallery и другие.

Разработка и поддержка любых видов мобильных приложений:

Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

Это лишь некоторые из типы мобильных приложений, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента.

Услуги, которые мы предлагаем
Показано 1 из 1Все 1734 услуг
Android-приложения: настройка Keystore, Gradle, CI/CD и Play App Signing
Средний
от 1 дня до 3 дней
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    858
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    743
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1160
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    1034
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    968
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    562

Потеря keystore-файла — необратима. Если приватный ключ утерян, обновление существующего приложения в Google Play становится невозможным. Придётся публиковать новое приложение с новым package name, теряя все отзывы, историю загрузок и позиции в поиске. По нашим данным, такие инциденты обходятся разработчикам в многомесячные простои и потерю дохода. Чтобы этого не случилось, мы настраиваем подпись Android-приложений под ключ: от генерации keystore до CI/CD и Play App Signing. Наши инженеры сертифицированы Google и имеют многолетний опыт в Android-разработке. Свяжитесь с нами — оценим ваш проект бесплатно и предложим оптимальное решение.

В этом руководстве разберём создание keystore, настройку Signing Config в Gradle без хранения паролей в коде, подключение Play App Signing и автоматизацию подписи на CI. Следуя этим инструкциям, вы защитите свои ключи и избежите потери доступа к приложению.

Создание и хранение keystore

Генерация через keytool:

keytool -genkeypair -v \
  -keystore release.keystore \
  -alias myapp \
  -keyalg RSA \
  -keysize 2048 \
  -validity 10000 \
  -storetype JKS

-validity 10000 — примерно 27 лет. Google рекомендует минимум 25 лет для приложений в Play Store. Более короткий срок — и Google Play в будущем откажется принимать обновления. Рекомендуем использовать формат PKCS12 (-storetype PKCS12) — он более безопасный и совместимый.

Keystore нельзя хранить в git-репозитории. Даже в приватном. Правила хранения: зашифрованный бэкап в облачном хранилище (минимум двух), физическая копия вне офиса, пароли — отдельно от файла.

Параметры keystore: рекомендации

Параметр Рекомендация Почему
Алгоритм RSA 2048 бит Баланс безопасности и производительности
Срок действия 10000 дней (27 лет) Обеспечивает обновления на весь жизненный цикл
Формат PKCS12 Более надёжное шифрование, чем JKS
Alias Название приложения Удобно для нескольких ключей

Как настроить Signing Config в Gradle без паролей?

Прямое указание пути и паролей в build.gradle — антипаттерн:

// ТАК НЕ ДЕЛАТЬ — пароли в репозитории
signingConfigs {
    release {
        storeFile file("../keys/release.keystore")
        storePassword "mysecretpassword"  // в git попадёт
        keyAlias "myapp"
        keyPassword "mysecretpassword"
    }
}

Правильный подход — через переменные окружения или local.properties:

// build.gradle (app)
def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('keystore.properties')
if (keystorePropertiesFile.exists()) {
    keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}

android {
    signingConfigs {
        release {
            keyAlias keystoreProperties['keyAlias'] ?: System.getenv('KEY_ALIAS')
            keyPassword keystoreProperties['keyPassword'] ?: System.getenv('KEY_PASSWORD')
            storeFile keystoreProperties['storeFile'] ?
                file(keystoreProperties['storeFile']) : null
            storePassword keystoreProperties['storePassword'] ?: System.getenv('STORE_PASSWORD')
        }
    }
    buildTypes {
        release {
            signingConfig signingConfigs.release
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

keystore.properties — в .gitignore. На CI передаём переменные окружения напрямую. Для Kotlin DSL конфигурация аналогична, с использованием getProperty вместо get. Подробнее о Signing Config.

Дополнительно: проверка fingerprint
keytool -list -v -keystore release.keystore -alias myapp

В Play Console: Setup → App signing → App signing key certificate — сравните SHA-256. Fingerprint для Firebase/OAuth берите с app signing key, не с upload key.

Как защитить ключи от утечки?

Используйте переменные окружения или keystore.properties в .gitignore. Никогда не храните пароли в коде. Для CI применяйте base64-кодирование keystore и секреты репозитория. Это снижает риск утечки ключей при компрометации репозитория.

Почему стоит использовать Play App Signing?

Play App Signing — это страховка: если upload key утерян, Google может его ротировать. Вы подписываете только upload key, а Google перепаковывает приложение с отдельным app signing key. Это в 100 раз безопаснее, чем хранить единственный ключ. Включить можно в Play Console: Release → Setup → App signing. После включения отключить нельзя.

Сравнение методов подписи

Метод Безопасность Восстановление Сложность
Один ключ (upload only) Средняя Нет Низкая
Play App Signing Высокая Да (через Google) Средняя
Несколько ключей (без Play) Высокая Нет Высокая

Как интегрировать подпись в CI/CD?

На GitHub Actions:

- name: Sign APK
  env:
    KEYSTORE_BASE64: ${{ secrets.KEYSTORE_BASE64 }}
    KEY_ALIAS: ${{ secrets.KEY_ALIAS }}
    KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
    STORE_PASSWORD: ${{ secrets.STORE_PASSWORD }}
  run: |
    echo "$KEYSTORE_BASE64" | base64 --decode > release.keystore
    ./gradlew bundleRelease \
      -Pandroid.injected.signing.store.file=$(pwd)/release.keystore \
      -Pandroid.injected.signing.store.password=$STORE_PASSWORD \
      -Pandroid.injected.signing.key.alias=$KEY_ALIAS \
      -Pandroid.injected.signing.key.password=$KEY_PASSWORD

Keystore кодируем в base64 (base64 release.keystore) и сохраняем в secrets репозитория. На агенте декодируем, используем, после работы удаляем.

Что входит в работу

  • Создание keystore с параметрами под ваш проект (алгоритм, срок, формат).
  • Конфигурация Gradle для всех flavor-сборок.
  • Интеграция с Play App Signing (включая перенос ключей).
  • Настройка CI/CD (GitHub Actions, GitLab CI или другой).
  • Документация по хранению и ротации ключей.

Типичные ошибки при настройке подписи

  • Хранение keystore в репозитории — ключ может быть скомпрометирован.
  • Использование JKS вместо PKCS12 — менее безопасное шифрование.
  • Неверный fingerprint — сервисы Firebase, OAuth перестают работать.
  • Отсутствие резервной копии keystore — потеря доступа к приложению.

Ориентиры по срокам

Настройка подписи для одного флейвора — от 2 до 4 часов. При нескольких flavor-конфигурациях и интеграции с Play App Signing — один рабочий день. Закажите консультацию по вашему проекту уже сегодня.

Согласно рекомендациям Android Developers, Play App Signing снижает риск потери доступа к приложению на порядок.

Публикация мобильного приложения: App Store, Google Play, ASO, процесс ревью, Fastlane

Мы сопровождаем публикацию мобильных приложений в App Store и Google Play от первого сабмита до поэтапного выката. Часто сталкиваемся с ситуацией, когда готовый продукт возвращают на доработку из-за бюрократических требований платформ, а не технических ошибок. По статистике Apple, около 40% первых сабмитов отклоняются — и часть причин легко устранить заранее, если знать, куда смотреть. Google Play автоматизирован сильнее, но там тоже бывают сюрпризы: приложение может быть опубликовано и снято через несколько дней после первичного ревью, когда авторевьюер дообнаруживает несоответствие политикам. Разбираем типичные проблемы и показываем, как их обойти.

Почему App Store отклоняет приложения? Реальные причины

Apple Review обычно занимает 24–48 часов (среднее время по статистике Apple — около 90% приложений рассматриваются за сутки). Expedited review — реальная опция через App Store Connect при критических багах, но не для первого сабмита.

Частые причины отклонения, которые съедают время:

  • Guideline 2.1 — App Completeness. Тест-аккаунт не работает, демо-данные не загружаются, часть экранов показывает пустой state без объяснений. Ревьюер видит сломанное приложение. Решение простое: заполненный тест-аккаунт с реалистичными данными, Notes for Reviewer с пошаговой инструкцией по проверке ключевых сценариев.

  • Guideline 4.3 — Spam. Приложение похоже на другое ваше приложение или слишком простое (обёртка над веб-сайтом). Это одна из самых субъективных причин. Если у вас несколько похожих приложений для разных стран — нужно серьёзное обоснование различий.

  • Guideline 5.1.1 — Data Collection and Storage. Нет Privacy Policy, Privacy Policy не соответствует реальному сбору данных, или в privacy manifest (обязателен с мая 2024) не задекларированы API, которые используются. Privacy Manifest — PrivacyInfo.xcprivacy файл — обязателен, если используете UserDefaults, FileTimestamp, DiskSpace, ActiveKeyboards или любой из required reason APIs. Apple начала отклонять без него в текущем цикле.

  • Guideline 3.1.1 — Business — Payments. Внешние ссылки на оплату там, где должен быть IAP. После решения Epic vs Apple в США Apple разрешила ссылку на внешний сайт для Reader Apps, но правила сложные и зависят от категории приложения.

Отдельный момент — App Privacy Labels (nutrishn leybli — информационная панель о сборе данных). Нужно честно задекларировать что собирается, зачем, и linked to user or not. Ошибки здесь не блокируют публикацию сразу, но Apple может запросить исправление постфактум.

Как избежать отклонения по 5.1.1? Инструкция

Проверьте, включены ли в проекте следующие API: UserDefaults, FileTimestamp, DiskSpace, ActiveKeyboards, System Boot Time. Если да — обязательно добавьте PrivacyInfo.xcprivacy с указанием reasons. Шаблон можно взять из документации Apple. Мы обычно прописываем файл на этапе настройки проекта, а не перед сабмитом — это экономит день-два на исправлениях.

Google Play: автоматизация и скрытые сюрпризы

Google Play более автоматизирован, первичный ревью часто занимает несколько часов. Но есть нюансы.

  • Target SDK level — Google регулярно повышает требования. В текущем цикле новые приложения должны таргетировать Android 14 (API 34). Существующие приложения получают уведомления об обязательном обновлении с дедлайнами. Если не обновить — приложение станет недоступным для новых пользователей на новых устройствах.

  • 64-bit requirement — все приложения с нативными библиотеками должны иметь 64-bit версии. Flutter по умолчанию собирает оба варианта, React Native с некоторыми нативными модулями — нет. Проверяйте заранее, иначе придётся пересобирать бинарники.

  • Data Safety Form — аналог Apple Privacy Labels, заполняется в Play Console. В отличие от Apple, Google это не автоматически проверяет при каждом релизе — но может запросить аудит.

  • Play Integrity API (замена SafetyNet, который deprecated) — для приложений, которым важна целостность устройства (банки, платёжные приложения, игры с анти-чит). Требует сервера для верификации токена.

Что делать, если приложение сняли с публикации на третий день?

Такое случается, когда авторевьюер дообнаруживает нарушение политики. Проверьте, соответствует ли приложение текущим требованиям по рекламе, сбору данных и контенту. Если нарушение незначительное, можно подать апелляцию через Play Console. В нашей практике около 80% таких случаев решаются уточнением метаданных или исправлением ошибки в конфигурации.

ASO: App Store Optimization

ASO влияет на органический трафик — это реальные загрузки без рекламного бюджета.

Ключевые факторы ранжирования в App Store и Google Play:

  • Название приложения — самый весомый фактор. Ключевые слова в названии работают лучше всего. Ограничение: App Store — 30 символов, Google Play — 50.

  • Ключевые слова (App Store) — поле 100 символов, только для App Store, не отображается пользователям. Без пробелов после запятых (экономит символы), не дублируйте слова из названия.

  • Описание (Google Play индексирует его, App Store — нет) — первые 80 символов видны без «подробнее», остальное — в раскрывающемся блоке.

  • Визуальные материалы — иконка, скриншоты, preview-видео. A/B тестирование визуалов через Product Page Optimization (App Store) и Store Listing Experiments (Google Play) реально влияет на конверсию страницы. Разница между плохим и хорошим скриншотом — 15–30% конверсии.

  • Рейтинг и отзывы — алгоритм учитывает свежесть, а не только среднее. Активная работа с отзывами (ответы) сигнализирует платформе об активном приложении. SKStoreReviewRequest.requestReview() (iOS) и ReviewManager.requestReview() (Android) — запрашивайте отзыв в правильный момент: после позитивного события, не при первом запуске.

Fastlane: автоматизация публикации

Ручная публикация — сертификаты, provisioning profiles, сборка, загрузка в App Store Connect или Google Play Console — занимает час и легко ошибиться. Fastlane автоматизирует весь пайплайн.

Ключевые lanes:

  • match — управление сертификатами и provisioning profiles через зашифрованный Git-репозиторий. Вся команда использует одни сертификаты, нет проблем «сертификат истёк на машине разработчика». fastlane match appstore — синхронизация перед сборкой.

  • gym (build) — fastlane gym --scheme "AppName" --configuration Release --export_method app-store. Через Gymfile параметры фиксируются в репозитории.

  • deliver (upload to App Store) — загружает бинарник, метаданные, скриншоты. Скриншоты можно держать в репозитории через fastlane snapshot (автоматическая генерация через XCUITest).

  • supply — аналог deliver для Google Play, поддерживает all tracks (internal, alpha, beta, production) с rollout параметром для поэтапного выкатывания.

Типичный Fastfile:

lane :release_ios do
  match(type: "appstore")
  gym(scheme: "App")
  deliver(submit_for_review: true, automatic_release: false)
end

lane :release_android do
  gradle(task: "bundle", build_type: "Release")
  supply(track: "production", rollout: "0.1")
end

Интеграция с CI/CD: Fastlane + GitHub Actions или Bitrise — стандартный стек. Переменные среды для API ключей App Store Connect и Google Service Account. Код подписывается автоматически при мерже в main.

Поэтапный выкат и rollback

Google Play поддерживает постепенное развёртывание: rollout: "0.05" — 5% пользователей получают обновление сначала. Мониторим Crashlytics/Firebase Crashlytics, crash-free rate, ANR rate. Если показатели ухудшились — останавливаем rollout через Play Console без отзыва релиза.

App Store не имеет поэтапного выкатывания для обычных приложений (есть Phased Release для app updates — 7-дневный постепенный выкат). Для более гибкого управления используем feature flags (Firebase Remote Config, LaunchDarkly) — новый функционал выключен по умолчанию, включаем через конфиг без нового релиза.

Что входит в работу по публикации

Мы готовим полный комплект для выхода в сторах:

  • Создание и настройка аккаунтов разработчика (Apple Developer Program, Google Play Console) с корпоративными доступными.
  • Подготовка метаданных: название, описание, ключевые слова, категория, возрастной рейтинг.
  • Настройка Privacy Policy и App Privacy Labels / Data Safety Form.
  • Генерация и установка сертификатов, provisioning profiles (через match или вручную).
  • Сборка и подпись бинарника с правильной конфигурацией (Code Signing, ProGuard/R8).
  • Загрузка бинарника и метаданных с помощью Fastlane или вручную.
  • Прохождение ревью: анализ тикетов, апелляции при необходимости, корректировка.
  • Настройка поэтапного выката и мониторинг метрик после релиза.
  • Обучение команды работе с TestFlight / Firebase App Distribution.

Что мы не делаем

Не пишем код приложения, не занимаемся маркетингом (кроме ASO-рекомендаций), не регистрируем торговые марки. Наша зона — техническая подготовка к публикации и сопровождение до первого релиза.

Сроки и стоимость

Подготовка первого релиза: настройка аккаунтов, сертификатов, метаданных, скриншотов, Privacy Policy — от 3 до 5 рабочих дней при наличии всех материалов. Настройка Fastlane + CI/CD — от 2 до 3 дней. Ревью App Store — от 1 до 3 дней. Итого от готового приложения до публикации — от 1 до 2 недель.

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

Типичные ошибки, которые мы находим на аудите

Чек-лист: что проверить перед отправкой
  • [ ] Указаны все разрешения в манифесте (Android) или Info.plist (iOS) с пояснениями
  • [ ] Privacy Manifest (iOS) содержит все required reason APIs
  • [ ] Data Safety Form (Android) заполнена корректно
  • [ ] Тест-аккаунт активен и имеет реалистичные данные
  • [ ] Нет внешних ссылок на оплату внутри IAP-продуктов
  • [ ] Скриншоты соответствуют актуальной версии интерфейса
  • [ ] Версия билда инкрементирована
  • [ ] Код подписан правильным сертификатом (Distribution, не Development)
  • [ ] 64-bit сборка присутствует
  • [ ] Отсутствуют упоминания конкурентов в метаданных

Почему стоит доверить публикацию нам?

У нас 7+ лет опыта в мобильной разработке, более 50 успешно опубликованных приложений для iOS и Android. Знаем все подводные камни App Store Review Guidelines (разделы 4.2, 5.1) и политик Google Play. Используем Fastlane, CI/CD, автоматические проверки метаданных — чтобы вы не тратили время на рутину. Закажите консультацию — расскажем, как сократить цикл публикации вдвое.