Введение / Зачем это нужно
Подписание (signing) — это обязательный этап для любого Android-приложения, которое планируется распространять. Система Android использует цифровую подпись для:
- Идентификации автора: Убедиться, что обновления приложения исходят от того же разработчика.
- Контроля доступа: Разрешить приложению доступ к защищённым функциям или коду других приложений с той же подписью.
- Обновлений: Без совпадения подписи новую версию приложения нельзя установить поверх старой.
Google Play категорически требует, чтобы все загружаемые APK и AAB были подписаны вашим собственным релизным ключом. Этот гайд проведёт вас через весь процесс: от создания хранилища ключей до получения готового к загрузке файла.
Требования / Подготовка
Перед началом убедитесь, что у вас установлено и настроено:
- Android Studio (любая последняя стабильная версия, например, Flamingo или newer).
- Android SDK и JDK (который идёт в составе Android Studio или установлен отдельно, версии 11+).
- Доступ к командной строке (
terminalилиcmd). - Привилегии администратора (на некоторых системах могут потребоваться для доступа к определённым путям).
- Готовый release-вариант вашего проекта (отлаженный, с правильной версией
versionCodeиversionNameвbuild.gradle).
Шаг 1: Создание хранилища ключей (Keystore)
Хранилище ключей (.jks или .keystore) — это файл, содержащий ваш приватный ключ и сертификат. Его нужно создать один раз и хранить в надёжном месте (с резервной копией!).
Способ A: Через Android Studio (рекомендуется для новичков)
- В меню выберите Build → Generate Signed Bundle / APK...
- В диалоговом окне выберите APK или Android App Bundle (AAB) и нажмите Next.
- В разделе Key store path нажмите Create new....
- Заполните поля:
- Key store path: Укажите путь и имя файла (например,
~/my-release-key.jks). - Password: Придумайте и введите надёжный пароль (запомните его!).
- Key alias: Придумайте имя для вашего ключа (например,
my_app_key). - Key password: Можно использовать тот же пароль, что и для keystore (рекомендуется) или свой.
- Validity (years): Укажите срок действия (например, 25 лет или более, чтобы сертификат не истёк до конца жизни приложения).
- Certificate fields: Заполните вашими реальными данными (First and Last Name, Organizational Unit, Organization, City, State, Country Code). Это не будет видно пользователям, но требуется формально.
- Key store path: Укажите путь и имя файла (например,
- Нажмите OK, затем Next.
Способ B: Через командную строку (keytool)
Утилита keytool входит в состав JDK.
keytool -genkeypair -v \
-keystore ~/my-release-key.jks \
-keyalg RSA -keysize 2048 \
-validity 10000 \
-alias my_app_key
-keystore: Путь к создаваемому файлу.-keyalg: Алгоритм (RSA стандарт).-keysize: Размер ключа (2048 или 4096 бит).-validity: Срок действия в днях (10000 ~ 27 лет).-alias: Псевдоним ключа.
Вам будет предложено ввести пароли и данные сертификата.
💡 Совет: Файл
my-release-key.jksникогда не добавляйте в систему контроля версий (.gitignore). Храните его в защищённом месте вне проекта.
Шаг 2: Настройка signingConfigs в Gradle
Откройте модульный файл build.gradle (обычно app/build.gradle).
Внутри блока android { ... } добавьте блок signingConfigs и конфигурацию release:
android {
// ... другие настройки (compileSdk, defaultConfig и т.д.)
signingConfigs {
release {
// Путь к файлу keystore. Используйте абсолютный путь или переменную.
storeFile file('../my-release-key.jks') // Пример: файл в родительской папке проекта
storePassword 'your_keystore_password' // Пароль от keystore
keyAlias 'my_app_key' // Alias вашего ключа
keyPassword 'your_key_password' // Пароль от ключа (может совпадать)
}
}
buildTypes {
release {
// ... другие настройки release (minifyEnabled, proguard и т.д.)
signingConfig signingConfigs.release // <-- ЭТА СТРОКА КРИТИЧЕСКА ВАЖНА
}
debug {
// Debug-сборка обычно подписывается автоматически дебажным ключом.
signingConfig signingConfigs.debug
}
}
}
⚠️ Важно: Никогда не коммитьте пароли в открытом виде в репозиторий! Для production-сборок используйте Gradle properties или переменные окружения:
- В
~/.gradle/gradle.properties(глобально) илиproject/gradle.properties(локально) добавьте:MY_KEYSTORE_PASSWORD=super_secret_pass MY_KEY_PASSWORD=super_secret_pass- В
build.gradleподставьте:storePassword System.getenv("MY_KEYSTORE_PASSWORD") ?: project.property('MY_KEYSTORE_PASSWORD') keyPassword System.getenv("MY_KEY_PASSWORD") ?: project.property('MY_KEY_PASSWORD')
Шаг 3: Генерация релизного артефакта (APK/AAB)
После настройки signingConfigs можно создавать подписанные файлы.
Способ A: Через Android Studio (GUI)
- Build → Generate Signed Bundle / APK...
- Выберите APK или AAB.
- На шаге Key store path выберите Choose existing... и укажите ваш
my-release-key.jks. Введите пароли. - Выберите release в Build Variant (если не выбран).
- Нажмите Finish. Собранный файл будет в
app/release/(илиapp/build/outputs/bundle/release/для AAB).
Способ B: Через командную строку (Gradle Wrapper)
В корне проекта выполните:
# Для APK
./gradlew assembleRelease
# Для AAB (Android App Bundle)
./gradlew bundleRelease
Готовые файлы находятся в:
- APK:
app/build/outputs/apk/release/app-release.apk - AAB:
app/build/outputs/bundle/release/app-release.aab
Шаг 4: Проверка подписи (опционально, но рекомендуется)
Убедитесь, что файл действительно подписан вашим ключом.
Для APK (используем jarsigner из JDK):
jarsigner -verify -verbose -certs app/build/outputs/apk/release/app-release.apk
В выводе ищите строку jar verified. и информацию о вашем alias (my_app_key).
Для AAB (используем apksigner из Android SDK Build-Tools):
# На Windows: apksigner.bat
$ANDROID_HOME/build-tools/<версия>/apksigner verify --verbose app/build/outputs/bundle/release/app-release.aab
Проверка результата
- Файл существует: Убедитесь, что в указанной папке лежит
app-release.apkилиapp-release.aab. - Подпись валидна: Успешное выполнение команды проверки из Шага 4.
- Размер файла: Релизный APK/AAB будет значительно меньше дебажного (из-за сжатия и без отладочной информации).
- Публикация в Google Play Console: Загрузите сгенерированный AAB (предпочтительно) или APK. Система валидации Google Play должна принять файл без ошибок, связанных с подписью.
⚠️ Критически важно: Тот же самый keystore и alias должны использоваться для всех будущих обновлений этого приложения. Если вы их потеряете или забудете пароли — обновление через Google Play станет невозможным.
Возможные проблемы
Ошибка: Keystore was tampered with, or password was incorrect
- Причина: Неверный пароль от keystore или файл повреждён.
- Решение: Проверьте пароль. Убедитесь, что используете правильный файл
.jks. Если пароль утерян, keystore становится бесполезным.
Ошибка: Execution failed for task ':app:validateSigningRelease'. > Keystore file not found for signing config 'release'
- Причина: В
build.gradleуказан неверный путь кstoreFile. - Решение: Проверьте путь. Лучше использовать абсолютный путь или
file('../relative/path.jks'). Убедитесь, что файл существует.
Ошибка при сборке: Failed to sign the APK
- Причина: Часто связано с несовместимостью алгоритма (старый keystore с SHA1) или ошибкой в
gradle.properties. - Решение: Убедитесь, что в
signingConfigsуказаны все 4 параметра (storeFile,storePassword,keyAlias,keyPassword). Проверьте, что пароли, содержащие спецсимволы, правильно экранированы вgradle.properties.
Не могу установить релизный APK на устройство (ошибка INSTALL_PARSE_FAILED_NO_CERTIFICATES)
- Причина: Файл APK не был подписан, или подпись невалидна.
- Решение: Пересоберите артефакт, убедившись, что
signingConfigприменён кreleasebuild type. Проверьте подпись командойjarsigner -verify.
Заключительные рекомендации
- Резервное копирование: Сделайте несколько копий файла
.jksи сохраните пароли в надёжном менеджере паролей (например, KeePass, Bitwarden). Храните копии в разных физических местах. - Информация о сертификате: Заведите документ с данными вашего сертификата (alias, DN, дата истечения, SHA-1 отпечаток). Это потребуется для некоторых сервисов (например, настройки Google API).
- Увеличение
versionCode: Перед каждой новой публикацией в Google Play обязательно увеличивайте целочисленное значениеversionCodeвdefaultConfigвашегоbuild.gradle. Без этого Play Console отклонит загрузку. - Тестирование: Устанавливайте сгенерированный релизный APK на физическое устройство перед загрузкой в Play Console, чтобы проверить, что всё работает корректно (включая встроенные лицензии, глубокие ссылки и т.д.).
Следуя этому гайду, вы получите корректно подписанный артефакт, готовый к публикации в любом маркете, включая Google Play.