Uma lista remota sem servidor para "Mais jogos": um arquivo JSON no GitHub Pages
Por Nesim Razon, desenvolvedor Android independente · 2026-11-14
Cada um dos meus jogos tem uma janela "Mais jogos" que promove os outros. Por um tempo essa lista ficou embutida em cada app, o que significava que lançar um jogo novo obrigava a atualizar todos os antigos. Eu a troquei por um único arquivo JSON no GitHub Pages. Veja como funciona e quais limites o mantêm seguro.
O problema de uma lista dentro do app
Uma lista embutida no app é fácil de escrever e dolorosa de manter. Cada jogo novo significava código novo, ícones novos e uma versão nova de cada jogo antigo, e cada uma dessas versões passa por revisão. Com uma dúzia de jogos, a janela de promoção era a parte mais lenta de cada lançamento.
Um arquivo no GitHub Pages
A lista agora é um arquivo estático ao lado do meu site, mais um pequeno ícone por jogo. Cada entrada tem uma chave curta, o nome do jogo, o nome do pacote do Android, o caminho do ícone e uma descrição por idioma. Os apps leem a descrição no idioma do celular e recorrem ao inglês se faltar.
Um pequeno script monta o arquivo. Ele tem uma linha por jogo, redimensiona cada ícone para um tamanho pequeno fixo e escreve tudo. Adicionar um jogo é adicionar uma linha, rodar o script e enviar. Nenhum dos apps antigos precisa de uma versão para isso.
Como o app a usa
No máximo uma vez a cada 48 horas, o app baixa a lista em uma thread em segundo plano e a guarda no celular. A janela sempre lê a cópia guardada. Se o celular nunca ficou online, ou o arquivo está danificado, o app recorre a uma cópia da lista e dos ícones que vem dentro do próprio app.
Uma entrada cujo ícone não está disponível é ignorada em vez de mostrar um quadrado cinza, e o jogo nunca lista a si mesmo.
Verificações que o mantêm seguro
A lista só pode abrir uma página da loja, mas mesmo assim eu a trato como entrada não confiável.
- Os downloads só são aceitos por https e só do meu próprio site.
- A lista não pode ter mais de 64 KB nem um ícone mais de 256 KB.
- No máximo 40 entradas são lidas.
- Cada chave e cada nome de pacote devem seguir um padrão rígido antes de serem usados.
- Um arquivo danificado nunca substitui um que funciona: erros de leitura recorrem à cópia embutida.
Escrever na ordem certa
O app baixa e guarda primeiro os ícones e só depois guarda o arquivo da lista. Assim a lista guardada nunca aponta para um ícone que falta. Quando a lista nova é guardada, um pequeno contador muda para que uma janela aberta se atualize sozinha, o que resolveu o caso em que a primeira abertura mostrava uma janela vazia.
O que eu ainda mudaria
Um jogo novo aparece depois da próxima atualização, que pode levar até dois dias mais a próxima vez que a janela for aberta, então não é instantâneo. A lista não conta usos por conta própria; os cliques são contados pelos apps. E tudo depende de um único servidor, por isso a cópia embutida importa.
Perguntas frequentes
Adicionar um jogo novo exige atualizar os apps antigos?
Não. Os apps leem a lista de um arquivo JSON online, então basta adicionar uma linha ao arquivo e publicá-lo.
O que acontece quando o celular está offline?
O app usa a última cópia guardada, ou uma cópia embutida no app se nunca baixou a lista.
Com que frequência o app atualiza a lista?
No máximo uma vez a cada 48 horas, em uma thread em segundo plano.
A lista pode ser usada para abrir algo prejudicial?
Ela só pode abrir páginas da loja, e downloads, tamanhos, chaves e nomes de pacote são verificados antes de serem usados.
Mais do blog
- Por que meu link da App Store deu 404 e a página mostrava capturas de 2018
- Diretriz 2.1 da App Store "Information Needed": o que enviei
- Capturas de tela da App Store sem celular: Robolectric, um carregador de imagens falso e um navegador sem interface
- Um código QR para duas lojas de apps: uma pequena página de redirecionamento
- Reescrever para Kotlin Multiplatform sem mudar o comportamento: o código antigo como oráculo de testes
- Depurar um iPhone no Windows por USB: capturas de tela e logs com Python