Создание и использование 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
- Убедитесь, что установлен JDK 11+ (keytool входит в JDK). Проверьте: keytool -version.
- Откройте терминал и выполните (замените параметры на свои):
keytool -genkey -v -keystore ~/my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-key-alias
- Введите надежный пароль для keystore и (по желанию) отдельный пароль для ключа. Заполните поля имени/организации и двухбуквенный код страны.
- Проверьте созданный файл:
keytool -list -v -keystore ~/my-release-key.jks
Рекомендации:
- Храните .jks вне репозитория или добавьте в .gitignore.
- Делайте минимум 2–3 зашифрованные резервные копии и храните пароли в менеджере паролей.
Для командной работы используйте Google Play App Signing: вы отдаёте основной ключ Google, а для загрузки используете upload key — это снижает риск потери.
Интеграция в Android Studio и сборка
- Переместите my-release-key.jks в защищённое место в проекте (например app/).
- Создайте keystore.properties в корне проекта и добавьте в .gitignore:
storePassword=ВашПароль
keyPassword=ВашПароль
keyAlias=my-key-alias
storeFile=app/my-release-key.jks
- В корневом build.gradle(или в скрипте Kotlin) загрузите свойства:
val keystoreProps = java.util.Properties().apply {
load(java.io.FileInputStream(rootProject.file("keystore.properties")))
}
- В модуле 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")
}
}
- Соберите подпись через 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.