igorbastosib on Nostr: # Qual a relação da KeyStore, PackageName e seu APP? * Tentarei ser o mais ...
# 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
* 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