Другое

Подписание Android-приложений для релиза: пошаговое руководство

Это руководство объясняет, как правильно подписать Android-приложение для публикации в Google Play. Вы узнаете, как создать и управлять хранилищем ключей (keystore), настроить проект в Android Studio и сгенерировать релизную сборку, готовую к загрузке.

Обновлено 15 февраля 2026 г.
15-30 мин
Средняя
FixPedia Team
Применимо к:Android SDK 33+Android Studio Flamingo (2022.2.1)+Gradle 7.0+

Введение / Зачем это нужно

Подписание (signing) — это обязательный этап для любого Android-приложения, которое планируется распространять. Система Android использует цифровую подпись для:

  1. Идентификации автора: Убедиться, что обновления приложения исходят от того же разработчика.
  2. Контроля доступа: Разрешить приложению доступ к защищённым функциям или коду других приложений с той же подписью.
  3. Обновлений: Без совпадения подписи новую версию приложения нельзя установить поверх старой.

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 (рекомендуется для новичков)

  1. В меню выберите Build → Generate Signed Bundle / APK...
  2. В диалоговом окне выберите APK или Android App Bundle (AAB) и нажмите Next.
  3. В разделе Key store path нажмите Create new....
  4. Заполните поля:
    • 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). Это не будет видно пользователям, но требуется формально.
  5. Нажмите 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 или переменные окружения:

  1. В ~/.gradle/gradle.properties (глобально) или project/gradle.properties (локально) добавьте:
    MY_KEYSTORE_PASSWORD=super_secret_pass
    MY_KEY_PASSWORD=super_secret_pass
    
  2. В 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)

  1. Build → Generate Signed Bundle / APK...
  2. Выберите APK или AAB.
  3. На шаге Key store path выберите Choose existing... и укажите ваш my-release-key.jks. Введите пароли.
  4. Выберите release в Build Variant (если не выбран).
  5. Нажмите 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

Проверка результата

  1. Файл существует: Убедитесь, что в указанной папке лежит app-release.apk или app-release.aab.
  2. Подпись валидна: Успешное выполнение команды проверки из Шага 4.
  3. Размер файла: Релизный APK/AAB будет значительно меньше дебажного (из-за сжатия и без отладочной информации).
  4. Публикация в 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 применён к release build type. Проверьте подпись командой jarsigner -verify.

Заключительные рекомендации

  1. Резервное копирование: Сделайте несколько копий файла .jks и сохраните пароли в надёжном менеджере паролей (например, KeePass, Bitwarden). Храните копии в разных физических местах.
  2. Информация о сертификате: Заведите документ с данными вашего сертификата (alias, DN, дата истечения, SHA-1 отпечаток). Это потребуется для некоторых сервисов (например, настройки Google API).
  3. Увеличение versionCode: Перед каждой новой публикацией в Google Play обязательно увеличивайте целочисленное значение versionCode в defaultConfig вашего build.gradle. Без этого Play Console отклонит загрузку.
  4. Тестирование: Устанавливайте сгенерированный релизный APK на физическое устройство перед загрузкой в Play Console, чтобы проверить, что всё работает корректно (включая встроенные лицензии, глубокие ссылки и т.д.).

Следуя этому гайду, вы получите корректно подписанный артефакт, готовый к публикации в любом маркете, включая Google Play.

Часто задаваемые вопросы

Что будет, если потерять keystore для релизного приложения?
Можно ли использовать один keystore для нескольких приложений?
Чем отличается подпись debug от release?
Нужно ли подписывать AAB-файлы (Android App Bundle)?

Полезное

Создание хранилища ключей (keystore)
Настройка signingConfigs в Gradle
Применение конфигурации к сборке release
Генерация релизного APK или AAB