4 Punkte von GN⁺ 2024-09-23 | 1 Kommentare | Auf WhatsApp teilen
  • 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.example wird eine .env erzeugt
    • build.bat wird ausgeführt
  • 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 .env im Projekt-Root gesetzt
    • Nach cd FlappyBird wird make ausgeführt
  • Für detailliertere Build-Schritte wird auf BUILDING.md verwiesen
  • Die signierte APK wird unter FlappyBird/app/build/outputs/apk/FlappyBird-signed.apk erzeugt

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

 
GN⁺ 2024-09-23
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

    • Früher gab es einen Publisher im Play Store, der winzige Apps wie Taschenlampe, Sudoku und Kalender mit nur einstelligen KB-Größen veröffentlicht hat, aber ich kann ihn heute nicht mehr finden
      Diese Apps waren alle wirklich klein, jeweils unter 200 KB
    • Das erinnert mich an einen der Gründe, warum ich keine mobilen Apps mehr entwickelt habe
      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 finde es immer noch erstaunlich, dass Android-Apps oft deutlich kleiner sind
      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
    • Für mich ist das rote Warnsignal, dass die Apps alle kostenlos sind
      Ich hätte gern einen Filter für kostenpflichtige Apps ohne Werbung und manchmal auch ohne In-App-Käufe
    • Im Aurora Store kann man zumindest nach kostenpflichtig, In-App-Käufe und enthält Werbung filtern
  • 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

    • Ich hatte immer das Gefühl, dass hinter der berüchtigten Schwierigkeitskurve von Flappy Bird etwas Interessantes steckt, das tiefer erforscht werden sollte
      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
    • „Es wird vermutet, dass die Konditionierung durch mehrere kognitive Verzerrungen verstärkt wird, die Spieler dazu verleiten, einen Glückszustand, also einen Liking-Pfad, zu erwarten, obwohl sie tatsächlich Frustration erfahren. Wenn diese Konditionierung wiederholt wird, werden Spieler darauf eingestimmt, fast auf instinktiver Ebene mit dem Spiel zu interagieren. Wir glauben, dass die Stimulierung dieser Wanting-Pfade dazu führen kann, dass Spieler interagieren, ohne das Spiel tatsächlich zu mögen oder überhaupt zu wissen, warum sie es spielen. Tatsächlich deutet dies darauf hin, dass weitere Parallelen zwischen Drogenabhängigkeit und spielerischem Verhalten gezogen werden müssen, bei dem Liking kaum sichtbar ist“
    • Wenn das der Hintergrund ist, hast du es sehr wahrscheinlich schon gesehen, aber für die glücklichen 10.000 muss ich trotzdem QWOP erwähnen
      https://www.foddy.net/Athletics.html
    • Als Flappy-Bird-Experte würde ich sagen: weil Menschen Polynomapproximation mögen
  • 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

    • Mein Student bekam die Aufgabe, mit SFML ein Spiel zu bauen, und hat einen Flappy-Bird-Klon in ein paar hundert Zeilen geschrieben
      So komplex ist das Programm nicht, deshalb finde ich ehrlich gesagt sogar 4.000 Zeilen noch zu viel
    • Schade, dass aus 4.000 Zeilen Code nach dem Kompilieren ein Binary von über 100 KB wird
  • 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

    • Eine Einschätzung, wie groß der Geschwindigkeitsgewinn ist, wäre auch schön
  • 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

  • Super Mario Bros war nur 40 KB groß
    https://news.ycombinator.com/item?id=21213421

    • Das wurde allerdings für genau eine Hardware-Spezifikation gebaut und lief praktisch ohne Betriebssystem
      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

    • Das dachte ich auch, aber leider haben sich schon einige Klone diesen Namen gesichert
      Am auffälligsten ist eine einfache Reskin-Version, die statt eines Vogels ein Disketten-Icon verwendet
    • In Argentinien nennt es ohnehin jeder „floppy beard“
      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?

    • Ja, das geht. raylib unterstützt Android
      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