O que é o erro INSTALL_PARSE_FAILED_NO_CERTIFICATES?

163

Eu estava tentando alterar minha atividade padrão / main / startup (como você chama) editando o androidmanifest.xmlarquivo. Tudo o que fiz foi mudar de android:namepropriedade. no entanto, isso quebrou completamente o aplicativo inteiro. quando tento instalar ele falha e lê.

Erro de instalação: INSTALL_PARSE_FAILED_NO_CERTIFICATES

Quando tentei voltar ao estado anterior, ele ainda estava me dando o mesmo erro ... O que eu fiz?

mtmurdock
fonte
Para qualquer outra pessoa: INSTALL_PARSE_FAILED_NO_CERTIFICATESé o erro -103que você pode obter / ver via adb log( src ), por exemplo. D/PackageInstaller(21320): Installation error code: -103
a resposta é verdadeira. e há outra razão que explica esse erro: quando você tem um aplicativo antigo com o mesmo nome de pacote no telefone instalado .. basta desinstalar do telefone antes de instalar o novo
Emre Kilinc Arslan
1
Para quem se deparar com essa pergunta - leia todas as respostas abaixo! Parece que esta mensagem de erro é mais do tipo "algo está errado". A razão pela qual eu encontrei foi devido a uma das respostas caminho, abaixo da lista !!!!
GMc

Respostas:

56

Você editou o AndroidManifest.xmldiretamente no .apkarquivo? Se assim for, isso não vai funcionar.

Todo Android .apkprecisa ser assinado se for instalado em um telefone , mesmo que você não esteja instalando através do Market. As ferramentas de desenvolvimento resolvem isso assinando um certificado de desenvolvimento, mas o documento .apkainda está assinado.

Um uso disso é para que um dispositivo possa saber se .apké uma atualização válida para um aplicativo instalado, pois se for o mesmo, os Certificados.

Portanto, se você fizer alguma alteração no seu aplicativo, precisará reconstruí- .apklo para que ele seja assinado corretamente.

Dave Webb
fonte
muito obrigado, existe um botão para reconstruir automaticamente o manifesto?
Mtmurdock 26/05/10
Para caras que lutam com vibração, corra flutter cleane corra / depure novamente! Esta operação é semelhante à solução acima, pois limpa a pasta de compilação e reconstrói o arquivo de compilação novamente na execução / depuração!
Manoj Kumar
183

Descobri que agora esse erro também pode ocorrer ao usar a configuração de assinatura incorreta. Conforme descrito aqui , o Android 7.0 introduz um novo esquema de assinatura, V2 . O esquema V2 assina o APK inteiro em vez de apenas o JAR, como é feito no esquema V1. Se você assinar apenas com a V2 e tentar instalar em um destino anterior à 7.0, receberá este erro, pois os JARs não são assinados e o PackageManager anterior à 7.0 não pode detectar a presença da assinatura APK da V2.

Para ser compatível com todos os sistemas de destino, verifique se o APK está assinado com os dois esquemas, marcando as duas caixas de versão de assinatura na caixa de diálogo Gerar APK assinado do Android Studio, conforme mostrado aqui:

insira a descrição da imagem aqui

Se apenas os destinos 7.0 forem previstos, não será necessário incluir a assinatura V1.

Paul Ratazzi
fonte
5
Você economizou meu tempo. A atualização do Android Studio causou pesadelo de problemas. Este era um deles. Gostaria de saber se SO não estivesse por perto, mais da metade do desenvolvimento do Android teria morrido. O Android Studio não fornece pistas sobre erros.
Atul
4
Felizmente, testei meu apk de lançamento em um dispositivo antigo antes de lançá-lo no Google Play. Isso seria um desastre se todos os dispositivos <Android 7.0 falharem ao instalar a nova versão. Essa coisa com duas versões deve ser um GRANDE DIÁLOGO POP UP RED quando você clica para criar uma versão apk!
Kirill Karmazin
Obrigado por isso. Estou prestes a enlouquecer procurando por que meu APK não funcionava abaixo do Android 7, mas era apenas uma caixa de seleção simples. Tão irritante.
japzone 17/05
54

Eu descobri que isso foi causado pela minha versão do JDK.

Eu estava tendo esse problema com 'ant' e era devido a este CUIDADO mencionado na documentação:

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

Cuidado: A partir do JDK 7, o algoritmo de assinatura padrão mudou, exigindo que você especifique os algoritmos de assinatura e resumo (-sigalg e -digestalg) ao assinar um APK.

Eu tenho o JDK 7. No meu log Ant, usei -v para verbose e ele mostrou

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

Assinei o JAR manualmente e o zipalignei, mas deu um erro um pouco diferente:

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

Eu achei que respondeu aqui.

Como lidar com INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES sem desinstalação

Eu só precisava desinstalá-lo e funcionou!

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

Agora só preciso modificar o build.xml para usar essas opções ao assinar!

