Assinando aplicações Android para lançamento público

O sistema Android requer que todas as aplicações instaladas sejam assinadas digitalmente com um certificado cuja chave privada é mantida pelo desenvolvedor. O Android usa o certificado como um meio de identificar o autor da aplicação e estabelecer uma relação de confiança entre as aplicações.

O certificado não controla que aplicações o usuário pode instalar. Ele não precisa ser assinado por uma autoridade certificadora: é perfeitamente permitido, e tipico, aplicações Android usarem certificados auto-assinados.

Quando sua aplicação estiver pronta para ser liberada ao público, você precisa:

  1. Obter uma chave privada válida
  2. Compilar a aplicação em modo de liberação
  3. Assinar sua aplicação com sua chave privada
  4. Alinhar o pacote APK final

Se você estiver usando o Eclipse com o plugin  ADT, pode usar o Assistente de Exportação para executar os procedimentos de compilação, assinatura e alinhamente. O Assistente permite até mesmo que você gere uma nova keystore e chave privada no processo.

1. Obter uma chave privada válida

Durante a preparação para assinas suas aplicações, você precisa garantir que você tenha uma chave privada válida com a qual executará a assinatura. Uma chave privada válida é uma que:

  • Esteja em sua posse
  • Represente a entidade pessoal, corporativa ou organizacional que será identificada com sua aplicação
  • Tenha um periodo de validade que exceda o tempo de vida experado da aplicação. Um periodo de validade de 25 anos é recomendado. Se você planeja publicar sua aplicação no Android Market, observe que um periodo de validade que termine depois de 22/10/2033 é necessário; VocÊ não poderá fazer upload de uma aplicação se esta estiver assinada com uma chave cuja validade expire antes dessa data.
  • Não seja a chave de depiração gerada pelas ferramentas do SDK do Android.

A chave pode ser auto-assinada. Se você não possuir uma chave válida, precisa gerar uma usando o Keytool. Certifique-se que a Keytool esteja disponivel.

Para gerar uma chave auto-assinada com Keytool, use o comando keytool e passe alguma das opções listadas abaixo (e outras, se necessário).

Atenção: mantenha sua chave privada segura. Antes de executar Keytool, leia o artigo Securing Your Private Key para saber como manter sua chave segura eporque isso é importante para você e para os usuários. Em particular, quando você estiver gerando sua chave, você deve usar senhas fortes tanto para a keystore quanto para a chave.

Keytool Option Description
-genkey Gera um par de chaves (pública e privada)
-v Ativa o modo verbose
-alias <alias_name> Um apelido para a chave. Apenas os 8 primeiros caracteres do apelido são usados.
-keyalg <alg> Algoritmo de encriptação usado para geração da chave. Tanto o DSA quanto o RSA são suportados.
-keysize <size> O tamanho de cada chave gerada (bits). Se não fornecida, Jeytool usa um tamanha padrão de 1024 bits. Em geral, é recomendado uma chave de 2048 bits ou  maior.
-dname <name> Um nome único que descreva quem criou a chave. O valor é usado nos campos issuer e subject nos certificados auto-assinados.
Observe que você não precisa especificar essa opção na linha de comando. Se não fornecida, o Jarsigned lhe pedirá para informar cada campo Nome Único (CN, OU, e assim em diante).
-keypass <password> A senha para essa senha.Como precaução de segurança, não inclua essa opção na linha de comando. Se não fornecida, o Keytool pedirá que você informe a senha. Desta maneira, sua senha não será armazenada no histórico do shell.
-validity <valdays> O perido de validade da chave, em dias.
Nota: Um valor de 10000 ou maior é recomendado.
-keystore <keystore-name>.keystore Um nome para a keystore que conterá sua chave privada.
-storepass <password> Uma senha para a keystore.
Como precaução de segurança, não inclua essa opção na linha de comando. Se não fornecida, o Keytool pedirá que você informe a senha. Desta maneira, sua senha não será armazenada no histórico do shell.

Abaixo um exemplo do comando Keytool que gera uma chave privada.

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

Para obter mais informações sobre a Keytool, veja a documentação em

http://java.sun.com/j2se/1.5.0/docs/tooldocs/#security

