Co to jest błąd INSTALL_PARSE_FAILED_NO_CERTIFICATES?

163

Próbowałem zmienić moją domyślną / główną / startową (jakkolwiek to nazwiesz) aktywność, edytując androidmanifest.xmlplik. Zmieniłem tylko android:namenieruchomość. Jednak to całkowicie zepsuło całą aplikację. kiedy próbuję zainstalować, kończy się niepowodzeniem i czyta.

Błąd instalacji: INSTALL_PARSE_FAILED_NO_CERTIFICATES

Kiedy próbowałem przywrócić go do poprzedniego stanu, nadal wyświetlał ten sam błąd ... Co ja zrobiłem?

mtmurdock
źródło
Dla kogokolwiek innego: INSTALL_PARSE_FAILED_NO_CERTIFICATESjest to błąd -103, który można uzyskać / zobaczyć przez adb log( src ) np. D/PackageInstaller(21320): Installation error code: -103
odpowiedź jest prawdą. i jest jeszcze jeden powód, dla którego ten błąd jest spowodowany tym, że masz zainstalowaną starą aplikację z tą samą nazwą pakietu w telefonie ... po prostu odinstaluj z telefonu przed zainstalowaniem nowego
Emre Kilinc Arslan
1
Każdemu, kto natknie się na to pytanie - przeczytaj wszystkie odpowiedzi poniżej! Wygląda na to, że ten komunikat o błędzie jest raczej błędem typu „coś jest nie tak”. Powodem, dla którego go spotkałem, była jedna z odpowiedzi, daleko na liście !!!!
GMc

Odpowiedzi:

56

Czy edytowałeś AndroidManifest.xmlbezpośrednio w .apkpliku? Jeśli tak, to nie zadziała.

Każdy Android .apkmusi być podpisany, jeśli ma zostać zainstalowany na telefonie , nawet jeśli nie instalujesz za pośrednictwem Market. Narzędzia programistyczne obejdą ten problem, podpisując certyfikat programistyczny, ale .apknadal jest podpisany.

Jednym z zastosowań tego jest to, aby urządzenie mogło stwierdzić, czy .apkjest to ważne uaktualnienie dla zainstalowanej aplikacji, ponieważ jeśli to jest, certyfikaty będą takie same.

Jeśli więc wprowadzisz jakiekolwiek zmiany w swojej aplikacji, musisz ją odbudować, .apkaby została poprawnie podpisana.

Dave Webb
źródło
wielkie dzięki, czy jest przycisk do automatycznego odbudowywania manifestu?
mtmurdock
Dla facetów zmagających się z trzepotaniem, uruchom ponownie flutter cleani uruchom / debuguj! Ta operacja jest podobna do powyższego rozwiązania, ponieważ czyści folder kompilacji i ponownie kompiluje plik kompilacji podczas uruchamiania / debugowania!
Manoj Kumar
183

Zauważyłem, że ten błąd może teraz wystąpić również podczas korzystania z niewłaściwej konfiguracji podpisywania. Jak opisano tutaj , Android 7.0 wprowadza nowy schemat podpisu, V2 . Schemat V2 podpisuje cały plik APK, a nie tylko plik JAR, jak ma to miejsce w schemacie V1. Jeśli podpiszesz się tylko przy użyciu wersji 2 i spróbujesz zainstalować w miejscu docelowym w wersji starszej niż 7.0, pojawi się ten błąd, ponieważ same pliki JAR nie są podpisane, a PackageManager w wersji wcześniejszej niż 7.0 nie może wykryć obecności podpisu APK w wersji 2.

Aby zachować zgodność ze wszystkimi systemami docelowymi, upewnij się, że plik APK jest podpisany przy użyciu obu schematów, zaznaczając oba pola wersji podpisu w oknie dialogowym Generuj podpisany plik APK w Android Studio, jak pokazano tutaj:

wprowadź opis obrazu tutaj

Jeśli przewiduje się tylko cele 7.0, nie ma potrzeby dołączania sygnatury V1.

