Как подписать приложение Android: полное руководство

При попытке установить неподписанный APK система Android выдаёт ошибку «Приложение не установлено» или «Ошибка проверки пакета» — причина почти всегда одна: у файла отсутствует цифровая подпись либо она создана неверно. Без подписи APK-файл не установится ни на одно устройство: операционная система отвергает любой пакет, подлинность которого нельзя подтвердить.

Подпись приложения — это криптографическое подтверждение авторства. Она нужна не только для публикации в Google Play, но и для тестовой установки на собственный смартфон, для обновлений поверх уже установленной версии и для проверки целостности сборки. Ниже разберём все рабочие способы: от подписи через Android Studio до ручной работы с утилитами apksigner и jarsigner.

Зачем Android требует подпись приложения

Цифровая подпись решает три задачи. Во-первых, она подтверждает, что приложение создано конкретным разработчиком, а не подделано третьей стороной. Во-вторых, система сверяет подпись при обновлении: новая версия установится поверх старой только в том случае, если обе подписаны одним и тем же ключом. В-третьих, подпись гарантирует, что содержимое APK не изменялось после сборки — любая правка файла делает подпись недействительной.

Начиная с Android 7.0 поддерживается схема подписи APK Signature Scheme v2, которая подписывает файл целиком, а не отдельные записи внутри архива, как старая схема v1 (JAR-подпись). Современные версии Android могут требовать v2 и выше, поэтому для новых проектов рекомендуется использовать именно apksigner, который умеет работать со всеми схемами.

Создание keystore и ключа подписи

Первый шаг — сгенерировать хранилище ключей keystore. Для этого используется утилита keytool, входящая в состав JDK. Откройте терминал или командную строку и выполните команду:

keytool -genkey -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-key-alias

Утилита попросит ввести пароль хранилища, имя, организацию и другие данные — они попадут в сертификат. Параметр -validity 10000 задаёт срок действия ключа в днях; для релизных ключей принято указывать длительный срок, чтобы подпись не истекла раньше жизненного цикла приложения. Параметр -alias — это имя ключа внутри хранилища, оно понадобится при подписи.

  • 🔑 Сохраните файл .jks в надёжном месте и сделайте резервную копию — при утере ключа вы не сможете обновлять опубликованное приложение.
  • 🤐 Не публикуйте keystore и пароли в открытых репозиториях и не добавляйте их в систему контроля версий.
  • 📅 Выбирайте срок действия сертификата с запасом — обычно от 25 лет.
  • 🧾 Запишите alias и пароли отдельно от самого файла хранилища.
⚠️ Внимание: потеря релизного keystore — необратимая проблема. Если приложение уже опубликовано без использования Play App Signing, обновить его новым ключом невозможно — придётся публиковать заново как отдельное приложение с другим именем пакета.

Подпись APK через Android Studio

Самый простой путь для разработчика — встроенный мастер подписи. Вам нужно открыть проект и перейти в меню Build → Generate Signed Bundle / APK. Далее выберите формат APK (или Android App Bundle для публикации в Google Play), укажите путь к keystore, введите пароли и выберите alias ключа.

На следующем шаге мастер предложит выбрать вариант сборки — release — и версии схемы подписи. Для максимальной совместимости отметьте обе: V1 (Jar Signature) и V2 (Full APK Signature). После завершения сборки подписанный файл появится в папке app/release внутри проекта.

☑️ Подпись APK в Android Studio

Выполнено: 0 / 5

Если сборка завершилась ошибкой подписи, проверьте правильность паролей: неверный пароль хранилища и неверный пароль ключа выдают разные сообщения, и по тексту ошибки можно понять, на каком этапе произошёл сбой.

Ручная подпись через apksigner и jarsigner

Когда APK собран, но не подписан (например, получен из CI-системы или от стороннего сборщика), подписать его можно вручную. Современный инструмент — apksigner из состава Android SDK Build-Tools:

apksigner sign --ks my-release-key.jks --out app-signed.apk app-unsigned.apk

После подписи полезно сразу проверить результат командой apksigner verify --verbose app-signed.apk — она покажет, какие схемы подписи применены и валиден ли сертификат. Это надёжный способ убедиться, что файл готов к установке.

Устаревшая альтернатива — jarsigner из JDK. Она создаёт только подпись схемы v1, поэтому подходит лишь для старых устройств:

jarsigner -verbose -keystore my-release-key.jks app.apk my-key-alias