2. Compilar a aplicação de modo de liberação

Para poder liberar sua aplicação para os usuários, você precisa compilar ela em modo de liberação. Nesse modo, a aplicação compilada não é assinada por padrão e você precisará assina-la com sua chave privada.

Cuidado: Você não pode liberar sua aplicação sem ser assinada, ou  assinada com a chave de depuração.

Com o Eclipse

Para exportar um arquivo apk não assinado pelo Eclipse, dê um clique com o botão direito do mouse no Package Explorer e selecione Android Tools > Export Unsigned Application Package. Então especifique a localização do arquivo a ser assinado (Alternativamentel abra seu arquivo AndroidManifest.xml no Eclipse, abra a aba Overview, e clique em Export an unsigned .apk.)

Observe que você pode combinar compilação e assinatura com o Assistente de Exportação.

3. Assinando sua aplicação com sua chave privada

Quando você tiver uma pacote de aplicação que esteja pronto para ser assinado, você pode proceder com essa passo usando a ferramenta Jarsigner.

Para assinar sua aplicação, rode o Jarsigner, informando tanto o apk da aplicação quanto a keystore que contenha sua chave privada. A tabela abaixo mostra as opções que você pode usar:

Jarsigner Option Description
-keystore <keystore-name>.keystore O nome da keystore que contém sua chave privada.
-verbose Ativa o modo verbose.
-storepass <password> A senha de sua keystore. 

Como precaução de segurança, não inclua essa opção na linha de comando. Se não fornecida, o Jarsigner pedirá que você informe a senha. Desta maneira, sua senha não será armazenada no histórico do shell.

-keypass <password> A senha de sua chave privada.Como precaução de segurança, não inclua essa opção na linha de comando. Se não fornecida, o Jarsigner pedirá que você informe a senha. Desta maneira, sua senha não será armazenada no histórico do shell.

Abaixo segue um exemplo que usa o Jarsigner para assinar sua aplicação contida em um pacote chamado my_application.apk, usando a keystore exemplo criada acima.

$ jarsigner -verbose -keystore my-release-key.keystore
my_application.apk alias_name

Ao executar o comando acima, o Jarsigner lhe pedirá as senhas de sua keystore e chave privada. Então modifica o arquivo apk, o que significa que o arquivo passa a estar assinado. Observe que você pode assinar o arquivo apk várias vezes com chaves diferentes.

Para verificar que seu arquivo apk está assinado, você pode usar o comando:

$ jarsigner -verify my_signed.apk

Se o arquivo apk estiver assinado adequadamente, o Jarsigner  imprime na tela “jar verified”. Se quiser mais detalhes, tente o comando abaixo:

$ jarsigner -verify -verbose my_application.apk

ou

$ jarsigner -verify -verbose -certs my_application.apk

O comando acima, com a opção -certs adicionada, mostrará a você a linha “CN=” que mostra quem criou a chave.

Para obter mais informações sobre o Jarsigner, veja a documentação em

http://java.sun.com/j2se/1.5.0/docs/tooldocs/#security

4. Alinhar o pacote APK final

Após ter assinado o  apk com a sua chave privada, rode zipalign no arquivo. Essa ferramenta garante que todos os dados não-comprimidos iniciem com um byte de alinhamento em particular, relativo ao inicio do arquivo. Garantido o alinhamento no limite do byte 4 permite otimização de performance quando instalado no dispositivo. Quando alinhado, o sistema Android é capaz de ler os arquivos com mmap(), mesmo se conterem dados binários com restrições de alinhamentoi, assim que copiar todos os dados do pacote. O beneficio é uma redução da quantidade de memória RAM consumido pela aplicação.

A ferramenta zipalign é fornecida junto com o SDK do Android, dentro da pasta tools. Para alinhar seu apk assinado, execute:

zipalign -v 4 your_project_name-unaligned.apk your_project_name.apk

A opção -v muda para o modo verbosa (opcional). 4 é o alinhamento do byte (não use nada além de 4). O primeiro arquivo no argumento é seu arquivo apk assinado (a entrada) e o segundo é o arquivo apk de destino (a saída). Se você quiser sobrescrever um arquivo apk existente, adicione a opção -f.

