fastin
App Android de controle de jejum intermitente. Offline por construção, distribuído por sideload — sem backend, sem login e sem permissão de internet no manifesto.
O Contexto e o Problema
Eu acompanhava meu jejum intermitente em planilha, e a planilha não resolvia a única pergunta que importava no meio da manhã: há quanto tempo eu estou sem comer? Os apps do mercado resolviam isso, mas todos pediam conta, mandavam meus dados de saúde para um servidor e monetizavam com assinatura.
O incômodo não era o preço. Um registro diário de peso, alimentação e jejum é um dado íntimo, e não havia motivo técnico para ele sair do meu aparelho — o app não precisa de nada além do meu próprio histórico para funcionar.
A Solução
Um app nativo que roda inteiramente no dispositivo. O manifesto não declara a permissão de INTERNET: o app funciona em modo avião por construção, não por promessa. Sem Play Store, sem Play Services, sem conta.
A regra central é mais sutil do que parece: o jejum de um dia começa na última refeição do dia anterior e termina na primeira refeição do dia atual. Ele atravessa a meia-noite por definição, e num país com horário de verão a duração real diverge do relógio de parede. Um jejum de 20:00 às 12:00 marca 16h no relógio, mas 17h reais quando o país sai do horário de verão naquela noite.
Números
90
Testes na JVM
1,5 MB
Tamanho do APK
0
Permissões de rede
9
ADRs documentados
Funcionalidades
Relógio de jejum em tempo real
Conta o tempo desde a última refeição registrada, com os marcos de 16h, 18h, 20h e 24h e o horário previsto de cada um.
Registro diário sem campo obrigatório
Horários das refeições, déficit calórico, qualidade, água, álcool, peso e observações. Todos opcionais — tocar de novo num chip já marcado limpa o campo.
Dashboard configurável
O usuário adiciona, remove e configura cards: linha, dispersão, heatmap e número grande, sobre sete métricas e cinco períodos.
Backup em CSV
Export e import simétricos. É o único backup que existe, e o Auto Backup do Android está desligado de propósito — um log de saúde não vai para a nuvem sem o usuário pedir.
Notificações locais
Avisos ao bater 16h, 18h e 20h via WorkManager, sem rede e sem Play Services. O worker revalida o jejum antes de notificar: se você já comeu, o aviso não dispara.
Destaque Técnico: testar um app Android sem emulador
Desenvolvi o app numa máquina Windows ARM64, e no meio do caminho descobri que o Google não publica o emulador Android para essa plataforma — o pacote nem aparece no SDK manager. O Robolectric, que roda testes de Android na JVM, também só publica binário nativo para x86_64 no Windows, e uma JVM ARM64 não carrega DLL x64.
A saída foi isolar o problema onde ele realmente existe: apenas a JVM de teste roda em x64. Compilação, Kotlin, KSP, R8 e o empacotamento do APK seguem em ARM64 nativo — o APK entregue nunca passa por emulação. Com isso, os 90 testes rodam na JVM, sem aparelho conectado.
Para ver as telas, cada uma é composta e desenhada de verdade num bitmap e salva em PNG. Isso virou também um teste de renderização: uma tela que quebrasse ao medir ou desenhar falharia ali, e nenhum outro teste pegaria — os demais consultam a árvore de semântica, que existe mesmo quando o desenho falha.



