Как быстро и правильно подписать 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:

  1. Соберите unsigned APK:
./gradlew assembleRelease
  1. Подпишите:
jarsigner -verbose -sigalg SHA256withRSA -digestalg SHA-256 \
  -keystore upload-keystore.jks app-release-unsigned.apk upload
  1. Выровняйте и проверьте:
zipalign -v 4 app-release-unsigned.apk app-release.apk
apksigner verify --print-certs app-release.apk

Подпись и тест AAB:

  1. Соберите бандл:
./gradlew bundleRelease
  1. Для локального теста используйте 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

  1. В Play Console в настройках App Signing загрузите upload_certificate.pem.
  2. Выберите управление ключами: "Let Google manage" (рекомендуется) или загрузите свой app signing key.
  3. Первая загрузка связывает ваш 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 и загрузить сертификат в консоль. Это гарантирует, что релиз пройдёт проверку и пользователи получат обновления без проблем. Удачных релизов!