Cuidado: Seu arquivo apk de entrada precisa ser assinado com sua chave privada antes de otimizar o pacote com zipalign. Se você assinar depois de usar o zipalign, isso desfará o alinhamento.

Compilando e assinando com o Eclipse + ADT

Se você usa o  Eclipse com o plugin ADT, pode usar o Assistente de Exportação para gerar um apk assinado (e até criar uma nova keystore, se necessário). O Assistente de exportação executa todas as interações com o Keytool e Jarsigner para você, o que permite que você assine suas aplicações usando uma GUI ao invés de executar procedimentos manuais para compilar, assinar e alinhar, como discutidos acima.

Após o assistente compilar e assinar seu pacote, ele também executará o alinhamento com zipalign. Já que o Assistente usa tanto o Keytool quanto o Jarsigner, você deve garantir que elas estejam disponiveis em seu computador.

Para criar um apk assinado e alinhado com o Eclipse:

  1. Selecione o projeto do “Package Explorer” e selecione File > Export.
  2. Abra a pasta Android, selecione “Export Android Application” e clique Next. O Assistente é inciado, o que lhe guiará pelo processo de assinatura de sua aplicação, incluindo os passos para seleção de sua chave privada com a qual o apk será assinado (ou criar uma nova keystore e chave privada).

Traduzido de http://developer.android.com/guide/publishing/app-signing.html

  • Erick Massa Sprengel

    Caramba.! Esse post é apenas a tradução do http://developer.android.com/guide/publishing/app
    Poderia ter publicado a fonte ao invés de deixar como se vc tivesse feito tudo.

    • Caro Erick,
      Como você pode verificar nos outros posts, tenho colocado as fontes em todas as traduções feitas e publicadas aqui. Por um lapso, posso esquecer de alguma. De qualquer forma, vale salientar que a maioria dos artigos relacionados ao Android aqui foram traduzidas do site oficial (developer.android.com). Então se achar mais alguma fonte fonte faltando, pode me dar um toque que eu corrijo.
      Atenciosamente,
      Kleber Mota
      ps.: A propósito, já corrigi esse artigo.

  • Erick Massa Sprengel

    Estava notando isto. Todos os outros posts possuiam a fonte. Bom, pelo menos eu ajudei em algo. rs.
    Alias, o blog é muito útil. Ainda não li muitos posts, mas já achei coisas interessantes. Quando encontrar algo útil te enviarei para agregar ao blog.
    Abs,
    Erick M. Sprengel.

  • awcroper

    Muito bom o tópico.
    A assinatura do aplicativo é obrigatória por lei? Ou posso por exemplo distribuir para um cliente específico sem divulgar no market nem nada.
    Isso é permitido?

    • klebermo

      Olá, para publicar uma aplicação no market, ela deve ser obrigatoriamente assinada por uma chave válida, de acordo com as regras do Google. Quanto a distribuição da aplicação para um cliente especifico, dei uma olhada na página de envio de aplicações do google play e não vi nenhuma opção para fazer isso. A alternativa seria mandar uma versão de teste do APK para o cliente (possivelmente com alguma restrição, como número de execuções ou dias de uso)>

  • celluiz

    Se eu perder a chave, basta gerar outra ou tem como recuperar a perdida?

    • Celso,
      Normalmente, quando se trabalha com chaves pública/privada, não é recomendado perde-las, justamente por não ser possível recupera-las, e ser obrigado a gerar outra. No caso, o mais provável de acontecer no caso de perder a chave usada para assinar aplicações Android, seria ter de excluir da loja a aplicação assinada com a chave perdida e reenviar a aplicação, assinada com uma nova chave.
      Espero ter ajudado,
      Kleber Mota

  • Geoge Trindade

    Parabéns pela postagem
    Minha aplicação não esta rodando nos aparelhos, mas funcionou bem no emulador de Android eu to imaginando que seja a necessidade de assinatura do apk, segui esse tutorial que está ótimo meus parabéns.. mas to tendo um problema na hora de aplicar a assinatura com o jarsigne, a mensagem é “unable to recover key from keystore”, você pode mim ajudar a entender isso?