Что такое ошибка INSTALL_PARSE_FAILED_NO_CERTIFICATES? - PullRequest
121 голосов
/ 26 мая 2010

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

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

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

Ответы [ 19 ]

149 голосов
/ 29 марта 2017

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

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

enter image description here

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

52 голосов
/ 10 апреля 2012

Я обнаружил, что это было вызвано моей версией 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}" />
47 голосов
/ 26 мая 2010

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

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

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

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

16 голосов
/ 10 апреля 2013

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

  1. Удалите ваш apk
  2. Очистите ваш проект Android
  3. Создайте свой проект Android
  4. Установите / запустите ваш apk
16 голосов
/ 21 августа 2012

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

-sigalg MD5withRSA -keyalg RSA -keysize 1024

и использование в jarsigner

-sigalg MD5withRSA -digestalg SHA1

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

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

5 голосов
/ 30 мая 2013

В моем случае я мог собирать и запускать релизные сборки, но получил ошибку 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
  • Подразделение: Android
  • Название организации: Неизвестно
  • Город или населенный пункт: Неизвестный
  • Штат или провинция: Неизвестно
  • Код страны: US
5 голосов
/ 11 мая 2012

Это уродливое, но быстрое решение: используйте 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, вероятно, является хорошим решением.

4 голосов
/ 31 марта 2017

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

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

3 голосов
/ 22 мая 2019

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

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

2 голосов
/ 02 ноября 2013

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

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