При попытке установить неподписанный 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
Если сборка завершилась ошибкой подписи, проверьте правильность паролей: неверный пароль хранилища и неверный пароль ключа выдают разные сообщения, и по тексту ошибки можно понять, на каком этапе произошёл сбой.
Ручная подпись через 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 Studio | V1 + V2 | Обычная разработка и релизы |
| Командная строка | apksigner | V1, V2, V3 | CI/CD, ручная подпись готового APK |
| Командная строка | jarsigner | Только V1 | Устаревшие сценарии, старые устройства |
| Автоматическая | Gradle (signingConfigs) | V1 + V2 | Регулярные сборки с подписью по умолчанию |
| Облачная | Play App Signing | Управляет Google | Публикация в Google Play |
Для автоматизации удобно описать подпись в файле build.gradle модуля через блок signingConfigs, а пароли вынести в gradle.properties локальной машины или в переменные окружения CI-сервера. Тогда релизная сборка будет подписываться автоматически командой ./gradlew assembleRelease.
Типичные ошибки и их решения
Чаще всего пользователи сталкиваются с сообщением «Приложение не установлено». Возможные причины: 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 — она покажет отпечатки сертификата и данные владельца. Это безопасная операция, она не изменяет файл.