Ok, aqui está: C: \ Arquivos de programas \ 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
fonte
3
O JDK 7 também foi meu problema. Eu estava com preguiça e desinstalei o JDK 7 e instalei o JDK 6, também funcionou ^^. Outra solução de hack, mas menos radical, pode ser instalada, mas defina JAVA_HOME como JDK 6 e coloque o caminho de bin do JDK 6 em PATH.
Ixx
1
O JDK 8 tem o mesmo problema. Alterar PATH para JDK 6 funcionou. Obrigado salva-vidas!
Chris Xue
Obrigado! Meu aplicativo de mercado foi compilado com o JDK6. Quando compilei o aplicativo com o keystore de lançamento usando o JDK7 e tentei instalar, ele me deu esse problema.
Sileria 17/10/14
28

Na maioria das vezes, a solução para esse erro é realmente simples:

  1. Desinstale o seu apk
  2. Limpe seu projeto Android
  3. Crie seu projeto Android
  4. Instale / execute seu apk
JanCor
fonte
Eu fiz 2,3,4 e recebi o mesmo erro. O que você quer dizer com desinstalar seu apk? Do meu dispositivo? Acho que nunca esteve no meu dispositivo.
Curtis
de repente, comecei a obter esse erro do nada, nenhum se a solução, mas simplesmente o projeto de limpeza, funcionasse. Obrigado.
pgcan 5/06
18

resolvido (para mim) usando na keytool os argumentos

-sigalg MD5withRSA -keyalg RSA -keysize 1024

e usando no jarsigner

-sigalg MD5withRSA -digestalg SHA1

solução encontrada em

Que tipo de pitfals existem para a assinatura do APK do Android?

Alejadro Xalabarder
fonte
Obrigado, corrigi o problema para mim também (eu tenho o JDK 7).
Enrico Ros
Corrigi da mesma maneira, já que uso o appcelerator titanium e não tenho acesso ao script de geração de apk. Observe que essas soluções requerem a regeneração (alteração!) Da chave privada.
Federico
8

Eu também estava enfrentando o mesmo problema. Primeiro, criei a compilação usando a V2 e instalei em dispositivos móveis executando o OS 5.1 e tive o mesmo problema. Mas a compilação estava funcionando bem no Tablet rodando no OS 7.0. Então, eu criei a build com a assinatura Jar V1 e estava funcionando bem nos dois dispositivos.

Conclusão: se você estiver suportando o dispositivo abaixo do Android OS 7.0. Use a assinatura jar V1 para gerar a construção.

Rajiv Ranjan
fonte
Não é necessário verificar os dois. Selecione V1 se você estiver suportando o OS 7.0 e abaixo. Verifique V2 se você estiver suportando os dispositivos em execução no 7.0 e acima.
Rajiv Ranjan
7

No meu caso, eu poderia criar e executar versões de lançamento, mas obtive o INSTALL_PARSE_FAILED_NO_CERTIFICATES erro ao tentar fazer uma versão de depuração.

A solução foi excluir meu debug.keystorearquivo e permitir que o ADT o recrie. Aparentemente, expirou.

Uma solução melhor a longo prazo é criar explicitamente um debug.keystoreque não expire após apenas um ano, em vez de permitir que o ADT o crie. Aqui está o comando para fazer isso:

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

Quando solicitado, insira estes valores:

  • Nome e sobrenome: Depuração do Android
  • Unidade organizacional: Android
  • Nome da Organização: Unknown
  • Cidade ou localidade: Unknown
  • Estado ou Província: Desconhecido
  • Código do país: EUA
Kristopher Johnson
fonte
5

Essa é uma solução feia, mas rápida: use o JDK 6 em vez de 7.

Depois de ler a resposta de Chloe, desinstalei o JDK 7 (não é necessário atualmente) e instalei o JDK 6. Foi corrigido. Uma solução melhor faria o ant usar o JDK 6 (sem desinstalar o 7). Talvez seja possível alterar / definir esta propriedade:

java.library.path

no arquivo local.properties. Está no diretório do projeto (raiz).

O Android não funciona de qualquer maneira com o JDK 7 (apenas 6 ou 5); portanto, o script ant também usa o JDK 6 ou 5 é provavelmente uma boa solução.

Ixx
fonte
5

Isso porque a compilação e a atualização geradas anteriormente estão tendo conflito na versão de assinatura entre v1 (assinatura jar) e v2 (assinatura completa do APK),

Para corrigir a versão correta da assinatura na caixa de diálogo Gerar APK assinado

Pankaj kumar
fonte
4

Recentemente, tive esse erro ao atualizar para o Android Studio 4.0. A causa foi que o projeto teve a assinatura V2 desativada na configuração de assinatura build.gradle.

A solução foi removê-lo v2SigningEnabled falseou configurá-lo explicitamente true, que é o valor padrão.