Paul Ratazzi
źródło
5
Zaoszczędziłeś mi dużo czasu. Aktualizacja Android Studio spowodowała koszmar kłopotów. To był jeden z nich. Zastanawiam się, że gdyby SO nie było w pobliżu, więcej niż połowa rozwoju Androida zginęłaby. Android Studio nie daje żadnych wskazówek dotyczących błędów.
Atul
4
Na szczęście przetestowałem wersję APK na starym urządzeniu, zanim wdrożyłem ją w Google Play. To byłaby katastrofa, gdyby wszystkie urządzenia <Android 7.0 nie mogły zainstalować nowej wersji. Ta rzecz z dwiema wersjami powinna być WIELKIM CZERWONYM WYŚWIETLANYM DIALOGEM po kliknięciu, aby utworzyć wydanie apk!
Kirill Karmazin,
Dzięki za to. Zaraz zwariowałem, szukając powodu, dla którego mój pakiet APK nie działałby pod Androidem 7, ale było to tylko proste pole wyboru. Tak denerwujące.
japzone
54

Odkryłem, że jest to spowodowane moją wersją JDK.

Miałem ten problem z 'ant' i wynikało to z tego OSTRZEŻENIA wymienionego w dokumentacji:

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

Przestroga: od wersji JDK 7 zmienił się domyślny algorytm podpisywania, co wymaga określenia algorytmów podpisu i skrótu (-sigalg i -digestalg) podczas podpisywania pliku APK.

Mam JDK 7. W moim dzienniku Ant, użyłem -v do określenia gadatliwości i to pokazało

$ 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]

Podpisałem JAR ręcznie i wyrównałem go zipem, ale dał trochę inny błąd:

$ "$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)

Znalazłem odpowiedź tutaj.

Jak radzić sobie z INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES bez odinstalowywania

Musiałem go tylko odinstalować, a potem zadziałało!

$ 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)

Teraz muszę tylko zmodyfikować plik build.xml, aby używać tych opcji podczas podpisywania!

OK, oto jest: 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}" />
Chloe
źródło
3
JDK 7 też był moim problemem. Byłem leniwy i odinstalowałem JDK 7 i zainstalowałem JDK 6, również działało ^^. Inne rozwiązanie hakerskie, ale mniej radykalne, może zostać zainstalowane, ale ustaw JAVA_HOME na JDK 6 i umieść ścieżkę bin JDK 6 jako pierwszą w PATH.
Ixx
1
JDK 8 ma ten sam problem. Zmiana PATH na JDK 6 zadziałała. Dziękuję ratowniku!
Chris Xue
Dzięki! Moja aplikacja Market została skompilowana z JDK6. Kiedy skompilowałem aplikację z magazynem kluczy wydania przy użyciu JDK7 i próbowałem zainstalować, pojawił się ten problem.
Sileria
28

W większości przypadków rozwiązanie tego błędu jest naprawdę proste:

  1. Odinstaluj swój apk
  2. Wyczyść swój projekt Androida
  3. Zbuduj swój projekt na Androida
  4. Zainstaluj / uruchom swój apk
JanCor
źródło
Zrobiłem 2, 3, 4 i otrzymałem ten sam błąd. Co masz na myśli, mówiąc o odinstalowaniu apk? Z mojego urządzenia? Nie sądzę, żeby kiedykolwiek było na moim urządzeniu.
Curtis
nagle zacząłem otrzymywać ten błąd z niczego, Brak, jeśli rozwiązanie, ale po prostu projekt czyszczenia zadziałało. Dzięki.
pgcan
18

rozwiązany (dla mnie) używając w keytool argumentów

-sigalg MD5withRSA -keyalg RSA -keysize 1024

i używając w jarsigner

-sigalg MD5withRSA -digestalg SHA1

rozwiązanie znalezione w

Jakie pułapki występują w przypadku podpisywania plików APK na Androida?

Alejadro Xalabarder
źródło
Dzięki, dla mnie też rozwiązałem problem (mam JDK 7).
Enrico Ros
Naprawiłem to w ten sam sposób, ponieważ używam tytanu appcelerator i nie mam dostępu do skryptu generowania apk. Zwróć uwagę, że to rozwiązanie wymaga regeneracji (zmiany!) Klucza prywatnego.
Federico,
8

Miałem również do czynienia z tym samym problemem. Najpierw wygenerowałem kompilację przy użyciu V2 i zainstalowałem ją na urządzeniach mobilnych z systemem OS 5.1 i mam ten sam problem. Ale kompilacja działała dobrze na tablecie z systemem operacyjnym 7.0. Wygenerowałem więc kompilację z sygnaturą V1 Jar i działała dobrze na obu urządzeniach.

