# Qual a relação da KeyStore, PackageName e seu APP?

* Tentarei ser o mais didático possível, sem entrar em detalhes técnicos, com o objetivo de explicar um assunto muito complexo e de forma fácil para ser entendida, com isso estarei abstraindo detalhes técnicos que podem ser facilmente encontrados na documentação oficial do Android (use o Google para te auxiliar)

* Deixarei alguns links no final do artigo, caso tenha interesse.

* Se você não entender algumas palavras ou conceitos que forem citados, sugiro fortemente usar o Google para melhorar seus conhecimentos.

* Leia meus comentários que começam com [INFO EXTRA], para dicas e informações extras.

O Android identifica seu APP baseado no conjunto da KeyStore e do PackageName.

**PackageName**, tradução literal Nome do Pacote, é o nome do pacote do seu APP, aquele que segue o padrão **com.SeuSite.NomeApp**.

A KeyStore é uma hash utilizada para assinar seu APP. Ao assinar seu APP o JAVA vai utilizar os metadados do seu APP (PackageName incluso) e o resultado dessa assinatura será uma Hash específica.

Com estes dois dados, PackageName e KeyStore (assinatura), o Android consegue saber se seu APP é seu APP. Isso quer dizer que:

O mesmo APP feito em linguagens diferentes (Delphi e Flutter, por exemplo) mas que foram compilados usando a mesma KeyStore e PackageName serão considerados exatamente o mesmo APP para o SO Android.

Um exemplo contrário disso é: você pegar EXATAMENTE o mesmo projeto que você compilou há 5 minutos, mudar uma única letra do PackageName dele (mantendo a mesma KeyStore), o SO Android vai considerar este um APP completamente diferente, visto que agora a assinatura mudou (resultado da alteração do PackageName).

Mas o que aconteceria se Mantermos o PackageName igual MAS mudar a KeyStore? Sendo a KeyStore apenas uma hash utilizada para assinar seu APP, quando você for instalar o APP neste novo contexto o SO vai primeiro ver se existe um APP com mesmo PackageName instalado, se sim, vai verificar a assinatura do mesmo. Neste nosso caso nós mudamos a KeyStore, então a assinatura nova é completamente diferente da antiga, resultando em erro na instalação, visto que você já possui um APP instalado com mesmo PackageName mas assinado com uma KeyStore diferente.

Este é um processo utilizado pela Google para assegurar que ninguém além de você vai conseguir sobrepor seu APP no celular do usuário e fazer coisas maliciosas.

Agora vamos começar a parte difícil. Se você chegou até aqui e não entendeu nada, sugiro não continuar lendo. Vá usar o Google e/ou ChatGPT até entender o que foi escrito até agora.

# Mas por que tudo isso é importante?

Isso é importante PRINCIPALMENTE como nós, desenvolvedores, distribuímos os APPs para nossos clientes e adicionalmente como o Delphi ‘assina’ nossos APPs.

## Vamos primeiro entender o Delphi:

O Delphi possui dentro de “Target Platforms-Android(32/64)-Configuration” duas opções: **Application Store** e **Development** (você pode verificar essa configuração como na foto à baixo OU em “Project-Options-Deployment-Provisioning”)

Sempre que você compilar seu APP utilizando o tipo **Development** o Delphi vai usar uma KeyStore aleatória (normalmente chamada de **debug.keystore**) para assinar seu pacote.

Pontos importantes:

- Esse arquivo **debug.keystore** é criado do zero SEMPRE que você instala o Delphi, isso quer dizer que, dois Delphis instalados no seu PC terão cada um uma **debug.keystore**.

- Você possui o Delphi XYZ instalado e compila seu APP direto no seu celular, se você instalar uma atualização, Delphi XYZ.1 por exemplo, ele gerará um novo **debug.keystore**, na próxima vez que você tentar compilar seu APP no mesmo aparelho, você verá um erro.

- Se por acaso você instalar exatamente a mesma versão do seu Delphi em outro PC (ou até mesmo re-instalar no seu PC), ele irá criar um novo **debug.keystore**.

(todos os casos citados vão gerar o mesmo problema descrito no começo deste artigo: KeyStore diferentes geram assinaturas diferentes)

## O que acontece quando tentamos compilar na configuração **Application Store**?

Com esta configuração o Delphi espera que você, desenvolvedor, tenha especificado corretamente sua própria KeyStore em “Project-Options-Deployment-Provisioning” (atente-se ao **Target**, precisa estar selecionado algum Android).

O Delphi vai pegar seu arquivo KeyStore e assinar seu APP na hora da compilação.

Usando os conhecimentos anteriores deste artigo, podemos imaginar que neste contexto, se você manter seu PackageName sempre igual e o Delphi usando sempre exatamente o mesmo arquivo KeyStore que você criou anteriormente, o Android vai sempre considerar seu APP exatamente o mesmo APP, não importando a versão do Delphi, ou até mesmo se você usar outra ferramenta para compilar seu APP (Flutter, por exemplo).