android {    
    signingConfigs {
        dev {
            v2SigningEnabled true
        }
     }
}
mikehc
fonte
Estou usando o Android studio 4.0. Mas não existe "v2SigningEnabled" no meu arquivo build.gradle. Então, o que devo fazer?
Nuwan Harshakumara Piyarathna
3

Nas versões mais recentes do Android Studio 3.2+, se você estiver tentando executar a releaseinstalação e não tiver definido nenhuma configuração de assinatura, ele mostrará o prompt de erro e a instalação falhará. O que você precisa fazer é executar a debugcompilação ou definir a configuração de assinatura (V1 ou V2) corretamente.

Rowland Mtetezi
fonte
3

a maioria das respostas é verdadeira. e algumas outras razões que acontecem são

► seu min sdk menor que o sdk do dispositivo.
► você tem o aplicativo mais antigo no seu dispositivo com o mesmo nome de pacote

Emre Kilinc Arslan
fonte
Essa foi a minha experiência - o min sdk no meu projeto foi maior que o dispositivo sdk. Isso aconteceu porque eu "perdi" a seleção correta quando estava criando o projeto no Android Studio e acidentalmente selecionei a próxima versão superior como meu SDK e meu tablet antigo estava em execução.
GMc
fazer igual meu min sdk e dispositivo sdk resolveu meu problema.
Nuwan Harshakumara Piyarathna
2

Isso pode acontecer se você tentar incluir uma .jarbiblioteca que contenha um AndroidManifest.xmlarquivo.

  • Se for Java puro, certifique-se de não incluí-lo na exportação .jar
  • Se não é Java puro (o que significa que é um projeto Android), você deve incluí-lo como um Projeto de Biblioteca
znat
fonte
2

Você também pode verificar

Project Structure-> Default Config->Signing Config

depois de você adicionar tudo o que você precisa

Morozov
fonte
1

A configuração da variável de ambiente JAVA_HOMEcomo JDK 5 ou 6 (em vez de JDK 7) corrigiu o erro.

TN.
fonte
0

Depois de algum tempo e vários tópicos online sobre o assunto, consegui consertar meu projeto.

Isso leva principalmente em consideração os últimos arquivos ( podem ser imagens ou layouts ) que você coloca. Se você excluí-los, funcionará e você poderá criar seu projeto novamente.

Nelson R.
fonte
0

Eu estava tendo esse erro no meu Eclipse Console. Acontece que eu tinha dois jarros com o mesmo conteúdo, mas com nomes diferentes e eles estavam em conflito um com o outro. Acabei de excluir um deles e consegui instalar o aplicativo no dispositivo.

joao2fast4u
fonte
0

Eu estava recebendo esse erro porque libertei que ant releaseestava falhando porque o espaço em disco estava acabando.

Grilo vermelho
fonte
0

Eu recebi esse erro quando tentei instalar um projeto Xamarin desenvolvido com base na visualização do Android N em um telefone executando a API v23. A solução é não fazer isso.

James Moore
fonte
0

Outra maneira de obter esse erro é criar usando antno macOS e ter um arquivo de ícone do Finder ( Icon\r) na árvore de origem do aplicativo. Parece jarsignerque não pode lidar com o retorno de carro no nome do arquivo e, embora afirme que a assinatura é válida se você-verify o APK, sempre resulta em um APK que não será instalado em um dispositivo. Ironicamente, o plug-in do Google Drive Finder é uma excelente fonte de arquivos de ícones do Finder.

A solução é excluir os arquivos incorretos (que são inúteis no APK de qualquer maneira) com um especificador como este no fileset:

    <exclude name="**/Icon&#13;" />
Perada
fonte
0

Esse problema ocorrerá se você estiver instalando a versão não assinada do APK. Verifique se você está instalando o APK correto.

NeeK
fonte
0

Eu tive esse problema com o código iônico / Visual Studio (execute o Android no dispositivo):

Desinstalei o aplicativo no dispositivo móvel (configurações / aplicativos), o erro desapareceu e o aplicativo foi iniciado.

Michael Maier
fonte
0

Ele está lançando esse erro para mim hoje porque eu tenho um aplicativo com um mínimo de sdk de 28 e estou jogando no emulador com uma versão SDK de 23. Normalmente, isso não é possível (como o cinza está fora do botão de reprodução), mas hoje não é assim Muito de.

Daniel Wilson
fonte
0

Primeiro, tente fazer isso:

  • vá para o script Gradle → bulid.gradle (módulo: aplicativo) → então você deve alterar o valor (minSdkVersion). Como exemplo, se você usou 26, pode tentar diminuir o valor, como (minSdkVersion 20)
  • depois tente (sincronizar agora).
Engenheiro Ahmed IT
fonte
0

Se você estiver usando o emulador, tente redefini-lo e, se você desinstalar o aplicativo primeiro, desative o modo de desenvolvedor e, em seguida, ligue-o, o problema será resolvido.

Shashank Pandey
fonte