Как быстро и правильно подписать APK/AAB для Google Play
Чтобы загрузить приложение в Google Play, подпишите APK или AAB upload key и включите App Signing в Play Console: Google будет переподписывать релиз production key'ем. Коротко — создайте keystore (RSA ≥2048, validity ≥25 лет), подпишите сборку, проверьте apksigner и загрузите публичный сертификат в консоли.
Генерация ключей и keystore
Создайте keystore с keytool (JDK):
keytool -genkeypair -v -keystore upload-keystore.jks -alias upload \
-keyalg RSA -keysize 2048 -validity 25000
Рекомендации:
- CN — ваше имя/email; OU/ O — по необходимости.
- Пароль keystore минимум 6 символов.
- Сохраняйте keystore и пароли в защищённом месте (менеджер паролей, HSM).
- Экспорт публичного сертификата для загрузки в Play Console:
keytool -export -rfc -keystore upload-keystore.jks -alias upload -file upload_certificate.pem
Бэкапьте keystore в 3 независимых местах (офлайн + облако с шифрованием). Не коммитите приватный keystore в репозиторий.
Подпись APK и AAB — практические команды
Подпись release APK:
- Соберите unsigned APK:
./gradlew assembleRelease
- Подпишите:
jarsigner -verbose -sigalg SHA256withRSA -digestalg SHA-256 \
-keystore upload-keystore.jks app-release-unsigned.apk upload
- Выровняйте и проверьте:
zipalign -v 4 app-release-unsigned.apk app-release.apk
apksigner verify --print-certs app-release.apk
Подпись и тест AAB:
- Соберите бандл:
./gradlew bundleRelease
- Для локального теста используйте bundletool:
java -jar bundletool.jar build-apks --bundle=app-release.aab \
--output=app.apks --ks=upload-keystore.jks --ks-key-alias=upload \
--ks-pass=pass:YOUR_PASSWORD
java -jar bundletool.jar install-apks --apks=app.apks
Для загрузки в Play Console достаточно подписанного upload key AAB — Google выполнит окончательную подпись.
Настройка App Signing в Google Play Console
- В Play Console в настройках App Signing загрузите
upload_certificate.pem. - Выберите управление ключами: "Let Google manage" (рекомендуется) или загрузите свой app signing key.
- Первая загрузка связывает ваш upload key с приложением — не теряйте его.
Если потеряли upload key — готовьтесь к процедуре ротации: обращайтесь в поддержку с доказательствами владения аккаунтом (исторические APK, биллинг). Без подтверждения доступ к обновлениям может быть заблокирован.
Частые ошибки и как их исправить
- Keystore was tampered (keystore load): скорее всего неправильный пароль или повреждённый файл. Проверьте пароль, используйте бэкап.
- AAB signed with debug key: собрали debug-сборку вместо release. Выполните
./gradlew clean bundleReleaseи убедитесь в signingConfigs.release. - Your Android App Bundle is signed with the wrong key / SHA-1 mismatch: проверьте
apksigner verify --print-certs. При несоответствии сгенерируйте новый upload key и запросите ротацию ключа в Play Console. - Key validity expired: создайте новый ключ с
-validity 25000и инициируйте запрос на обновление ключа. - Jarsigner использует старый digestalg: указывайте
SHA256withRSAиSHA-256.
Автоматизация в CI/CD
Храните keystore и пароли в секретах CI (GitHub Actions Secrets, GitLab CI variables). Пример шага (логика):
- Декодировать keystore из base64
- Запустить сборку и подпись через Gradle плагин или сторонние действия
- Проверить подпись
apksigner verify
FAQ
- Что делать, если я потерял keystore? Запросите ротацию ключа в Play Console и предоставьте доказательства владения аккаунтом.
- Можно ли сменить app signing key? Да — через процесс ротации в Play Console (подтверждения от Google).
- Нужен ли AAB? Да, AAB — рекомендуемый формат: меньший размер загрузки и управление под устройства.
- Как проверить, чем подписан APK? Используйте
apksigner verify --print-certs app.apk.
Заключение: следуйте простому потоку — создать keystore, подписать upload key, проверить apksigner и загрузить сертификат в консоль. Это гарантирует, что релиз пройдёт проверку и пользователи получат обновления без проблем. Удачных релизов!