Flappy Bird para Android, escrito em C, com menos de 100 KB
(github.com/VadimBoev)- Este projeto tem como objetivo implementar um clone de Flappy Bird para Android em C, reduzindo o tamanho do APK para menos de 100 KB
- Depois de conhecer o rawdrawandroid em 2021, o autor quis criar um jogo com APK pequeno, e em setembro de 2024 ver um Flappy Bird em C# no Discord do Raylib serviu de gatilho para tentar uma implementação em C
- A implementação empacota no APK uma biblioteca nativa feita em C e combina OpenGL ES 2, shaders e Android Native Activity
- O som é comprimido em MP3 e reproduzido com OpenSLES, enquanto a decodificação de PNG usa upng
- A compilação oferece suporte a Visual Studio Code no Windows e Makefile no Linux/macOS, e deixa explícito que os direitos do jogo e dos recursos pertencem à DotGEARS
Objetivo e contexto do projeto
- Flappy Bird in C é um projeto para escrever um clone de Flappy Bird em C que rode no Android e manter o tamanho do APK em menos de 100 KB
- O ponto de partida foi o rawdrawandroid, conhecido em 2021, e o objetivo era criar um jogo pequeno em tamanho de APK, mas ainda compreensível e interessante
- Como Flappy Bird já foi portado para várias linguagens, ele acabou sendo uma escolha natural para implementar um clone
Tentativas anteriores e problemas
- Em 2021, o autor estudou Raylib, e a primeira tentativa de fazer o jogo em C++ usando ImGui falhou
- Na época, havia vários problemas
- O APK tinha cerca de 1 MB
- O jogo travava
- O APK incluía apenas a biblioteca armeabi-v7a
- Pelos requisitos do Google em 2022, era necessário incluir a biblioteca arm64-v8a
O que motivou a nova tentativa em 2024
- Depois de ver um Flappy Bird em C# no canal do Discord do Raylib em setembro de 2024, o autor começou a tentar implementar Flappy Bird para Android em C e deixar o APK abaixo de 100 KB
- O objetivo parecia irrealista, mas o interesse competitivo virou a motivação para a implementação
Como foi implementado
- O começo foi compilar um Hello World escrito em C e empacotar essa biblioteca em um APK
- O som é comprimido em formato MP3 e reproduzido com OpenSLES
- Para decodificar arquivos PNG, foi escolhido o upng
- Os gráficos e a integração com Android usam em conjunto OpenGL ES 2, shaders e Android Native Activity
Como compilar
- No Windows, o ambiente de referência é o Visual Studio Code
- Criar
.enva partir de.env.example - Executar
build.bat
- Criar
- No Linux e no macOS, é possível compilar com o Makefile fornecido
- É necessário instalar as Android command-line tools
- Configurar as variáveis de ambiente no arquivo
.envna raiz do projeto - Executar
cd FlappyBirde depoismake
- Para passos mais detalhados de compilação, a orientação é consultar
BUILDING.md - O APK assinado é gerado em
FlappyBird/app/build/outputs/apk/FlappyBird-signed.apk
Direitos autorais e projetos de referência
- O autor do projeto não reivindica direitos autorais e declara que os direitos do jogo e dos recursos pertencem à DotGEARS
- Os projetos que serviram de inspiração foram os seguintes
1 comentários
Comentários do Hacker News
Seria ótimo se a app store tivesse um filtro para ver apenas apps com menos de 10 MB
Os apps mais rápidos e com menos anúncios e microtransações geralmente são os menores
É bem mais provável que eu fique satisfeito baixando um app de termômetro de 3 MB do que um de 150 MB
Todos eles eram realmente pequenos, com menos de 200 KB
Recrutadores muitas vezes exigiam resultados para mostrar como se fosse um portfólio artístico, até de apps que já nem existiam mais ou cujos servidores tinham saído do ar
Um critério ainda mais arbitrário era querer saber se você já tinha feito algum app grande, e se você usasse várias técnicas de otimização que demonstrassem competência e entregasse um pacote de 8–12 MB, isso era interpretado como sinal de que o app, o serviço e a base de usuários eram pequenos
Na prática, isso não tinha relação nenhuma com o fato de um app ter centenas de milhões de downloads e usuários, e nesta área existe um incentivo enorme para criar apps inchados
Por exemplo, tive que procurar 9 vezes, incluindo apps com anúncios, para achar um app de termômetro com mais de 7 MB
Trabalhei por anos nas duas plataformas, mas não sei exatamente o motivo; meu palpite é que no Android há uma tradição bem mais forte de arte vetorial do que de bitmaps, e que as bibliotecas Swift, por causa da estabilidade de ABI, precisaram por anos ser compiladas junto com o app até que passassem a usar linkedição dinâmica do lado do sistema operacional
Eu queria poder filtrar por apps pagos, sem anúncios e, às vezes, sem compras no app
Um pouco de lado do tema, mas certa vez escrevi uma revisão de literatura sobre por que as pessoas jogavam Flappy Bird
Na época eu era pós-graduando em estudos de jogos; no fim não segui carreira acadêmica, mas compartilho por diversão
Para quem tiver curiosidade, está aqui [1]
[1] http://www.fdg2015.org/papers/fdg2015_paper_60.pdf
Por um lado, o jogo em si não tem progressão real nem aumento de dificuldade. Não importa se sua pontuação atual é 0, 10 ou 100, a dificuldade continua a mesma
Mas cada novo recorde passa a ser um novo pico a ser superado pelo jogador. O primeiro — e talvez o mais irritante — é fazer 1 ponto; para chegar a pontuações de dois dígitos, é preciso dominar o controle básico com sua física e timing precisos, além de aprender a lidar com várias situações
O obstáculo para chegar a três dígitos ou mais parece quase totalmente autoimposto, e o medo e a tensão ao se aproximar do próprio recorde são o maior obstáculo para superá-lo
Depois que você ultrapassa esse recorde uma vez, o tremor nas mãos magicamente desaparece na próxima vez que se aproxima dele, mas volta a surgir quando você chega perto de um novo recorde
O conceito básico de gameplay é enganosamente simples, mas há muitas camadas para quem quiser examiná-lo
https://www.foddy.net/Athletics.html
Tem menos de 4 mil linhas
457 android_native_app_glue.c
360 audio.c
802 game.c
201 init.c
93 main.c
39 mouse.c
38 shaders.c
229 texture.c
1377 upng.c
27 utils.c
3623 total
Não é um programa tão complexo assim, então sinceramente acho que até 4 mil linhas já é demais
Em 2020 eu fiz e publiquei algo parecido em Nim, embora os gráficos fossem menos bonitos
A diferença é que fui mais a fundo e cheguei a escrever de fato um montador para bytecode Dalvik e arquivos .apk
https://www.youtube.com/watch?v=wr9X5NCwPlI&list=PLxLdEZg8DR...
Infelizmente, o código do repositório quebrou com o tempo, e às vezes penso em tentar revivê-lo algum dia
Às vezes me vêm à cabeça apps que poderiam ser feitos com facilidade se isso estivesse um pouco mais lapidado
Muito legal
É bom ver um app Android com menos de 1 MB rodando em qualquer lugar, até em um HTC antigo
Eu achava que era necessário código de ligação em Java para criar um APK Android, então foi legal ver este projeto
0 arquivos Java é excelente
Também vale a pena dar uma olhada no projeto rawandroid que outras pessoas mencionaram
https://github.com/cnlohr/rawdrawandroid/tree/master
Seja qual for a abordagem, é preciso uma instância de Activity para executar, e dá para criar isso em C também, mas em Java há muito código boilerplate que é resolvido principalmente por herança
Em C puro, faz-se assim: https://github.com/VadimBoev/FlappyBird/blob/master/FlappyBi... https://github.com/VadimBoev/FlappyBird/blob/master/FlappyBi...
Super Mario Bros tinha apenas 40KB
https://news.ycombinator.com/item?id=21213421
Este clone de Flappy Bird roda em incontáveis dispositivos com combinações variadas de hardware e software
Como cabe em um disquete de 3,5 polegadas, perderam a chance de chamar de Floppy Bird
O mais visível é uma versão com mudança simples de skin, usando um ícone de disquete no lugar do pássaro
Claro, ‘angry birds’ vira ‘ongry beards’
Será que essa técnica de fazer aplicações em C para Android com rawdrawandroid poderia ser aplicada a outros frameworks em C, como raylib?
E será que daria para usar esse sistema de desenvolvimento via Termux e criar, sobre o Android, um ambiente de desenvolvimento em C para o próprio Android?
Tenho um script de build meio inacabado que uso no meu projeto com raylib
Obviamente a parte de assinatura precisa ser feita de forma mais adequada, talvez você também queira gerar builds para alvos além de aarch64, e o SDK pode não estar instalado em /home/denis
Também não tenho certeza se adicionar o arquivo .so ao apk é a forma preferida pelo Android moderno, mas ainda funciona
https://gist.github.com/deniska/f1ee73e18e1444eb724c01f933b6...
Se for “para Android”, isso significa que dá para usar Java, e como bytecode pode ser bem compacto, talvez desse para fazer algo ainda menor
Isso não é para desmerecer este projeto baseado em Android. Até porque ele não afirma ser o menor clone de Flappy Bird já feito
[0] https://laroldsjubilantjunkyard.itch.io/flappy-bird-gameboy/...
[1] https://laroldsjubilantjunkyard.itch.io/flappy-bird-gameboy
[2] https://www.youtube.com/watch?v=m839Vg_qXzM
Na minha cabeça, isso deveria dar para reduzir bem mais, e até 10KB soa vagamente plausível