Что такое ошибка INSTALL_PARSE_FAILED_NO_CERTIFICATES?

163

Я пытался изменить активность по умолчанию / main / startup (как бы вы это ни называли), отредактировав androidmanifest.xmlфайл. Все, что я сделал, это сменил android:nameсобственность. однако, это полностью сломало все приложение. когда я пытаюсь установить это не удается и читает.

Ошибка установки: INSTALL_PARSE_FAILED_NO_CERTIFICATES

Когда я пытался вернуть его в прежнее состояние, он все еще давал мне ту же ошибку ... Что я сделал?

mtmurdock
источник
Для всех остальных: INSTALL_PARSE_FAILED_NO_CERTIFICATESошибка, -103которую вы можете получить / увидеть через adb log( src ), например. D/PackageInstaller(21320): Installation error code: -103
Ответ верен. И есть еще одна причина, по которой эта ошибка возникает, когда на вашем телефоне установлено старое приложение с тем же именем пакета. Просто удалите его с телефона перед установкой нового
Emre Kilinc Arslan
2
Всем, кто сталкивается с этим вопросом - прочитайте все ответы ниже! Похоже, что это сообщение об ошибке больше похоже на «что-то не так». Причина, по которой я столкнулся с этим, была из-за одного из ответов: вниз по списку !!!!
GMc

Ответы:

56

Вы редактировали AndroidManifest.xmlпрямо в .apkфайле? Если так, это не сработает.

Каждый Android .apkдолжен быть подписан, если он будет установлен на телефоне , даже если вы не устанавливаете через Маркет. Инструменты разработки работают вокруг этого путем подписания с сертификатом разработки, но .apkон все еще подписан.

Одно из применений этого заключается в том, что устройство может определить, .apkявляется ли обновление действующим для установленного приложения, поскольку если это так, сертификаты будут такими же.

Поэтому, если вы внесете какие-либо изменения в свое приложение, вам нужно будет перестроить его, .apkчтобы оно было подписано должным образом.

Дэйв Уэбб
источник
большое спасибо, есть кнопка для автоматического восстановления манифеста?
mtmurdock
Для парней, борющихся с флаттером, бегите flutter cleanи снова запускайте / отлаживайте! Эта операция аналогична приведенному выше решению, поскольку она очищает папку сборки и заново собирает файл сборки при запуске / отладке!
Манодж Кумар
183

Я обнаружил, что эта ошибка теперь также может возникать при использовании неправильной конфигурации подписи. Как описано здесь , Android 7.0 представляет новую схему подписи, V2 . Схема V2 подписывает весь APK, а не только JAR, как это делается в схеме V1. Если вы подписываетесь только с V2 и пытаетесь установить на цели до 7.0, вы получите эту ошибку, так как сами JAR-файлы не подписаны, а PackageManager до 7.0 не может обнаружить присутствие подписи APK V2.

Чтобы быть совместимым со всеми целевыми системами, убедитесь, что APK подписан обеими схемами, отметив оба поля версии подписи в диалоговом окне « Создать подписанный APK» в Android Studio, как показано здесь:

введите описание изображения здесь

Если ожидается только 7.0 целей, нет необходимости включать подпись V1.

Пол Ратацци
источник
5
Вы сэкономили мне много времени. Обновление Android Studio вызвало множество неприятностей. Это был один из них. Интересно, если бы не было SO, больше половины разработчиков Android погибло бы. Android Studio не дает никаких подсказок об ошибках.
Атул
4
К счастью, я протестировал мой релиз apk на старом устройстве, прежде чем развернуть его в Google Play. Это было бы катастрофой, если бы все <Android 7.0 устройства не смогли установить новую версию. Эта вещь с двумя версиями должна быть БОЛЬШОЙ RED POP UP DIALOG, когда вы нажимаете, чтобы создать релиз apk!
Кирилл Кармазин
Спасибо за это. Собираюсь сходить с ума, ища, почему мой APK не будет работать на Android 7 ниже, но это был просто флажок. Так раздражает.
Япония
54

