Flappy Bird pour Android, écrit en C, sous les 100 Ko
(github.com/VadimBoev)- Ce projet vise à implémenter un clone de Flappy Bird pour Android en C tout en réduisant la taille de l’APK à moins de 100 Ko
- Après avoir découvert rawdrawandroid en 2021, l’auteur voulait créer un jeu avec un petit APK, et le fait d’avoir vu un Flappy Bird en C# sur le Discord de Raylib en septembre 2024 a déclenché la tentative d’une implémentation en C
- L’implémentation consiste à empaqueter dans l’APK une bibliothèque native écrite en C, en combinant OpenGL ES 2, des shaders et Android Native Activity
- Le son est compressé en MP3 et lu avec OpenSLES, tandis que upng est utilisé pour le décodage PNG
- La compilation prend en charge Visual Studio Code sous Windows et un Makefile sous Linux/macOS, et il est précisé que les droits sur le jeu et les ressources appartiennent à DotGEARS
Objectif et contexte du projet
- Flappy Bird in C est un projet qui vise à écrire un clone de Flappy Bird en C pour Android tout en maintenant la taille de l’APK à moins de 100 Ko
- Le point de départ a été rawdrawandroid, découvert en 2021, avec pour objectif de créer un jeu à la fois compréhensible et intéressant tout en minimisant la taille de l’APK
- Comme Flappy Bird a déjà été porté dans de nombreux langages, il s’est naturellement imposé comme cible pour un clone
Tentatives précédentes et problèmes
- En 2021, l’auteur étudiait Raylib et une première tentative de créer le jeu en C++ avec ImGui a échoué
- Les problèmes rencontrés à l’époque étaient multiples
- La taille de l’APK était d’environ 1 Mo
- Le jeu plantait
- L’APK n’incluait qu’une bibliothèque armeabi-v7a
- Les exigences de Google pour 2022 imposaient aussi l’inclusion d’une bibliothèque arm64-v8a
Ce qui a motivé la reprise en 2024
- Après avoir vu un Flappy Bird en C# sur le canal Discord de Raylib en septembre 2024, l’auteur a entrepris d’implémenter Flappy Bird pour Android en C et de faire passer l’APK sous les 100 Ko
- L’objectif paraissait irréaliste, mais l’intérêt du défi a servi de moteur à l’implémentation
Méthode d’implémentation
- Le point de départ a consisté à compiler un Hello World écrit en C puis à empaqueter la bibliothèque obtenue dans un APK
- Le son est compressé au format MP3 et lu à l’aide d’OpenSLES
- Pour le décodage des fichiers PNG, le choix s’est porté sur upng
- La partie graphique et l’intégration Android s’appuient conjointement sur OpenGL ES 2, des shaders et Android Native Activity
Méthode de build
- Sous Windows, l’environnement de référence est Visual Studio Code
- Créer
.envà partir de.env.example - Exécuter
build.bat
- Créer
- Sous Linux et macOS, la compilation est possible avec le Makefile fourni
- L’installation des Android command-line tools est nécessaire
- Définir les variables d’environnement dans le fichier
.envà la racine du projet - Après
cd FlappyBird, exécutermake
- Pour une procédure de build plus détaillée, il est indiqué de consulter
BUILDING.md - L’APK signé est généré dans
FlappyBird/app/build/outputs/apk/FlappyBird-signed.apk
Droits d’auteur et projets de référence
- L’auteur du projet ne revendique aucun droit d’auteur et précise que les droits sur le jeu et les ressources appartiennent à DotGEARS
- Les projets ayant servi d’inspiration sont les suivants
1 commentaires
Avis de Hacker News
J’aimerais qu’il y ait dans les app stores un filtre n’afficher que les apps de moins de 10 Mo
Les apps les plus rapides, avec le moins de publicité et de microtransactions, sont généralement les petites apps
On a bien plus de chances d’être satisfait en téléchargeant une app de thermomètre de 3 Mo qu’une app de thermomètre de 150 Mo
Ces apps étaient vraiment minuscules, toutes sous les 200 Ko
Les recruteurs demandaient souvent des réalisations à montrer, comme un portfolio artistique, même pour des apps qui n’existaient plus ou dont les serveurs de production étaient hors ligne
Le critère encore plus arbitraire consistait à vérifier si l’on avait travaillé sur une grosse app ; si l’on utilisait beaucoup de techniques d’optimisation qui semblaient démontrer de la compétence pour obtenir un paquet de 8 à 12 Mo, c’était interprété comme le signe que l’app, le service ou la base d’utilisateurs étaient petits
En réalité, même avec des centaines de millions de téléchargements et d’utilisateurs, cela n’avait aucun rapport avec ce critère, et dans ce domaine les incitations à produire des apps boursouflées sont énormes
Par exemple, il m’a fallu chercher jusqu’à neuf fois, pubs comprises, pour trouver une app de thermomètre dépassant 7 Mo
J’ai travaillé plusieurs années sur les deux plateformes, mais je ne connais pas la raison exacte ; à vue de nez, c’est peut-être parce qu’Android a une tradition beaucoup plus forte de vector art que de bitmaps, et parce que les bibliothèques Swift, grâce à la stabilité de l’ABI, ont dû être compilées avec les apps pendant plusieurs années avant d’utiliser la liaison dynamique côté système d’exploitation
J’aimerais pouvoir filtrer les apps payantes, sans publicité, et parfois même sans achats intégrés
C’est un peu une digression, mais j’ai écrit autrefois une revue de littérature sur les raisons pour lesquelles les gens jouaient à Flappy Bird
J’étais alors doctorant en études du jeu vidéo ; je n’ai finalement pas poursuivi dans le monde universitaire, mais je partage ça pour le plaisir
Pour les curieux, c’est ici [1]
[1] http://www.fdg2015.org/papers/fdg2015_paper_60.pdf
D’un côté, le jeu lui-même n’a pas de véritable progression ni d’augmentation de la difficulté. Que le score actuel soit 0, 10 ou 100, la difficulté reste la même
Mais chaque nouveau record devient un nouveau sommet à franchir pour le joueur. Le premier, et peut-être le plus agaçant, consiste à marquer 1 point ; pour atteindre un score à deux chiffres, il faut en gros maîtriser les contrôles essentiels, avec la physique et le timing exacts, et apprendre à gérer plusieurs situations
Les obstacles qui empêchent d’atteindre trois chiffres ou plus semblent presque auto-générés : la peur et la tension ressenties à l’approche de son record personnel deviennent le plus grand obstacle à son dépassement
Une fois ce record battu, les tremblements disparaissent comme par magie la prochaine fois qu’on s’en approche, mais réapparaissent à l’approche d’un nouveau record
Le concept de gameplay de base est d’une simplicité trompeuse, mais il comporte beaucoup de couches à décortiquer pour qui veut s’y pencher
https://www.foddy.net/Athletics.html
Ça fait moins de 4 000 lignes
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
Ce n’est pas un programme si complexe que ça, donc honnêtement, je trouve que 4 000 lignes, c’est déjà trop
En 2020, j’ai créé et publié quelque chose de similaire en Nim, même si les graphismes étaient moins jolis
La différence, c’est que je suis allé plus loin et que j’ai réellement écrit un assembleur pour le bytecode Dalvik et les fichiers .apk
https://www.youtube.com/watch?v=wr9X5NCwPlI&list=PLxLdEZg8DR...
Le code du dépôt s’est malheureusement cassé avec le temps, et il m’arrive de penser à le ressusciter un jour
Il y a des moments où une app simple que je pourrais faire me vient à l’esprit, si seulement tout cela était un peu plus peaufiné
Vraiment excellent
C’est agréable de voir une app Android de moins de 1 Mo tourner partout, même sur un vieux HTC
Je pensais qu’il fallait du code de liaison Java pour créer un APK Android, donc ce projet est une bonne surprise
0 fichier Java, c’est excellent
Le projet rawandroid mentionné par d’autres vaut aussi le coup d’œil
https://github.com/cnlohr/rawdrawandroid/tree/master
Quoi que l’on fasse, il faut une instance d’Activity pour l’exécuter ; on peut aussi la créer en C, mais cela demande beaucoup de code passe-partout qui, en Java, est en grande partie géré par héritage
En C pur, cela se fait comme ceci : https://github.com/VadimBoev/FlappyBird/blob/master/FlappyBi... https://github.com/VadimBoev/FlappyBird/blob/master/FlappyBi...
Super Mario Bros ne faisait que 40 Ko
https://news.ycombinator.com/item?id=21213421
Ce clone de Flappy Bird tourne sur un nombre incalculable d’appareils aux configurations matérielles et logicielles très diverses
Comme il tient sur une disquette 3,5 pouces, ils ont raté l’occasion de l’appeler Floppy Bird
Le plus visible est une simple version reskinnée qui utilise une icône de disquette à la place de l’oiseau
Et bien sûr, « angry birds » devient « ongry beards »
Cette technique de création d’applications C pour Android avec rawdrawandroid pourrait-elle s’appliquer à d’autres frameworks C comme raylib ?
Et pourrait-on utiliser ce système de développement via Termux pour créer, sur Android, un environnement de développement C ciblant Android ?
J’ai un script de build un peu inachevé que j’utilise pour mes projets raylib
Évidemment, il faudrait gérer la signature plus proprement, vouloir éventuellement compiler pour des cibles autres que aarch64, et il se peut aussi que le SDK ne soit pas installé dans /home/denis
Je ne suis pas non plus certain que la façon d’ajouter le fichier .so à l’apk soit celle que privilégie Android moderne, mais cela fonctionne encore
https://gist.github.com/deniska/f1ee73e18e1444eb724c01f933b6...
« Pour Android » signifie qu’on peut utiliser Java, et comme le bytecode peut être très compact, on devrait pouvoir faire encore plus petit
Cela ne vise pas à déprécier ce projet Android. Il ne prétend pas non plus avoir créé le plus petit clone de Flappy Bird
[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
Intuitivement, j’aurais pensé qu’on pouvait descendre bien plus bas, et 10 Ko me paraît vaguement réaliste