Что означает ошибка INSTALL_PARSE_FAILED_NO_CERTIFICATES
Ошибка INSTALL_PARSE_FAILED_NO_CERTIFICATES появляется при попытке установить APK на устройство или эмулятор Android. Полный текст ошибки в ADB обычно выглядит так:
adb: failed to install app.apk: Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES: Failed collecting certificates for /manifest]
Система не может найти действительные цифровые сертификаты внутри пакета, поэтому отклоняет установку по соображениям безопасности. Ошибка возникает на этапе парсинга манифеста до начала копирования файлов.
Причины возникновения
- APK не был подписан перед сборкой или подпись была удалена после изменения файлов.
- Использован некорректный или повреждённый файл хранилища ключей (keystore).
- Несовпадение алгоритма подписи или дата истечения сертификата.
- Попытка установить APK, собранный без
signingConfigв Gradle. - Ручное редактирование APK (например, через архиватор), после которого файл перестал быть подписан.
Способы решения
Способ 1: Проверить и переподписать APK с помощью apksigner
Убедитесь, что APK подписан, и при необходимости подпишите его заново.
Проверка подписи:
apksigner verify --verbose app.apk
Если проверка не проходит, подпишите APK debug-ключом (по умолчанию в ~/.android/debug.keystore):
apksigner sign --ks ~/.android/debug.keystore \
--ks-key androiddebugkey \
--ks-pass pass:android \
--key-pass pass:android \
--out app-signed.apk \
app.apk
Установите подписанный APK:
adb install app-signed.apk
Способ 2: Пересобрать проект с правильным signingConfig
Если у вас исходный код, убедитесь, что сборка подписывается автоматически.
В app/build.gradle добавьте или проверьте signingConfigs:
android {
signingConfigs {
debug {
storeFile file("debug.keystore")
storePassword "android"
keyAlias "androiddebugkey"
keyPassword "android"
}
release {
storeFile file("release.keystore")
storePassword System.getenv("KEYSTORE_PASSWORD")
keyAlias "release"
keyPassword System.getenv("KEY_PASSWORD")
}
}
buildTypes {
debug {
signingConfig signingConfigs.debug
}
release {
signingConfig signingConfigs.release
minifyEnabled true
proguardFiles getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro"
}
}
}
Выполните очистку и пересборку:
./gradlew clean assembleDebug
Способ 3: Использовать jarsigner для ручной подписи
Если apksigner недоступен, можно подписать APK через jarsigner.
Подпишите APK:
jarsigner -verbose -sigalg SHA256withRSA -digestalg SHA-256 \
-keystore ~/.android/debug.keystore \
app.apk androiddebugkey
Убедитесь, что подпись добавлена:
jarsigner -verify -verbose -certs app.apk
Установите APK:
adb install app.apk
Способ 4: Сгенерировать новый keystore и подписать релиз
Если проблема в повреждённом или просроченном сертификате, создайте новое хранилище.
Сгенерируйте keystore с помощью keytool:
keytool -genkeypair -v \
-keystore release.keystore \
-alias release \
-keyalg RSA \
-keysize 2048 \
-validity 10000 \
-storepass changeit \
-keypass changeit
Подпишите APK:
apksigner sign --ks release.keystore \
--ks-pass pass:changeit \
--key-pass pass:changeit \
--out app-release-signed.apk \
app-release-unsigned.apk
Установите и проверьте:
adb install app-release-signed.apk
apksigner verify --verbose app-release-signed.apk
Профилактика
- Всегда используйте
signingConfigв Gradle для debug и release сборок. - Храните production keystore в безопасном месте и никогда не коммитьте пароли в репозиторий.
- Перед ручным редактированием APK делайте резервную копию и переподписывайте файл после изменений.
- Регулярно проверяйте срок действия сертификатов с помощью
keytool -list -v -keystore your.keystore. - Используйте CI/CD с изолированным доступом к keystore для автоматической подписи релизов.