Я обнаружил, что это было вызвано моей версией JDK.

У меня была эта проблема с 'муравьем', и это было из-за этого ВНИМАНИЯ, упомянутого в документации:

http://developer.android.com/guide/publishing/app-signing.html#signapp

Предостережение: Начиная с JDK 7, алгоритм подписи по умолчанию изменился, и вам потребуется указывать алгоритмы подписи и дайджеста (-sigalg и -digestalg) при подписании APK.

У меня есть JDK 7. В моем журнале Ant я использовал -v для многословия, и он показал

$ ant -Dadb.device.arg=-d -v release install
[signjar] Executing 'C:\Program Files\Java\jdk1.7.0_03\bin\jarsigner.exe' with arguments:
[signjar] '-keystore'
[signjar] 'C:\cygwin\home\Chloe\pairfinder\release.keystore'
[signjar] '-signedjar'
[signjar] 'C:\cygwin\home\Chloe\pairfinder\bin\PairFinder-release-unaligned.apk'
[signjar] 'C:\cygwin\home\Chloe\pairfinder\bin\PairFinder-release-unsigned.apk'
[signjar] 'mykey'
 [exec]     pkg: /data/local/tmp/PairFinder-release.apk
 [exec] Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]

Я подписал JAR вручную и zipaligned его, но это дало немного другую ошибку:

$ "$JAVA_HOME"/bin/jarsigner -sigalg MD5withRSA -digestalg SHA1 -keystore release.keystore -signedjar bin/PairFinder-release-unaligned.apk bin/PairFinder-release-unsigned.apk mykey
$ zipalign -v -f 4 bin/PairFinder-release-unaligned.apk bin/PairFinder-release.apk
$ adb -d install -r bin/PairFinder-release.apk
        pkg: /data/local/tmp/PairFinder-release.apk
Failure [INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES]
641 KB/s (52620 bytes in 0.080s)

Я нашел, что ответил здесь.

Как бороться с INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES без удаления

Мне нужно было только удалить его, и тогда это сработало!

$ adb -d uninstall com.kizbit.pairfinder
Success
$ adb -d install -r bin/PairFinder-release.apk
        pkg: /data/local/tmp/PairFinder-release.apk
Success
641 KB/s (52620 bytes in 0.080s)

Теперь мне нужно только изменить build.xml, чтобы использовать эти параметры при подписании!

Хорошо, вот оно: C: \ Program Files \ Java \ android-sdk \ tools \ ant \ build.xml

            <signjar
                    sigalg="MD5withRSA"
                    digestalg="SHA1"
                    jar="${out.packaged.file}"
                    signedjar="${out.unaligned.file}"
                    keystore="${key.store}"
                    storepass="${key.store.password}"
                    alias="${key.alias}"
                    keypass="${key.alias.password}"
                    verbose="${verbose}" />
Хлоя
источник
3
JDK 7 также была моей проблемой. Я был ленив и удалил JDK 7 и установил JDK 6, также работал ^^. Другое решение взлома, но менее радикальное, можно было бы разрешить обоим установить, но установить JAVA_HOME в JDK 6 и поместить путь к корзине JDK 6 первым в PATH.
Ixx
1
JDK 8 имеет ту же проблему. Смена PATH на JDK 6 сработала. Спасибо, спасатель!
Крис Сюэ
Спасибо! Мое рыночное приложение было скомпилировано с JDK6. Когда я скомпилировал приложение с хранилищем ключей релиза, используя JDK7, и попытался установить, это вызвало у меня эту проблему.
Sileria
28

В большинстве случаев решение этой ошибки действительно простое:

  1. Удалите ваш apk
  2. Очистите свой проект Android
  3. Создайте свой проект Android
  4. Установите / запустите ваш apk
JanCor
источник
Я сделал 2,3,4 и получаю ту же ошибку. Что вы подразумеваете под удалением вашего apk? С моего устройства? Я не думаю, что это когда-либо было на моем устройстве.
Кертис
я внезапно начал получать эту ошибку из ничего, Нет, если решение, но просто очистка проекта сработало. Спасибо.
pgcan
18