Isso acontece porque você está mantendo sempre a mesma KeyStore (hash) e PackageName para assinar seu APP.

## Mas como tudo isso influencia na forma como nós, desenvolvedores, distribuímos nossos APPs?

Vou dar um exemplo prático em vez de algo teórico:

O Dev fez um APP super legal, mas infelizmente não tem dinheiro OU não quer passar por toda a burocracia necessária de distribuição pela loja. Ele manda seu APK para um amigo, que gosta muito da sua solução, então manda para outro amigo, para outro, então para outro, outro e etc. No fim do ano, O Dev já tem quase mil pessoas utilizando seu APP, ele colocou Ads (propaganda), botão de doação e outras milhares de coisas que já estão rendendo para ele uma boa grana.

Acabou de sair o Android novo XYZsuper, seus usuários não esperam e já atualizaram seus aparelhos e infelizmente o APP não é mais compatível com esta nova versão. O Dev então atualiza seu Delphi para nova versão e gera um novo APK, compatível com essa nova versão do Android, e distribui para o auto-atualizador! Mas seu APP não consegue mais se auto-atualizar, aparece um erro de incompatibilidade ou “APP não foi instalado”.

Depois de dias na luta, estudando Delphi, lendo a documentação do Android… O Dev encontra este artigo aqui no NOSTR e compreende onde errou:

Ele compilou o APK dele em modo DEBUG. Agora com o novo Delphi o APK foi assinado com uma nova KeyStore, nem copiando o arquivo antigo **debug.keystore** para o novo Delphi resolveu o problema.

A única solução viável para O Dev é:

Criar uma KeyStore própria (salvar a sete-chaves onde não irá se perder), manter o mesmo PackageName e passar a distribuir o APP compilado em modo **Application Store**.

Mas todos usuários terão que remover o APP atual e instalar novamente, infelizmente talvez alguns usuários não estarão dispostos a este trabalho todo.

Depois de ter aplicado a correção e os usuários interessados terem realizado o processo de ‘atualização’ manual, o processo de Self Update do APP deverá funcionar normalmente, enquanto O Dev usar o mesmo arquivo de KeyStore e PackageName.

[1] Alguns detalhes mais técnicos sobre como a assinatura do seu APP funciona: https://developer.android.com/studio/publish/app-signing

[2] Artigo original publicado no Discord do “Adriano Santos Community”: https://discord.com/channels/824480379616493589/831906746318454824/942523981536321586

#Delphi #Embarcadero #RadStudio #Android #APP #Mobile #Dev #Development #KeyStore #PackageName #Provisioning #ApplicationStore

Reply to this note

Please Login to reply.

Discussion

[INFO EXTRA]

# Pq e como criar um bom PackageName para meu APP?

## A resposta simples do “Por que” criar um bom PackageName para seu APP é:

Profissionalismo. Você quer no mínimo ser visto como um profissional pelo menos mediano.

Se ser um profissional pelo menos mediano não é uma boa justificativa para você, então talvez Privacidade seja.

Como assim?

Acesse o link à baixo [1] e veja todos os APPs distribuídos na Loja da Google e que possuem o nome Embarcadero.

Ok, ainda não estou entendendo, qual a relação de um “bom PackageName” com os APPs do link [1]?

Quando se cria um projeto Mobile em Delphi, o Delphi cria o próprio padrão de PackageName **com.embarcadero.**, se você não se atentou a modificar o PackageName do seu projeto ele será listado facilmente na loja, ou seja, se por qualquer motivo você quer manter sua privacidade da Embarcadero… Ela acabou de ‘te achar’.

# Como criar um bom PackageName para meu APP?

Usando o Google ou ChatGPT você poderá encontrar várias convenções e padrões que você pode seguir. Aqui eu irei citar algumas que eu uso:

- Não usar nenhum caractere especial além de ponto.

- Use apenas letras, números e ponto

- siga o padrão do seu WebSite ao contrário: br.com.NomeDaSuaEmpresa.NomeDoSeuApp

– Assim todos os APPs que você publicar vão seguir o mesmo padrão, mudando só, obviamente, o nome do APP

# Onde mudar o PackageName do meu APP?

Em “Project-Options-Application-Version Info” (atente-se apenas para o “Target”, tenha certeza de ter o mesmo PackageName em todos os Targets Android)

[1] https://play.google.com/store/search?q=embarcadero&c=apps

[INFO EXTRA]

Como criar a KeyStore para seu APP?

Por favor, siga o artigo oficial da Embarcadero:

https://docwiki.embarcadero.com/RADStudio/Athens/en/Create_a_new_Keystore/Alias

A versão Delphi 12.3 permite selecionar separadamente a KeyStore para os modos DEBUG e Development, oque permite a geração assinada correta do APK em 64bits, ou seja, configure corretamente e compile normalmente.