Создание и использование release keystore в Android

Короткий ответ: создайте release-keystore командой keytool, укажите alias, срок действия >= 25 лет, сохраните .jks и подключите его в signingConfig — только так приложение примут в Google Play. Ниже — практическая пошаговая инструкция и рекомендации по безопасности.

Зачем нужен keystore и что важно

Keystore — это файл (.jks/.keystore) с приватным ключом, которым вы цифрово подписываете APK/AAB. Google Play требует подпись релизного ключа для подтверждения авторства и обновлений. Главное:

  • Создайте ключ один раз и храните резервные копии. Потеря ключа усложняет или делает невозможным обновление приложения.
  • Используйте RSA 2048+, срок действия не менее 25 лет (рекомендуется ~10000+ дней).
  • Не используйте debug-keystore для релиза.

Если потеряете keystore или пароль, обновления будут проблематичны — потребуется сложная миграция через Google Play App Signing.

Шаг за шагом: как создать keystore

  1. Убедитесь, что установлен JDK 11+ (keytool входит в JDK). Проверьте: keytool -version.
  2. Откройте терминал и выполните (замените параметры на свои):
keytool -genkey -v -keystore ~/my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-key-alias
  1. Введите надежный пароль для keystore и (по желанию) отдельный пароль для ключа. Заполните поля имени/организации и двухбуквенный код страны.
  2. Проверьте созданный файл:
keytool -list -v -keystore ~/my-release-key.jks

Рекомендации:

  • Храните .jks вне репозитория или добавьте в .gitignore.
  • Делайте минимум 2–3 зашифрованные резервные копии и храните пароли в менеджере паролей.

Для командной работы используйте Google Play App Signing: вы отдаёте основной ключ Google, а для загрузки используете upload key — это снижает риск потери.

Интеграция в Android Studio и сборка

  1. Переместите my-release-key.jks в защищённое место в проекте (например app/).
  2. Создайте keystore.properties в корне проекта и добавьте в .gitignore:
storePassword=ВашПароль
keyPassword=ВашПароль
keyAlias=my-key-alias
storeFile=app/my-release-key.jks
  1. В корневом build.gradle(или в скрипте Kotlin) загрузите свойства:
val keystoreProps = java.util.Properties().apply {
  load(java.io.FileInputStream(rootProject.file("keystore.properties")))
}
  1. В модуле app добавьте signingConfigs и привяжите к release:
signingConfigs {
  create("release") {
    storeFile = file(keystoreProps["storeFile"] as String)
    storePassword = keystoreProps["storePassword"] as String
    keyAlias = keystoreProps["keyAlias"] as String
    keyPassword = keystoreProps["keyPassword"] as String
  }
}
buildTypes {
  release {
    signingConfig = signingConfigs.getByName("release")
    isMinifyEnabled = true
    proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
  }
}
  1. Соберите подпись через Build > Generate Signed Bundle/APK или через Gradle task для CI: используйте секреты (GitHub Actions Secrets) и безопасно загружайте .jks как защищённый артефакт.

Частые ошибки

  • Keystore was tampered with, or password was incorrect — неверный пароль. Восстановлению не подлежит; придется создать новый ключ и пройти процедуру миграции.
  • Ключ истёк — задавайте validity >= 9125 (25 лет) или 10000+ дней.
  • Несовпадение ключей при обновлении — убедитесь, что alias и keystore совпадают с предыдущим файлом: keytool -list -v -keystore old.jks
  • Права доступа на Linux/Mac: chmod 600 my-release-key.jks

Резервируйте keystore в зашифрованном хранилище (Bitwarden/1Password) и храните копии на внешних носителях.

FAQ

  • Можно ли хранить .jks в репозитории? — Нет. Храните файл вне публичного репозитория и добавляйте в .gitignore.
  • Что делать, если потерял keystore? — Свяжитесь с поддержкой Google Play: возможна только ограниченная миграция через App Signing, но процесс требует подтверждений и upload key.
  • Нужен ли свой ключ, если использую App Bundle? — Да: даже с AAB у вас должен быть release key (или вы доверяете Google хранить ключ в App Signing).

Теперь вы можете сгенерировать keystore, настроить signingConfig и собрать подписанный AAB/APK для загрузки в Google Play.