При попытке установить неподписанный APK-файл Android выдаёт ошибку «Приложение не установлено» или «Пакет имеет неверную подпись» — система отклоняет любой пакет без цифровой подписи, даже если само приложение полностью рабочее. Подпись APK — обязательное требование Android: она подтверждает автора приложения и гарантирует, что код не был изменён после сборки.
Подписать APK можно несколькими способами: через официальную утилиту apksigner из Android SDK, классический jarsigner из JDK, средствами Android Studio или сторонними приложениями прямо на смартфоне. Ниже разберём каждый метод пошагово — от создания собственного ключа до проверки готовой подписи.
Зачем нужна подпись APK и как она работает
Цифровая подпись привязывает приложение к его разработчику через ключевую пару: закрытый ключ хранится у автора, открытый встраивается в APK. При установке Android проверяет, что содержимое пакета соответствует сертификату, и отказывает в установке при любом несовпадении.
Также подпись играет ключевую роль при обновлениях. Система разрешит обновить приложение поверх установленного только в том случае, если новая версия подписана тем же ключом, что и старая. Потеряли ключ — потеряли возможность обновлять уже опубликованное приложение: пользователям придётся удалять старую версию и ставить новую с нуля.
- 🔐 Подтверждение авторства — система знает, кто создал приложение.
- 🛡️ Защита от модификации — изменённый APK не пройдёт проверку подписи.
- 🔄 Контроль обновлений — апдейт возможен только с тем же ключом.
- 📦 Требование Google Play — без подписи пакет не принимается в каталог.
Создание ключа подписи (keystore)
Прежде чем подписывать APK, нужен файл-хранилище ключей — keystore. Его создают один раз и используют для всех своих приложений. Стандартный инструмент — утилита keytool, входящая в состав Java JDK.
Откройте командную строку и выполните команду, подставив своё имя файла и псевдоним ключа:
keytool -genkey -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-alias
Утилита последовательно спросит пароль хранилища, ваше имя, организацию и пароль ключа. Запишите эти данные и храните файл my-release-key.jks в надёжном месте с резервной копией.
⚠️ Внимание: потерянный keystore и пароль к нему восстановить невозможно. Без исходного ключа вы не сможете обновлять приложение ни в Google Play, ни на устройствах пользователей. Сделайте минимум две резервные копии файла на разных носителях.
Подпись APK через apksigner
apksigner — официальный инструмент Google, входящий в состав Android SDK Build-Tools. Это рекомендуемый способ: утилита поддерживает современные схемы подписи v2 и v3, которые проверяют пакет целиком, а не пофайлово.
Команда подписи выглядит так:
apksigner sign --ks my-release-key.jks --out app-signed.apk app-unsigned.apk
После ввода пароля утилита создаст подписанный файл app-signed.apk. Если вы собираете приложение самостоятельно, учтите важный нюанс: при использовании zipalign (выравнивание ресурсов для оптимизации) его нужно выполнять до подписи, иначе подпись станет недействительной.
☑️ Проверка перед подписью APK
Альтернативные способы подписи
Если apksigner недоступен, есть другие варианты. Классический jarsigner из JDK создаёт подпись схемы v1 — она совместима со старыми версиями Android, но уязвимее к модификациям пакета:
jarsigner -verbose -keystore my-release-key.jks app.apk my-alias
Разработчики, работающие в Android Studio, могут подписать приложение прямо из интерфейса: меню Build → Generate Signed Bundle / APK, выбор keystore, псевдонима и паролей — среда сама выполнит все шаги, включая выравнивание.
Третий путь — приложения для подписи прямо на смартфоне (например, APK Signer и аналоги). Они удобны для быстрой подписи модифицированных пакетов, но генерируют тестовый ключ, который не подходит для публикации в магазинах приложений.
Сравнение способов подписи
| Способ | Схемы подписи | Для кого подходит | Публикация в Google Play |
|---|---|---|---|
| apksigner | v1, v2, v3 | Продвинутые пользователи, CI-сборка | Да |
| jarsigner | Только v1 | Устаревшие проекты, старые устройства | Ограниченно |
| Android Studio | v1, v2, v3 | Разработчики приложений | Да |
| Приложения на смартфоне | v1 (тестовый ключ) | Локальное тестирование | Нет |
Проверка подписи APK
После подписи обязательно убедитесь, что всё прошло корректно. Для этого у apksigner есть режим верификации:
apksigner verify --verbose --print-certs app-signed.apk
Команда покажет, какими схемами подписан пакет, и выведет данные сертификата: отпечатки SHA-256, срок действия, владельца. Если верификация завершилась без ошибок — APK готов к установке.
Проверить подпись можно и на самом устройстве: установите файл через файловый менеджер. Если система не выдала предупреждений о несовпадении подписи и приложение запустилось — подпись корректна. Ошибка «приложение не установлено» при обновлении обычно означает, что новая версия подписана другим ключом.
⚠️ Внимание: переподписывание чужого APK своим ключом делает невозможным его установку поверх оригинала — система увидит конфликт подписей. Сначала удалите старую версию, но учтите, что данные приложения при этом будут потеряны.
Что такое схемы подписи v1, v2 и v3
v1 (JAR-подпись) — самая старая, проверяет файлы внутри пакета по отдельности. v2 (появилась в Android 7.0) подписывает весь APK целиком, быстрее проверяется и надёжнее защищает от модификации. v3 (Android 9+) добавляет ротацию ключей — возможность сменить ключ без потери обновлений. Современные устройства поддерживают все три схемы одновременно.
Типичные ошибки и их решения
Чаще всего при подписи встречаются три проблемы. Первая — ошибка keystore password was incorrect: неверный пароль хранилища. Проверьте раскладку клавиатуры и регистр, а если пароль утерян — keystore придётся создавать заново.
Вторая — Failed to load signer или ошибки чтения ключа: файл keystore повреждён или путь указан неверно. Убедитесь, что путь не содержит кириллицы и пробелов, либо заключите его в кавычки.
Третья ситуация — APK подписан, но не устанавливается. Возможные причины: конфликт с уже установленной версией, подписанной другим ключом; zipalign выполнен после подписи; либо пакет подписан только схемой v2, а устройство работает на старом Android. В последнем случае добавьте при подписи флаги совместимости:
apksigner sign --ks my-release-key.jks --v1-signing-enabled true --v2-signing-enabled true app.apk
Часто задаваемые вопросы
Можно ли подписать APK без компьютера?
Да, существуют Android-приложения для подписи пакетов прямо на смартфоне. Однако они создают тестовый ключ, который не подходит для публикации в Google Play и обновления уже установленных приложений. Для серьёзной работы используйте apksigner или Android Studio.
Что делать, если потерял keystore?
Восстановить файл невозможно. Если приложение опубликовано в Google Play, можно подключить Play App Signing и через поддержку Google сбросить ключ загрузки. Для приложений, распространяемых напрямую, придётся подписывать новым ключом — пользователям потребуется удалить старую версию перед установкой.
Чем apksigner лучше jarsigner?
apksigner поддерживает современные схемы подписи v2 и v3, которые проверяют пакет целиком и защищают от модификации отдельных файлов. jarsigner создаёт только устаревшую v1-подпись. Google рекомендует именно apksigner для всех новых приложений.
Нужно ли подписывать APK для личного использования?
Да, Android не установит неподписанный пакет в принципе. Но для личных нужд достаточно автоматической debug-подписи, которую Android Studio создаёт при каждой сборке, — отдельный keystore не обязателен.
Можно ли изменить APK после подписи?
Нет. Любое изменение содержимого пакета делает подпись недействительной, и система откажется его устанавливать. После правок APK нужно подписывать заново тем же ключом.