Если вы подписываете через jarsigner, перед подписью APK нужно выровнять утилитой zipalign. При работе с apksigner порядок обратный: сначала zipalign, затем подпись — потому что v2-подпись фиксирует структуру всего файла, и любое выравнивание после подписи её испортит.

Сравнение способов подписи

Выбор инструмента зависит от задачи: разработка, ручная сборка или публикация. Таблица ниже поможет сориентироваться.

СпособИнструментСхемы подписиКогда использовать
Мастер подписиAndroid StudioV1 + V2Обычная разработка и релизы
Командная строкаapksignerV1, V2, V3CI/CD, ручная подпись готового APK
Командная строкаjarsignerТолько V1Устаревшие сценарии, старые устройства
АвтоматическаяGradle (signingConfigs)V1 + V2Регулярные сборки с подписью по умолчанию
ОблачнаяPlay App SigningУправляет GoogleПубликация в Google Play

Для автоматизации удобно описать подпись в файле build.gradle модуля через блок signingConfigs, а пароли вынести в gradle.properties локальной машины или в переменные окружения CI-сервера. Тогда релизная сборка будет подписываться автоматически командой ./gradlew assembleRelease.

📊 Каким способом вы подписываете APK?
Через Android Studio
Через apksigner в командной строке
Через Gradle signingConfigs
Использую Play App Signing

Типичные ошибки и их решения

Чаще всего пользователи сталкиваются с сообщением «Приложение не установлено». Возможные причины: APK не подписан вовсе, подписан только устаревшей схемой v1 на устройстве, где требуется v2, либо на смартфоне уже стоит версия, подписанная другим ключом. В последнем случае нужно удалить старую версию (данные приложения будут потеряны) и установить новую.

  • 🛠 Ошибка INSTALL_PARSE_FAILED_NO_CERTIFICATES — APK не подписан; подпишите его через apksigner.
  • 🔄 Ошибка INSTALL_FAILED_UPDATE_INCOMPATIBLE — конфликт подписей; удалите прежнюю версию приложения.
  • 🧩 Сбой проверки v2-подписи — файл изменялся после подписи; пересоберите и подпишите заново.
  • 📦 jarsigner ругается на alias — проверьте имя ключа командой keytool -list -keystore файл.jks.
⚠️ Внимание: не подписывайте релизные сборки debug-ключом, который Android Studio создаёт автоматически. Отладочный сертификат предназначен только для тестирования, его нельзя использовать для публикации и распространения приложения.
Что такое Play App Signing

Это сервис Google Play, при котором вы загружаете приложение, подписанное upload-ключом, а финальную подпись для пользователей Google накладывает своим ключом. При утере upload-ключа его можно сбросить через поддержку, не теряя возможность обновлять приложение.

Проверка подписи готового APK

Перед распространением файла убедитесь, что подпись корректна. Команда apksigner verify --print-certs app.apk выведет отпечатки сертификата — сверьте их с эталонными значениями вашего keystore. Совпадение отпечатка SHA-256 означает, что подписан именно ваш ключ.

Дополнительно можно установить APK на тестовое устройство через adb install app-signed.apk: если установка прошла без ошибок, подпись принята системой. При неудаче adb вернёт код ошибки, по которому легко определить причину — конфликт подписей, отсутствие сертификата или несовместимость версии.

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

Можно ли подписать APK без Android Studio?

Да. Достаточно установить JDK (для keytool) и Android SDK Build-Tools (для apksigner и zipalign). Все операции выполняются в командной строке, сама среда разработки не нужна.

Что делать, если потерян файл keystore?

Если приложение опубликовано через Play App Signing, можно запросить сброс upload-ключа через поддержку Google Play. Если подпись выполнялась только вашим ключом без Play App Signing, восстановить возможность обновлений нельзя — придётся публиковать приложение заново с новым именем пакета.

Чем отличается debug-подпись от release-подписи?

Debug-ключ генерируется автоматически и используется для тестов во время разработки. Release-ключ вы создаёте сами через keytool, он подтверждает авторство и обязателен для публикации и распространения приложения.

Нужно ли подписывать AAB для Google Play?

Да, Android App Bundle тоже подписывается вашим ключом (upload-ключом) при загрузке. Финальные APK для устройств пользователей Google подписывает сам в рамках Play App Signing.

Как узнать, каким ключом подписан чужой APK?

Выполните команду apksigner verify --print-certs файл.apk — она покажет отпечатки сертификата и данные владельца. Это безопасная операция, она не изменяет файл.