решил (для меня) использование в keytool аргументов

-sigalg MD5withRSA -keyalg RSA -keysize 1024

и использовать в jarsigner

-sigalg MD5withRSA -digestalg SHA1

решение найдено в

Какие питфалы существуют для подписания Android APK?

Алехадро Халабардер
источник
Спасибо, исправил проблему для меня тоже (у меня есть JDK 7).
Энрико Рос
Я исправил это так же, так как я использую appcelerator titanium и не имею доступа к сценарию генерации apk. Обратите внимание, что это решение требует регенерации (изменения!) Закрытого ключа.
Федерико
8

Я также столкнулся с той же проблемой. Сначала я сгенерировал сборку с использованием V2 и установил ее на мобильных устройствах под управлением ОС 5.1, и у меня возникла та же проблема. Но сборка работала нормально на планшете под управлением ОС 7.0. Поэтому я сгенерировал сборку с подписью V1 Jar, и она отлично работала на обоих устройствах.

Вывод: если вы поддерживаете устройство ниже Android OS 7.0. Используйте V1 JAR подпись для генерации сборки.

Раджив Ранджан
источник
Не нужно проверять оба, выберите V1, если вы поддерживаете OS 7.0 и ниже. Проверьте V2, если вы поддерживаете устройства, работающие на 7.0 и выше.
Раджив Ранджан
7

В моем случае я мог собирать и запускать релизные сборки, но получил INSTALL_PARSE_FAILED_NO_CERTIFICATESошибку при попытке сделать отладочную сборку.

Решением было удалить мой debug.keystoreфайл и позволить ADT восстановить его. Это очевидно истекло.

Лучшим долгосрочным решением является явное создание debug.keystoreобъекта, срок действия которого не истекает через год, вместо того, чтобы позволить ADT его создавать. Вот команда, чтобы сделать это:

keytool -genkey -v -keystore debug.keystore -alias androiddebugkey -storepass android -keypass android -keyalg RSA -validity 14000

При появлении запроса введите следующие значения:

  • Имя и фамилия: Android Debug
  • Организационное подразделение: Android
  • Наименование организации: Неизвестно
  • Город или местность: неизвестно
  • Штат или провинция: неизвестно
  • Код страны: США
Кристофер Джонсон
источник
5

Это уродливое, но быстрое решение: используйте JDK 6 вместо 7.

Прочитав ответ Хлои, я удалил свой JDK 7 (он сейчас не нужен) и установил JDK 6. Это исправило его. Лучшим решением было бы использование ant JDK 6 (без удаления 7). Возможно возможное изменение / настройка этого свойства:

java.library.path

в файле local.properties. Он находится в каталоге проекта (root).

Android в любом случае не работает с JDK 7 (только 6 или 5), поэтому хорошее решение - это то, что сценарий ant также использует JDK 6 или 5.

Ixx
источник
5

Это потому, что ранее сгенерированная сборка и текущая имеют конфликт в версии подписи между v1 (подпись jar) и v2 (полная подпись APK),

Чтобы установить правильную версию подписи в диалоге Generate Signed APK

Панкай кумар
источник
5

Недавно у меня была эта ошибка при обновлении до Android Studio 4.0. Причиной было то, что в проекте была отключена подпись V2 в конфигурации подписи build.gradle.

Решением было удалить v2SigningEnabled falseили явно установить его true, что является значением по умолчанию.

android {    
    signingConfigs {
        dev {
            v2SigningEnabled true
        }
     }
}
mikehc
источник
Я использую Android Studio 4.0. Но в моем файле build.gradle нет такой вещи, как v2SigningEnabled. Затем, что мне делать?
Нуван Харшакумара Пияратна
3

В более поздних версиях Android Studio 3.2+, если вы пытаетесь запустить releaseустановку, и вы не определили какие-либо конфигурации подписи, будет отображаться сообщение об ошибке, и при установке произойдет сбой. Вам нужно либо запустить debugсборку, либо правильно настроить конфигурацию подписи (V1 или V2).

