Publicando na Play Store, passo a passo
O guia completo para colocar um jogo JumPHP no Google Play e mantê-lo lá: o que é preciso gerar, o que é preciso guardar, o que é preciso conferir em um celular e o Play Console de ponta a ponta. Vale para os dois tipos de aplicativo:
| O aplicativo web (No Google Play) | O aplicativo nativo (Aplicativo Android nativo) | |
|---|---|---|
| Comando | bin/jumphp twa meu-jogo --url https://jumphp.net/meu-jogo |
bin/jumphp android meu-jogo |
| O que é | a página do jogo no Chrome, em tela cheia | PHP, SDL e o jogo dentro do aplicativo, sem rede |
| O jogo se atualiza | junto com o site, na hora (sem novo aplicativo) | com uma nova versão do aplicativo |
O seu Claude conhece este guia (ele está no AGENTS.md do seu projeto e em docs/google-play.md): peça a ele
“coloque o meu jogo no Google Play”. Ele cuida da parte técnica; as escolhas e os envios continuam sendo seus (veja o final).
0. Antes de começar
- Uma conta de desenvolvedor do Google Play: play.google.com/console, US$ 25 uma única vez, com verificação de identidade. É a sua conta: é você quem aceita os termos do Google.
- Uma conta pessoal nova precisa fazer um teste fechado com pelo menos 12 testadores por 14 dias antes de poder publicar em produção. Comece cedo.
- O nome do pacote (
io.github.<sua conta do github>.<meu_jogo>): o identificador do aplicativo no Google Play. Ele nunca mais muda. O comando o pergunta na primeira vez. - A licença do SDK do Android: é você quem a aceita, no seu terminal, na primeira vez (o SDK, ~1 GB,
vai para
~/.jumphp). O seu Claude pede que você mesmo execute o comando (! bin/jumphp twa …). - Uma política de privacidade em um endereço público: o Google a exige mesmo que o jogo não colete nada.
Uma página curta basta: o jogo não coleta, não envia e não compartilha nenhum dado pessoal; sem conta, sem
anúncios, sem rastreamento; as configurações e os saves ficam no aparelho; um endereço de contato.
Coloque-a no site do jogo,
games/meu-jogo/site/privacy.html: ela é servida emhttps://play.jumphp.net/meu-jogo/privacy.html(ou oPRIVACY.mddo seu repositório público). Abra o endereço uma vez antes de entregá-lo ao Google: um erro 404 bloqueia a análise.
1. As chaves: faça backup primeiro
A primeira geração cria a sua chave de envio: ~/.jumphp/android/keys/<pacote>.keystore e a senha dela
em <pacote>.env.
- Nunca no git, nem em uma nota ou mensagem. Faça backup dos dois arquivos em outro lugar (gerenciador de senhas, disco criptografado). Sem eles, uma nova geração cria outra chave e o Google Play recusa a atualização.
- Com a assinatura de apps pelo Google Play (o padrão), o Google guarda a própria chave, a que assina o aplicativo nos celulares. A sua apenas prova que os envios vêm de você; se for perdida, o Google pode substituí-la (Configuração > Assinatura de apps), mas isso leva dias.
- Há, portanto, duas impressões digitais SHA-256: a da sua chave (exibida pelo comando) e a da chave do Google (Play Console > Configuração > Assinatura de apps, depois do primeiro envio).
2. Gerar o aplicativo
bin/jumphp twa meu-jogo --url https://jumphp.net/meu-jogo # o aplicativo web
bin/jumphp android meu-jogo # ou o aplicativo nativo
- Cada geração faz número de versão + 1 (o Google Play recusa um número já enviado; uma tentativa fracassada consome um número, não tem problema).
- Faça o commit imediatamente do arquivo de versão:
games/meu-jogo/android/twa-manifest.json(aplicativo web) ougames/meu-jogo/android/app.json(aplicativo nativo). Nunca odist/. - O nome sob o ícone:
pwa: {short_name: …}nogame.yaml(12 caracteres aparecem por inteiro). O ícone:assets/icon.png.
3. Somente aplicativo web: o site se responsabiliza pelo aplicativo
O Android só abre a página em tela cheia se o site declarar o aplicativo: o nome do pacote e as duas
impressões digitais (a sua e a do Google). Só com a sua, o aplicativo instalado a partir do seu .apk funciona,
mas o instalado a partir do Google Play abre com uma barra de endereço (ou uma escolha “Abrir com”).
No Studio, página do jogo, seção Aplicativo Android (ou o seu Claude: update_project). O site as
publica em https://jumphp.net/.well-known/assetlinks.json. No seu próprio servidor:
https://seu-dominio/.well-known/assetlinks.json.
4. Testá-lo em um celular de verdade
Com a depuração USB ativada e o adb:
adb install -r games/meu-jogo/dist/android/meu-jogo-<versão>.apk
adb shell pm get-app-links <pacote> # aplicativo web: “jumphp.net: verified”
adb exec-out screencap -p > captura.png # olhe: o jogo precisa estar lá
- O aplicativo deve abrir na tela de título do jogo.
- Um
.apkassinado com a sua chave não se instala por cima do mesmo aplicativo vindo do Google Play (INSTALL_FAILED_UPDATE_INCOMPATIBLE): desinstale antes (os saves do aplicativo são perdidos). - O aplicativo web abre e fecha logo em seguida, com uma escolha “Abrir com”: o celular tem dois Chrome, em geral por causa de um espaço clone / segundo espaço / app duplo (Xiaomi, Samsung…). O aplicativo do JumPHP pede o Chrome do perfil principal, o que resolve o caso para os jogadores; no seu celular de teste, excluir o espaço clone apaga todos os aplicativos que ele contém.
- O fato de o jogo abrir no Chrome não prova que o aplicativo funciona: teste o aplicativo.
5. O Play Console, na primeira vez
A lista “Configurar o seu app” do painel (X de 11) mostra o que falta fazer; “Enviar para análise” fica desativado enquanto faltar alguma coisa.
- Criar o app: nome, idioma padrão, Jogo, Sem custo, as declarações.
- Conteúdo do app (Política > Conteúdo do app), cada declaração:
- Política de privacidade: o endereço público da etapa 0;
- Anúncios: sem anúncios (o JumPHP não adiciona nenhum);
- Acesso ao app: tudo é acessível sem nenhum acesso especial (sem conta);
- Público-alvo: as idades para as quais o jogo foi feito. Escolher idades abaixo de 13 anos coloca o aplicativo no programa Em família (regras mais rígidas, menos visibilidade): só faça isso se o jogo for realmente feito para crianças;
- Classificação de conteúdo (questionário IARC): categoria Jogo; responda com honestidade para o seu jogo (violência de desenho animado ou fantasiosa, sangue, medo, jogos de apostas, conteúdo criado pelos jogadores, interações entre jogadores, localização, compras);
- Segurança dos dados: um jogo JumPHP sem conta nem estatísticas não coleta nem compartilha nenhum dado (os saves ficam no aparelho; se o seu jogo chama um serviço web, declare);
- ID de publicidade: não usado;
- Apps governamentais, recursos financeiros, saúde: não.
- Configurações da Play Store (Crescer > Presença na loja > Configurações): a categoria (Arcade, Ação, Quebra-cabeça…) e o e-mail de contato. Os dois são obrigatórios: sem eles, “Your app cannot be published yet”. O e-mail é público.
- Ficha principal: título (30 caracteres), descrição curta (80), descrição completa (4000), ícone
512 × 512 PNG (
bin/jumphp buildo gera:dist/web/icon-512.png), imagem de 1024 × 500, pelo menos 2 capturas de celular (bin/jumphp shot meu-jogo, ampliadas por um fator inteiro, ou tiradas em um celular). Guarde as imagens no jogo (games/meu-jogo/store/) para refazê-las nas versões seguintes. - Testes: Testar e lançar > Testes > Testes internos (ou Teste fechado para os 12 testadores de uma conta
nova) > Criar nova versão > o
.aab> notas da versão > Salvar > Revisar > Iniciar lançamento. Os testadores: uma lista de endereços; cada um abre o link de convite logado com aquela conta do Google e toca em Tornar-se testador. - Aplicativo web: depois desse primeiro envio, adicione a impressão digital da chave do Google (etapa 3), instale pelo link de teste e confira a tela cheia.
- Produção: Produção > Países / regiões > Adicionar, selecione, Salvar (uma versão sem países é
recusada), depois Criar nova versão > o
.aab> notas > Avançar > Salvar. - Visão geral da publicação > Enviar para análise, confirme. A análise leva de algumas horas a 7 dias; o console e o e-mail da conta avisam quando o aplicativo estiver no ar.
6. As notas da versão
Um bloco por idioma, com as tags em uma linha própria:
<pt-BR>
Primeira versão.
</pt-BR>
<en-US>
First release.
</en-US>
7. As versões seguintes
- Aplicativo web: o jogo se atualiza com o site (você faz o push e ele é publicado): sem novo aplicativo. Um
novo aplicativo só se o nome, o ícone, as cores, o endereço inicial ou o pacote mudarem:
bin/jumphp twa meu-jogo. - Aplicativo nativo: cada mudança do jogo é um novo aplicativo:
bin/jumphp android meu-jogo --version-name 1.1.
Depois: faça o commit do arquivo de versão, teste o .apk em um celular e então Play Console > a mesma faixa >
Criar nova versão > o novo .aab > notas > Enviar para análise. As declarações continuam valendo, a menos que o
jogo mude o que elas descrevem (jogo online, compras, dados): atualize-as antes.
8. As armadilhas encontradas
| Sintoma | Causa, solução |
|---|---|
| O aplicativo abre com uma barra de endereço | falta uma impressão digital (a do Google) ou o pacote no site: etapa 3 |
| O aplicativo web abre e fecha logo em seguida | dois Chrome no celular (espaço clone): etapa 4 |
INSTALL_FAILED_UPDATE_INCOMPATIBLE |
o aplicativo instalado vem do Google Play (outra chave): desinstale antes |
| “Código de versão já usado” | gere de novo (versão + 1) |
| O Google Play recusa a chave da atualização | chave de envio perdida ou recriada: restaure o backup ou peça ao Google que a redefina |
| “Your app cannot be published yet” | Configurações da Play Store: categoria e e-mail de contato |
| “Enviar para análise” desativado | falta uma etapa de “Configurar o seu app”; uma versão sem países |
| “Importe pelo menos 1 recurso” | a imagem está na biblioteca, mas não anexada à ficha: adicione-a pelo painel da biblioteca |
| Um testador não é adicionado | digite o endereço e depois Enter (a pílula), depois Salvar e confirmar |
| A política de privacidade é recusada | o endereço dela responde 404 ou não é público: abra-o em uma janela anônima |
O que o seu Claude não faz sem você
- aceitar a licença do SDK do Android, os termos do Google ou responder ao questionário de classificação sem lhe dizer as respostas dele;
- escolher o público-alvo (dizer que o jogo é “para crianças” muda as regras e a visibilidade);
- enviar para produção sem o seu aval para esse envio específico;
- excluir um espaço clone ou desinstalar um aplicativo do seu celular (dados são perdidos);
- colocar as chaves, as senhas ou o
dist/no git.