Wniosek: jeśli obsługujesz urządzenie poniżej systemu operacyjnego Android 7.0. Użyj sygnatury jar V1, aby wygenerować kompilację.

Rajiv Ranjan
źródło
Nie musisz sprawdzać obu, wybierz V1, jeśli obsługujesz OS 7.0 i starsze Sprawdź V2, jeśli obsługujesz urządzenia z systemem 7.0 i nowszym.
Rajiv Ranjan
7

W moim przypadku mogłem budować i uruchamiać kompilacje wydania, ale pojawił się INSTALL_PARSE_FAILED_NO_CERTIFICATESbłąd podczas próby wykonania kompilacji debugowania.

Rozwiązaniem było usunięcie mojego debug.keystorepliku i umożliwienie ADT odtworzenia go. Najwyraźniej wygasł.

Lepszym długoterminowym rozwiązaniem jest jawne utworzenie, debug.keystorektóre nie wygasa po zaledwie roku, zamiast pozwolić ADT na jego utworzenie. Oto polecenie, aby to zrobić:

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

Po wyświetleniu monitu wprowadź następujące wartości:

  • Imię i nazwisko: debugowanie Androida
  • Jednostka organizacyjna: Android
  • Nazwa organizacji: nieznana
  • Miasto lub miejscowość: nieznane
  • Stan lub prowincja: nieznana
  • Kod kraju: USA
Kristopher Johnson
źródło
5

To brzydkie, ale szybkie rozwiązanie: użyj JDK 6 zamiast 7.

Po przeczytaniu odpowiedzi Chloe odinstalowałem JDK 7 (i tak go obecnie nie potrzebuję) i zainstalowałem JDK 6. To naprawiło problem. Lepszym rozwiązaniem byłoby użycie przez Ant JDK 6 (bez odinstalowywania 7). Może możliwa zmiana / ustawienie tej właściwości:

java.library.path

w pliku local.properties. Znajduje się w katalogu projektu (root).

Android i tak nie działa z JDK 7 (tylko 6 lub 5), więc spraw, aby skrypt Ant również używał JDK 6 lub 5, to prawdopodobnie dobre rozwiązanie.

Ixx
źródło
5

Jest to spowodowane tym, że poprzednio wygenerowana kompilacja i bieżąca ma konflikt w wersji podpisu między v1 (podpis jar) a v2 (pełny podpis APK),

Aby naprawić zaznacz odpowiednią wersję podpisu w oknie dialogowym Generuj podpisany plik APK

Pankaj kumar
źródło
4

Ostatnio miałem ten błąd podczas aktualizacji do Android Studio 4.0. Przyczyną było to, że projekt miał wyłączone podpisywanie V2 w konfiguracji logowania build.gradle.

Rozwiązaniem było usunięcie v2SigningEnabled falselub jawne ustawienie tego na true, co jest wartością domyślną.

android {    
    signingConfigs {
        dev {
            v2SigningEnabled true
        }
     }
}
mikehc
źródło
Używam Android Studio 4.0. Ale w moim pliku build.gradle nie ma czegoś takiego jak „v2SigningEnabled”. W takim razie co mam zrobić?
Nuwan Harshakumara Piyarathna
3

W nowszych wersjach Android Studio 3.2+, jeśli próbujesz uruchomić releaseinstalację i nie zdefiniowałeś żadnych konfiguracji podpisywania, wyświetli się monit o błąd, a instalacja zakończy się niepowodzeniem. Musisz albo uruchomić debugkompilację, albo poprawnie skonfigurować konfigurację podpisywania (V1 lub V2).

Rowland Mtetezi
źródło
3

większość odpowiedzi jest prawdziwa. i kilka innych powodów, które się zdarzają

► twój min sdk mniejszy niż sdk urządzenia.
► masz na swoim urządzeniu starszą aplikację o tej samej nazwie pakietu

Emre Kilinc Arslan
źródło
Takie było moje doświadczenie - min sdk w moim projekcie był wyższy niż sdk urządzenia. Stało się tak, ponieważ „przegapiłem” właściwy wybór, kiedy tworzyłem projekt w Android Studio i przypadkowo wybrałem następną wyższą wersję jako mój zestaw SDK, niż mój stary tablet.
GMc
zrównanie mojego min sdk i urządzenia sdk rozwiązało mój problem.
Nuwan Harshakumara Piyarathna
2