Роуленд Мтетези
источник
3

большинство ответов верны. и некоторые другие причины, которые происходят, являются

► ваш мин SDK меньше, чем устройство SDK.
► на вашем устройстве установлено старое приложение с тем же именем пакета

Эмре Килинк Арслан
источник
Это был мой опыт - min sdk в моем проекте был выше, чем устройство sdk. Это произошло потому, что я «пропустил» правильный выбор при создании проекта в Android Studio и случайно выбрал следующую более высокую версию в качестве моего SDK, чем мой старый планшет.
GMc
Приравнивая мои мин SDK и устройство SDK решили мою проблему.
Нуван Харшакумара Пияратна
2

Это может произойти, если вы попытаетесь включить .jarбиблиотеку, которая содержит AndroidManifest.xml файл.

  • Если это чистая Java, убедитесь, что вы не включили ее в экспорт .jar
  • Если это не чистая Java (имеется в виду проект Android), тогда вы должны включить его как библиотечный проект
znat
источник
2

Также вы можете проверить

Project Structure-> Default Config->Signing Config

после того, как вы добавите все, что вам нужно

Морозов
источник
1

Установка переменной среды JAVA_HOMEв JDK 5 или 6 (вместо JDK 7) исправила ошибку.

Тонна
источник
0

Через некоторое время и многочисленные онлайн-темы на эту тему мне удалось исправить свой проект.

Это в основном принимает во внимание последние файлы ( могут быть изображения или макеты ), которые вы вставили. Если вы удалите их, это сработает, и вы сможете построить свой проект снова.

Нельсон Р.
источник
0

У меня была эта ошибка в моей консоли Eclipse. Оказывается, у меня было две банки с одинаковым содержанием, но разными именами, и они конфликтовали друг с другом. Я просто удалил один из них и сумел установить приложение на устройство.

joao2fast4u
источник
0

Я получал эту ошибку, потому что я выпустил, что мой ant releaseсбой, потому что у меня не хватило места на диске.

Красный крикет
источник
0

Я получил эту ошибку, когда попытался установить проект Xamarin, созданный на основе предварительного просмотра Android N, на телефон под управлением api v23. Решение - не делать этого.

Джеймс Мур
источник
0

Другой способ получить эту ошибку - это создать с помощью antMacOS и иметь файл значка Finder ( Icon\r) в дереве исходного кода приложения. Похоже, он jarsignerне может справиться с возвратом каретки в имени файла и, хотя он будет утверждать, что подпись действительна, если вы-verify APK, он всегда приводит к APK, который не устанавливается на устройстве. По иронии судьбы плагин Google Drive Finder является отличным источником файлов значков Finder.

Решение состоит в том, чтобы исключить файлы-нарушители (которые в любом случае бесполезны в APK) с помощью спецификатора, подобного следующему fileset:

    <exclude name="**/Icon&#13;" />
грушевый сидр
источник
0

Эта проблема произойдет, если вы устанавливаете неподписанную версию APK. Проверьте, правильно ли вы установили APK.

NEEK
источник
0

У меня была эта проблема с ионным кодом / кодом Visual Studio (запустить Android на устройстве):

Я удалил приложение на мобильном устройстве («Настройки» / «Приложения»), ошибка исчезла и приложение запускается.

Майкл Майер
источник
0

Это выдает эту ошибку для меня сегодня, потому что у меня есть приложение с минимальной SDK 28 и я запускаю игру на эмуляторе с SDK-версией 23. Обычно это невозможно (А.С. Грей выключил кнопку воспроизведения), но сегодня не так много.

Дэниел Уилсон
источник
0

Сначала попробуйте сделать это:

  • перейдите в скрипт Gradle → bulid.gradle (module: app) → затем вам нужно изменить (minSdkVersion) значение. Например, если вы использовали 26, вы можете попытаться уменьшить значение, например (minSdkVersion 20)
  • затем попробуйте (синхронизировать сейчас).
Инженер Ахмед ИТ
источник
0

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

Шашанк Пандей
источник