Como assinar um Apk Já Compilado

120

Eu decodifiquei um APK com apktool (como o código-fonte original foi perdido) para que eu pudesse corrigir alguns problemas com os arquivos xml de layout. Em seguida, reconstruí-o novamente com o apktool e quando tentei instalá-lo no meu dispositivo (usando adb: adb install appname.apk), ele me deu este erro:

[INSTALL_PARSE_FAILED_NO_CERTIFICATES]

o apk original, entretanto, foi assinado por um keystore (no eclipse IDE), este não é, como posso assiná-lo corretamente com seu arquivo keystone original fora do Eclipse !?

svarog
fonte
sim, o objetivo dos certificados é impedir que as pessoas façam isso ... Se você não tiver o certificado original, terá que regenerar um
terceiro dia
é só isso, eu tenho o cert original, mas decodificar / reconstruir o apk o removeu.
svarog de

Respostas:

284

crie uma chave usando

keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000

em seguida, assine o apk usando:

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore my_application.apk alias_name

verifique aqui para mais informações

user3854546
fonte
11
esta deve ser a resposta, 27 votos positivos contra 3 para a resposta original, vamos!
Kyle
1
se você fizer isso e tentar instalar o APK, poderá obter um erro INSTALL_FAILED_DUPLICATE_PERMISSION. Isso acontece quando o APK original não pode ser substituído (aplicativo do sistema ou integrado, por exemplo)
Couitchy
@Couitchy adb shell pm install -r /data/tmp/myapk.apk
Dr. Deo de
13
se você não quiser se preocupar em criar uma chave, pode usar a chave de depuração com: jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore ~ ​​/ .android / debug.keystore app.apk androiddebugkey -storepass android
Pellet
3
Existe uma diferença entre usar jarsignere apksigner? Um requer a assinatura e então o zipaligning e o outro o zipaligning e então a assinatura
Maria Ines Parnisari
72

Processo automatizado:

Use esta ferramenta (usa o novo apksigner do Google):

https://github.com/patrickfav/uber-apk-signer

Isenção de responsabilidade: eu sou o desenvolvedor :)

Processo Manual:

Etapa 1: gerar keystore (apenas uma vez)

Você precisa gerar um keystore uma vez e usá-lo para assinar seu unsignedapk. Use o fornecido pelo JDK encontrado emkeytool %JAVA_HOME%/bin/

keytool -genkey -v -keystore my.keystore -keyalg RSA -keysize 2048 -validity 10000 -alias app

Etapa 2 ou 4: Zipalign

zipalign que é uma ferramenta fornecida pelo Android SDK encontrada em, por exemplo, %ANDROID_HOME%/sdk/build-tools/24.0.2/é uma etapa de otimização obrigatória se você deseja fazer o upload do apk para a Play Store.

zipalign -p 4 my.apk my-aligned.apk

Nota: ao usar o antigo, jarsignervocê precisa zipalign APÓS a assinatura. Ao usar o novo apksignermétodo, você o faz ANTES de assinar (confuso, eu sei). Invocar o zipalign antes do apksigner funciona bem porque o apksigner preserva o alinhamento e a compactação do APK (ao contrário do jarsigner).

Você pode verificar o alinhamento com

zipalign -c 4 my-aligned.apk

Etapa 3: assinar e verificar

Usando ferramentas de compilação 24.0.2 e anteriores

Use o jarsignerqual, como o keytool, vem com a distribuição JDK encontrada em %JAVA_HOME%/bin/e use-o assim:

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my.keystore my-app.apk my_alias_name

e pode ser verificado com

jarsigner -verify -verbose my_application.apk

Usando ferramentas de compilação 24.0.3 e mais recentes

O Android 7.0 apresenta o APK Signature Scheme v2, um novo esquema de assinatura de app que oferece tempos de instalação de app mais rápidos e mais proteção contra alterações não autorizadas em arquivos APK (veja aqui e aqui para mais detalhes). Portanto, o Google implementou seu próprio assinante apk chamadoapksigner (duh!) O arquivo de script pode ser encontrado em %ANDROID_HOME%/sdk/build-tools/24.0.3/(o .jar está na /libsubpasta). Use assim

apksigner sign --ks my.keystore my-app.apk --ks-key-alias alias_name

e pode ser verificado com

apksigner verify my-app.apk

A documentação oficial pode ser encontrada aqui.

Patrick Favre
fonte
6
Obrigado pelo uber-apk-signer! Ótima ferramenta!
cantoni
2
Para ferramentas de compilação 24.0.3, a maneira correta de chamar zipalign é: zipalign -p 4 my.apk my-align.apk
kinORnirvana
Obrigado pela sua descrição! tentei o uber-apk-signer primeiro, mas falhou provavelmente porque tenho o openJDK instalado no meu sistema em vez do java "oficial" do oracle. Então tentei o modo manual e também falhei (ainda é o mesmo erro [INSTALL_PARSE_FAILED_NO_CERTIFICATES]). Verificar com o uber-apk-signer me deu mais algumas dicas signature VERIFY FAILED[...] ERROR: JAR signer CERT.RSA: JAR signature META-INF/CERT.RSA uses digest algorithm 2.16.840.1.101.3.4.2.1 and signature algorithm 1.2.840.113549.1.1.1 which is not supported on API Levels [[15, 17]]. Sim, android 4.2.2, SHA256 não está lá? Ideias?
antiplex
@antiplex relate o problema no github, não no SO
Patrick Favre
@ for3st, você quer dizer que meus problemas podem não ser devido ao meu conhecimento limitado sobre a assinatura do apk, mas devido a alguma forma de incompatibilidade do uber-apk-signer? mas mesmo assim a maneira manual também falha, o que parece não relacionado à sua ferramenta ...
antiplex
14

maneira mais rápida é assinando com o keystore de depuração:

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore ~/.android/debug.keystore app.apk androiddebugkey -storepass android

ou no Windows:

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore %USERPROFILE%/.android/debug.keystore test.apk androiddebugkey -storepass android
Pelota
fonte
4

Para aqueles de vocês que não desejam criar um arquivo bat para editar em todos os projetos, ou não desejam se lembrar de todos os comandos associados aos programas keytools e jarsigner e apenas desejam executá-lo em um processo, use este programa:

http://lukealderton.com/projects/programs/android-apk-signer-aligner.aspx

Eu o construí porque estava farto do longo processo de ter que digitar todos os locais dos arquivos todas as vezes.

Este programa pode salvar sua configuração, portanto, da próxima vez que você iniciá-lo, você só precisa clicar em Gerar e ele cuidará disso para você. É isso aí.

Não requer instalação, é totalmente portátil e salva suas configurações em um arquivo CSV na mesma pasta.

Luke Alderton
fonte