Może się to zdarzyć, jeśli spróbujesz dołączyć .jarbibliotekę zawierającą AndroidManifest.xmlplik.

  • Jeśli jest to czysta Java, upewnij się, że nie uwzględniasz jej w eksporcie .jar
  • Jeśli nie jest to czysta Java (co oznacza, że ​​jest to projekt na Androida), musisz dołączyć ją jako projekt biblioteczny
znat
źródło
2

Możesz też sprawdzić

Project Structure-> Default Config->Signing Config

po dodaniu wszystkiego, czego potrzebujesz

Morozov
źródło
1

Ustawienie zmiennej środowiskowej JAVA_HOMEna JDK 5 lub 6 (zamiast JDK 7) naprawiło błąd.

TN.
źródło
0

Po pewnym czasie i wielu wątkach online na ten temat udało mi się naprawić swój projekt.

Jest to głównie brane pod uwagę ostatnie pliki ( mogą to być obrazy lub układy ), które umieściłeś. Jeśli je usuniesz, wszystko się ułoży i będziesz mógł ponownie zbudować projekt.

Nelson R.
źródło
0

Miałem ten błąd w mojej Konsoli Eclipse. Okazuje się, że miałem dwa słoiki z tą samą zawartością, ale różnymi nazwami i kolidowały ze sobą. Właśnie usunąłem jeden z nich i udało mi się zainstalować aplikację na urządzeniu.

joao2fast4u
źródło
0

Otrzymałem ten błąd, ponieważ opublikowałem informację, że moja ant releaseawaria jest spowodowana brakiem miejsca na dysku.

Red Cricket
źródło
0

Wystąpił ten błąd, gdy próbowałem zainstalować projekt Xamarin utworzony dla wersji zapoznawczej systemu Android N na telefonie z interfejsem API w wersji 23. Rozwiązaniem jest tego nie robić.

James Moore
źródło
0

Innym sposobem uzyskania tego błędu jest kompilacja antw systemie macOS i umieszczenie pliku ikony Findera ( Icon\r) w drzewie źródłowym aplikacji. Wygląda na jarsignerto, że nie radzi sobie ze znakiem powrotu karetki w nazwie pliku i chociaż będzie twierdził, że podpis jest ważny, jeśli ty-verify APK, zawsze powoduje, że plik APK nie zostanie zainstalowany na urządzeniu. Jak na ironię, wtyczka Google Drive Finder jest doskonałym źródłem plików ikon Findera.

Rozwiązaniem jest wykluczenie naruszających plików (które i tak są bezużyteczne w APK) za pomocą takiego specyfikatora w fileset:

    <exclude name="**/Icon&#13;" />
Wino z gruszek
źródło
0

Ten problem wystąpi, jeśli instalujesz niepodpisaną wersję pakietu APK. Sprawdź, czy instalujesz poprawny plik APK.

NeeK
źródło
0

Miałem ten problem z ionic / Visual Studio Code (uruchom Androida na urządzeniu):

Odinstalowałem aplikację na urządzeniu mobilnym (Ustawienia / Aplikacje), błąd zniknął i aplikacja się uruchamia.

Michael Maier
źródło
0

Zgłasza ten błąd dzisiaj, ponieważ mam aplikację z min sdk 28 i uruchamiam grę na emulatorze z wersją SDK 23. Zwykle nie jest to możliwe (AS szary jest na przycisku odtwarzania), ale dzisiaj nie tak wiele.

Daniel Wilson
źródło
0

Najpierw spróbuj to zrobić:

  • przejdź do skryptu Gradle → bulid.gradle (moduł: aplikacja) → następnie musisz zmienić wartość (minSdkVersion). Na przykład, jeśli użyłeś 26, możesz spróbować zmniejszyć wartość, na przykład (minSdkVersion 20)
  • następnie spróbuj (zsynchronizuj teraz).
Inżynier Ahmed IT
źródło
0

Jeśli używasz emulatora, spróbuj go zresetować, a jeśli na telefonie komórkowym najpierw odinstaluj aplikację, wyłącz tryb programisty, a następnie włącz go, problem zostanie rozwiązany.

Shashank Pandey
źródło