Flappy Bird für Android, in C geschrieben, unter 100 KB
(github.com/VadimBoev)- Dieses Projekt zielt darauf ab, einen Flappy-Bird-Klon für Android in C zu implementieren und die APK-Größe auf unter 100 KB zu reduzieren
- Nach der Entdeckung von rawdrawandroid im Jahr 2021 wollte der Autor ein Spiel mit kleiner APK erstellen; der Anstoß für den C-Implementierungsversuch kam im September 2024 durch ein C#-Flappy-Bird im Raylib-Discord
- Die Umsetzung erfolgt, indem eine in C geschriebene Native Library in die APK gepackt und mit OpenGL ES 2, Shadern und Android Native Activity kombiniert wird
- Der Sound wird als MP3 komprimiert und mit OpenSLES abgespielt; für das PNG-Decoding wird upng verwendet
- Der Build unterstützt Visual Studio Code unter Windows sowie ein Makefile unter Linux/macOS; außerdem wird ausdrücklich darauf hingewiesen, dass die Rechte am Spiel und an den Ressourcen bei DotGEARS liegen
Projektziel und Hintergrund
- Flappy Bird in C ist ein Projekt, das einen Flappy-Bird-Klon für Android in C schreibt und die APK-Größe auf unter 100 KB halten will
- Ausgangspunkt war rawdrawandroid, das der Autor 2021 entdeckte; das Ziel war, die APK-Größe zu minimieren und zugleich ein verständliches und interessantes Spiel zu bauen
- Da Flappy Bird bereits in viele Sprachen portiert wurde, bot es sich ganz natürlich als Vorlage für einen Klon an
Frühere Versuche und Probleme
- 2021 lernte der Autor Raylib und der erste Versuch, mit ImGui ein Spiel in C++ zu erstellen, scheiterte
- Die Probleme damals waren vielfältig
- Die APK war etwa 1 MB groß
- Das Spiel stürzte ab
- In der APK war nur die Bibliothek armeabi-v7a enthalten
- Wegen der Google-Anforderungen von 2022 musste auch eine arm64-v8a-Bibliothek enthalten sein
Motivation für den neuen Versuch 2024
- Nachdem der Autor im September 2024 im Raylib-Discord-Kanal ein C# Flappy Bird gesehen hatte, begann er den Versuch, Flappy Bird für Android in C umzusetzen und die APK unter 100 KB zu halten
- Das Ziel wirkte unrealistisch, aber genau dieser sportliche Ehrgeiz wurde zum Antrieb für die Umsetzung
Umsetzungsansatz
- Gestartet wurde damit, ein in C geschriebenes Hello World zu kompilieren und die entsprechende Bibliothek in eine APK zu packen
- Der Sound wird im MP3-Format komprimiert und mit OpenSLES abgespielt
- Für das Decoding von PNG-Dateien fiel die Wahl auf upng
- Für Grafik und Android-Integration werden OpenGL ES 2, Shader und Android Native Activity gemeinsam eingesetzt
Build-Methode
- Unter Windows dient Visual Studio Code als Referenzumgebung
- Aus
.env.examplewird eine.enverzeugt build.batwird ausgeführt
- Aus
- Unter Linux und macOS kann mit dem bereitgestellten Makefile gebaut werden
- Die Installation der Android command-line tools ist erforderlich
- Umgebungsvariablen werden in der Datei
.envim Projekt-Root gesetzt - Nach
cd FlappyBirdwirdmakeausgeführt
- Für detailliertere Build-Schritte wird auf
BUILDING.mdverwiesen - Die signierte APK wird unter
FlappyBird/app/build/outputs/apk/FlappyBird-signed.apkerzeugt
Urheberrecht und Referenzprojekte
- Der Projektautor erhebt keinen Urheberrechtsanspruch und weist darauf hin, dass die Rechte am Spiel und an den Ressourcen bei DotGEARS liegen
- Als Inspirationsquellen werden folgende Projekte genannt
1 Kommentare
Hacker-News-Kommentare
Ich wünschte, es gäbe im App Store einen Filter nur Apps unter 10 MB anzeigen
Die schnellsten Apps mit der wenigsten Werbung und den wenigsten Mikrotransaktionen sind meistens kleine Apps
Mit einer 3-MB-Thermometer-App ist man wahrscheinlich deutlich zufriedener als mit einer Thermometer-App mit 150 MB
Diese Apps waren alle wirklich klein, jeweils unter 200 KB
Recruiter wollten oft vorzeigbare Ergebnisse wie in einem Kunstportfolio sehen, selbst wenn die Apps schon lange nicht mehr existierten oder die Backend-Server abgeschaltet waren
Noch willkürlicher war das Kriterium, ob man schon einmal an einer großen App gearbeitet hatte, und wenn man viele beeindruckend wirkende Optimierungstechniken nutzte und am Ende ein Paket von 8 bis 12 MB herauskam, wurde das eher als Zeichen dafür gesehen, dass App, Dienst und Nutzerbasis klein seien
In Wirklichkeit hatte das nichts damit zu tun, selbst wenn es Hunderte Millionen Downloads und Nutzer gab, und in diesem Bereich gibt es enorme Anreize, aufgeblähte Apps zu bauen
Ich musste zum Beispiel neun werbefinanzierte Thermometer-Apps durchsuchen, bevor ich eine über 7 MB gefunden habe
Ich habe mehrere Jahre auf beiden Plattformen gearbeitet, kenne den genauen Grund aber nicht; meine Vermutung ist, dass Android eine viel stärkere Tradition von Vektorgrafiken statt Bitmaps hat und dass Swift-Bibliotheken wegen ABI-Stabilität über Jahre hinweg zusammen mit der App kompiliert werden mussten, bevor dynamisches Linking gegen das Betriebssystem möglich wurde
Ich hätte gern einen Filter für kostenpflichtige Apps ohne Werbung und manchmal auch ohne In-App-Käufe
Etwas off topic, aber ich habe einmal einen Literaturüberblick darüber geschrieben, warum Menschen Flappy Bird spielen
Damals war ich Masterstudent in Game Studies; ich bin am Ende nicht in der Wissenschaft geblieben, teile es aber zum Spaß
Für Interessierte ist es hier [1]
[1] http://www.fdg2015.org/papers/fdg2015_paper_60.pdf
Einerseits gibt es im Spiel selbst keinen echten Fortschritt und keine steigende Schwierigkeit. Ob dein aktueller Punktestand 0, 10 oder 100 ist, die Schwierigkeit bleibt gleich
Aber jedes neue Highscore wird zu einem neuen Gipfel, den der Spieler überwinden muss. Der erste und vielleicht frustrierendste Gipfel ist, überhaupt 1 Punkt zu erreichen; um in den zweistelligen Bereich zu kommen, muss man die Kernsteuerung mit ihrer präzisen Physik und dem Timing im Grunde beherrschen und lernen, mit verschiedenen Situationen umzugehen
Die Hürde auf dem Weg zu drei Stellen oder mehr scheint fast vollständig selbst erzeugt zu sein, und Angst und Anspannung kurz vor dem eigenen Highscore sind das größte Hindernis, ihn zu übertreffen
Hat man diesen Highscore einmal geknackt, verschwindet das Zittern in den Händen beim nächsten Mal fast wie von Zauberhand, taucht aber wieder auf, sobald man sich einem neuen Highscore nähert
Das grundlegende Gameplay-Konzept ist täuschend einfach, hat aber viele Schichten für alle, die genauer hinsehen wollen
https://www.foddy.net/Athletics.html
Weniger als 4.000 Zeilen
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
So komplex ist das Programm nicht, deshalb finde ich ehrlich gesagt sogar 4.000 Zeilen noch zu viel
Ich habe 2020 etwas Ähnliches in Nim gebaut und veröffentlicht, die Grafik war aber weniger hübsch
Der Unterschied war, dass ich tiefer eingestiegen bin und tatsächlich sogar einen Assembler für Dalvik-Bytecode und .apk-Dateien geschrieben habe
https://www.youtube.com/watch?v=wr9X5NCwPlI&list=PLxLdEZg8DR...
Der Code im Repository ist leider mit der Zeit kaputtgegangen, und ich denke manchmal darüber nach, ihn irgendwann wiederzubeleben
Manchmal fällt mir eine App ein, die sich mit etwas mehr Feinschliff leicht bauen ließe
Wirklich cool
Es ist schön zu sehen, wie Android-Apps unter 1 MB selbst auf alten HTC-Geräten überall laufen
Ich dachte, man brauche Java-Bindungscode, um eine Android-APK zu erstellen, daher gefällt mir dieses Projekt
0 Java-Dateien ist großartig
Das rawandroid-Projekt, das andere erwähnt haben, ist ebenfalls einen Blick wert
https://github.com/cnlohr/rawdrawandroid/tree/master
Egal was man tun will, zum Ausführen braucht man eine Activity-Instanz, und man kann sie auch in C erstellen, aber dann ist viel Boilerplate nötig, die in Java größtenteils per Vererbung erledigt wird
In reinem C macht man es so: https://github.com/VadimBoev/FlappyBird/blob/master/FlappyBi... https://github.com/VadimBoev/FlappyBird/blob/master/FlappyBi...
Super Mario Bros war nur 40 KB groß
https://news.ycombinator.com/item?id=21213421
Dieser Flappy-Bird-Klon läuft auf unzähligen Geräten, deren Hardware- und Software-Konfigurationen alle unterschiedlich sind
Es passt auf eine 3,5-Zoll-Diskette, also hat man die Chance verpasst, es Floppy Bird zu nennen
Am auffälligsten ist eine einfache Reskin-Version, die statt eines Vogels ein Disketten-Icon verwendet
Natürlich wird „angry birds“ dann zu „ongry beards“
Könnte diese Technik, mit rawdrawandroid C-Anwendungen für Android zu bauen, auch auf andere C-Frameworks wie raylib angewendet werden?
Und könnte man mit diesem Entwicklungssystem über Termux sogar eine C-Entwicklungsumgebung für Android auf Android selbst bauen?
Ich habe ein etwas unfertiges Build-Skript, das ich für mein raylib-Projekt verwende
Natürlich müsste die Signierung sauberer gelöst werden, man möchte vielleicht auch andere Ziele als aarch64 bauen, und das SDK ist möglicherweise nicht unter /home/denis installiert
Außerdem bin ich nicht sicher, ob das Hinzufügen von .so-Dateien zur apk die von modernem Android bevorzugte Methode ist, aber es funktioniert noch
https://gist.github.com/deniska/f1ee73e18e1444eb724c01f933b6...
Wenn es „für Android“ ist, heißt das doch, dass man Java verwenden kann, und Bytecode kann sehr kompakt sein, also müsste es noch kleiner gehen
Das soll dieses Android-basierte Projekt aber nicht kleinreden. Es behauptet ja auch nicht, der kleinste Flappy-Bird-Klon zu sein
[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
In meinem Kopf müsste es noch deutlich weiter runtergehen, und sogar 10 KB klingt vage realistisch