Skip to content

Commit

Permalink
Merge branch 'master' of https://github.com/VadimBoev/FlappyBird
Browse files Browse the repository at this point in the history
  • Loading branch information
VadimBoev committed Oct 4, 2024
2 parents 6272210 + 199d807 commit 70a4ba7
Show file tree
Hide file tree
Showing 3 changed files with 195 additions and 102 deletions.
99 changes: 99 additions & 0 deletions FlappyBird/build.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
#! /bin/bash

export ANDROID_SDK_ROOT=~/Android/Sdk
export ANDROID_NDK_ROOT=~/Android/Sdk/ndk/26.1.10909125
export PATH=$ANDROID_SDK_ROOT/tools:$ANDROID_SDK_ROOT/platform-tools:$PATH

export ADB=~/Android/Sdk/platform-tools/adb

export APKNAME=FlappyBird
export ANDROIDVERSION=34
export ANDROIDTARGET=34

export KEYSTORE_PASSWORD=12345678

echo Cleaning previous builds...
rm -r app/build

echo Creating build directories...
mkdir -p app/build/intermediates/ndk
mkdir -p app/build/outputs/apk

echo Building native code...
cd app/src/main
$ANDROID_NDK_ROOT/ndk-build
ret_code=$?
if [ $ret_code != 0 ]; then
echo Error building native code!
echo Error code: $ret_code
exit $ret_code
fi
cd ../../..

echo Creating empty APK...
$ANDROID_SDK_ROOT/build-tools/30.0.3/aapt package -f -M app/src/main/AndroidManifest.xml -S app/src/main/res -A app/src/main/assets -I $ANDROID_SDK_ROOT/platforms/android-$ANDROIDTARGET/android.jar -F app/build/outputs/apk/unaligned.apk
ret_code=$?
if [ $ret_code != 0 ]; then
echo Error creating empty APK!
echo Error code: $ret_code
exit $ret_code
fi

mkdir lib

echo Copy files from libs to a temporary folder
cp app/src/main/libs/* lib/ -R

echo Add the contents of the temporary folder to the archive in the lib folder
zip app/build/outputs/apk/unaligned.apk -r lib/* lib/

echo Aligning APK...
$ANDROID_SDK_ROOT/build-tools/30.0.3/zipalign -f 4 app/build/outputs/apk/unaligned.apk app/build/outputs/apk/$APKNAME.apk
ret_code=$?
if [ $ret_code != 0 ]; then
echo Error aligning APK!
echo Error code: $ret_code
exit $ret_code
fi

# create a keystore if needed
if [ 0 ]; then
echo y | $JAVA_HOME/bin/keytool -genkeypair \
-dname "cn=Mark Jones, ou=JavaSoft, o=Sun, c=US" \
-alias business \
-keypass $KEYSTORE_PASSWORD \
-keystore mykeystore.jks \
-storepass $KEYSTORE_PASSWORD \
-validity 20000
fi

echo Signing APK...
$ANDROID_SDK_ROOT/build-tools/30.0.3/apksigner sign --ks mykeystore.jks --ks-pass pass:$KEYSTORE_PASSWORD --out app/build/outputs/apk/$APKNAME-signed.apk app/build/outputs/apk/$APKNAME.apk
ret_code=$?
if [ $ret_code != 0 ]; then
echo Error signing APK!
echo Error code: $ret_code
exit $ret_code
fi

echo Delete temporary folder
rm -r lib

echo Deleting unnecessary files...
rm app/build/outputs/apk/$APKNAME.apk
rm app/build/outputs/apk/$APKNAME-signed.apk.idsig
rm app/build/outputs/apk/unaligned.apk

echo APK successfully created: app/build/outputs/apk/$APKNAME-signed.apk

echo Debug moment
echo Clear logcat
$ADB logcat -c
echo Installing APK
$ADB install app/build/outputs/apk/$APKNAME-signed.apk
echo Launching APK
$ADB shell am start -n com.flappybird.game/android.app.NativeActivity
echo Starting logging
$ADB logcat -s flappy

exit
97 changes: 47 additions & 50 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,61 +4,58 @@

[Dev blog in Telegram (ENG/RU)](https://t.me/boevdev)

# Flappy Bird, only C, without Java/Kotlin, weight APK (armeabi-v7a + arm64-v8a) < 100 kilobytes
# 🐦 Flappy Bird in C: APK Size < 100 Kilobytes! 🚀

## History:

It all started in 2021. Then I came across the [rawdrawandroid](https://github.com/cnlohr/rawdrawandroid) repository.
There was a motivation to make some kind of game with the lowest possible APK weight, but at the same time, so that the game would be simple and understandable.
At that moment, the idea came up to make a clone of the long-forgotten Flappy Bird game. Which has already been ported to many programming languages.
Then, later in 2021, I found another interesting repository [Raylib](https://github.com/raysan5/raylib).
But, the first attempt to make this game was in C++, using [ImGui](https://github.com/ocornut/imgui/), because I already knew him.
And so, all the difficulties were presented in Android Native Activity and building a clean APK from apktool without Android Studio.
The first attempt failed.
Firstly, the weight of the APK was about 1 Megabyte.
Secondly, there could be crashes of the game.
Thirdly, there was only a library for armeabi-v7a inside the APK, and since 2022 Google's rules require the presence of arm64-v8a libraries.
Fourthly, the structure of the project and its organization were terrible, it created a mess in the eyes and made it difficult to navigate the project normally.
In general, I tried something, it didn't work out, the thought was stored in my head throughout this time, but no more attempts were made.

## Motivation:

Around September 14, 2024, in the Raylib discord channel, I saw a guy make a Flappy Bird in C#.
Then it became very interesting to me to try a crazy idea, to make this game in C, for Android, with an APK weighing less than 100 Kilobytes.
The idea seemed crazy, as well as unsuccessful.
Just imagine, today, when the weight of the APK reaches 500 Megabytes, you only need to keep less than 100 Kilobytes.
What are these frames for? It's a sporting interest, will it work out? It worked! But it wasn't easy at all.

## Implementation:

At first, I put together a solution that compiled Hello World in C, packaged the library into an APK, everything was signed and sent to my device via USB.
As soon as everything was ready, I went on to explore the resources of the game. The sounds were in ogg format at first, I compressed them, but there were some problems, I don't remember this moment anymore.
Then the sounds still became mp3 format, compressed at 16 (kilobytes per second) each, thereby reducing the weight as much as possible, and the sound quality remained tolerable.
The first difficulty arose if I had previously used [BASS](https://www.un4seen.com/) to play the sound, and it's heavy for my purpose, I had to study OpenSLES, which reads MP3 format without problems.
Further, png images remain from the resources. There is no other way to use the format. Then it was necessary to find something easier than [stb_image](https://github.com/nothings/stb ).
So I came across [upng](https://github.com/elanthis/upng), which completely solved the issue of decoding png files for their further rendering.

In general, everything is simpler than it seems.
OpenGL ES 2 + shaders for rendering, OpenSLES for sounds, upng for decoding png format and of course Android Native Activity.

## Build:
- Download [Visual Studio 2022](https://visualstudio.microsoft.com/)
- - Open Visual Studio Installer
- - Click "Edit"
- - Check the following items: Development of classic applications in C++, Development of mobile applications in C++
- Download Android Studio (we need apktool, sdk, ndk from it)
- - Install NDK 25.2.9519653 (you can use the version above)
- In the project, the setting is made for "Debug ARM", but make changes to build.bat (look at the paths)
- Compile via CTRL + B

## Copyright:
I do not claim copyright. The right to this game and resources belongs to **DotGEARS**.
## 📜 History:

It all started in 2021 when I stumbled upon [rawdrawandroid](https://github.com/cnlohr/rawdrawandroid). My goal was simple: to create a game with the minimal APK size, yet still be understandable and interesting. 🎯

The idea of making a Flappy Bird clone seemed logical, given that this game had already been ported to many languages. 🐤

In 2021, I also studied [Raylib](https://github.com/raysan5/raylib), but my first attempt to make a game in C++ using [ImGui](https://github.com/ocornut/imgui/) failed. 💔

The problems were everywhere: the APK size was around 1 MB, the game crashed, and the APK only contained the armeabi-v7a library (Google's 2022 requirements state that the arm64-v8a library must be included!). 🤯

## 💡 Motivation:

In September 2024, seeing Flappy Bird in C# in the Raylib Discord channel, I decided to try implementing this game in C for Android with an APK size of less than 100 KB. 🚀

The idea seemed crazy, but the competitive interest took over. 💪

## 🛠️ Implementation:

I started by compiling a "Hello World" in C and packaging the library into an APK. 📦

Sounds were compressed to MP3 format, and OpenSLES was used for playback. 🎵

For PNG file decoding, I chose [upng](https://github.com/elanthis/upng). 🖼️

All of this was combined using OpenGL ES 2, shaders, and Android Native Activity. 🎮

## 🔧 Build:

1. Download [Visual Studio 2022](https://visualstudio.microsoft.com/).
2. Install components: C++ Desktop Development and C++ Mobile Development.
3. Download Android Studio (for apktool, sdk, ndk).
4. Install NDK 27.1.12297006.
5. Configure the project for "Debug ARM" and make changes to build.bat.
6. Compile via CTRL + B. 🛠️

## 📄 Copyright:

I do not claim any copyright. The rights to the game and resources belong to **DotGEARS**. 📜

## 🌟 Inspiration:

## Inspiration:
- [rawdrawandroid](https://github.com/cnlohr/rawdrawandroid)
- [Flapper](https://github.com/its-Lyn/Flapper)
- [Raylib](https://github.com/raysan5/raylib)
- [ImGui](https://github.com/ocornut/imgui/)

## Star History
## 🌠 Star History

[![Star History Chart](https://api.star-history.com/svg?repos=VadimBoev/FlappyBird&type=Timeline)](https://star-history.com/#VadimBoev/FlappyBird&Timeline)

---

🎉 Enjoy the game and don't forget to star it! 🌟
101 changes: 49 additions & 52 deletions README_RU.md
Original file line number Diff line number Diff line change
@@ -1,58 +1,55 @@
# Flappy Bird, только Си, без Java/Kotlin, вес APK (armeabi-v7a + arm64-v8a) < 100 kilobytes

## История:

Всё началось в 2021 году. Тогда я наткнулся на репозиторий [rawdrawandroid](https://github.com/cnlohr/rawdrawandroid).
Появилась мотивация сделать какую-нибудь игру с максимально меньшим весом APK, но при этом, что бы игра была простой и понятной.
В моменте появилась идея сделать клон давно забытой игры Flappy Bird. Которую уже портировали на многие языки программирования.
Тогда, позднее в 2021 году, я нашел ещё один интересный репозиторий [Raylib](https://github.com/raysan5/raylib).
Но, первая попытка сделать эту игру была на C++, при использовании [ImGui](https://github.com/ocornut/imgui/), потому что я уже был с ним знаком.
А так, все трудности были представлены в Android Native Activity и сборке чистого APK из apktool без Android Studio.
Первая попытка потерпела крах.
Во-первых, вес APK был примерно 1 Мегабайт.
Во-вторых, могли случаться вылеты игры.
В-третьих, внутри APK была только библиотека для armeabi-v7a, а с 2022 года правила Google требуют наличие arm64-v8a библиотек.
В-четвертых, структура проекта и его организация были ужасными, это создавало кашу в глазах и мешало нормально ориентироваться в проекте.
В целом, что-то попробовал, не получилось, мысль в голове хранилась на протяжении всего этого времени, но попыток больше не предпринималось.

## Мотивация:

Примерно 14 сентября 2024 года, в дискорд-канале Raylib я увидел как один парень сделал Flappy Bird на языке C#.
Тогда мне стало очень интересно, попробовать безумную идею, сделать эту игру на Си, для Android, весом APK меньше 100 Килобайт.
Идея казалось безумной, а также, безуспешной.
Просто представьте, сегодня, когда вес APK достигает по 500 Мегабайт, нужно уложиться всего лишь меньше, чем 100 Килобайт.
Для чего такие рамки? Это спортивный интерес, получится ли такое? Получилось! Но было совсем не просто.

## Реализация:

По началу я собрал себе решение которое компилировало Hello World на Си, упаковывало библиотеку в APK, всё подписывалось и отправлялось мне на устройство по USB.
Как только всё было готово, дальше я пошел изучать ресурсы игры. Звуки сначала были в формате ogg, я их сжал, но были какие-то проблемы, я уже не помню этот момент.
Дальше звуки всё же стали форматом mp3, сжатым по 16 (килобайт в секунду) каждый, тем самым максимально уменьшив вес, а также качество звука оставалось терпимым.
Возникла первая трудность, если раньше для воспроизведения звука я использовал [BASS](https://www.un4seen.com/), а он тяжелый для моей цели, то пришлось изучить OpenSLES который без проблем читает формат MP3.
Дальше из ресурсов остаются картинки, формата png. Иного вариант использования формата нет. Тогда надо было найти что-то легче, чем [stb_image](https://github.com/nothings/stb).
Так я наткнулся на [upng](https://github.com/elanthis/upng), которая полностью решила вопрос с декодированием png файлов для дальнейшего их рендера.

В целом всё проще чем кажется.
OpenGL ES 2 + шейдеры для отрисовки, OpenSLES для звуков, upng для декодирования png формата и конечно же Android Native Activity.

## Сборка:
- Скачайте [Visual Studio 2022](https://visualstudio.microsoft.com/)
- - Откройте Visual Studio Installer
- - Нажмите "Изменить"
- - Отметьте пункты: Разработка классических приложений на С++, Разработка мобильных приложений на языке С++
- Скачайте Android Studio (от него нам нужен apktool, sdk, ndk)
- - Установите NDK 25.2.9519653 (можно версию выше)
- В проекте настройка сделана для "Debug ARM", но внесите изменения в build.bat (посмотрите пути)
- Компилируйте через CTRL + B

## Авторское право:
Я не претендую на авторское право. Право на эту игру и ресурсы принадлежит **DotGEARS**.

## Вдохновление:
# 🐦 Flappy Bird на Си: Вес APK < 100 Килобайт! 🚀

## 📜 История:

Всё началось в 2021 году, когда я наткнулся на [rawdrawandroid](https://github.com/cnlohr/rawdrawandroid). Моя цель была проста: создать игру с минимальным весом APK, но при этом, чтобы она была понятной и интересной. 🎯

Идея сделать клон Flappy Bird казалась логичной, учитывая, что эта игра уже была портирована на множество языков. 🐤

В 2021 году я также изучил [Raylib](https://github.com/raysan5/raylib), но первая попытка сделать игру на C++ с использованием [ImGui](https://github.com/ocornut/imgui/) потерпела неудачу. 💔

Проблемы были везде: вес APK был около 1 МБ, игра вылетала, и в APK была только библиотека для armeabi-v7a (требования Google от 2022 года это наличие arm64-v8a библиотеки!). 🤯

## 💡 Мотивация:

В сентябре 2024 года, увидев Flappy Bird на C# в дискорд-канале Raylib, я решил попробовать реализовать эту игру на Си для Android с весом APK менее 100 КБ. 🚀

Идея казалась безумной, но спортивный интерес взял верх. 💪

## 🛠️ Реализация:

Начал с компиляции "Hello World" на Си и упаковки библиотеки в APK. 📦

Звуки были сжаты до формата MP3, а для их воспроизведения использовался OpenSLES. 🎵

Для декодирования PNG файлов я выбрал [upng](https://github.com/elanthis/upng). 🖼️

Всё это было объединено с помощью OpenGL ES 2, шейдеров и Android Native Activity. 🎮

## 🔧 Сборка:

1. Скачайте [Visual Studio 2022](https://visualstudio.microsoft.com/).
2. Установите компоненты: Разработка классических приложений на С++ и Разработка мобильных приложений на языке С++.
3. Скачайте Android Studio (для apktool, sdk, ndk).
4. Установите NDK 27.1.12297006.
5. Настройте проект для "Debug ARM" и внесите изменения в build.bat.
6. Компилируйте через CTRL + B. 🛠️

## 📄 Авторское право:

Я не претендую на авторские права. Право на игру и ресурсы принадлежит **DotGEARS**. 📜

## 🌟 Вдохновение:

- [rawdrawandroid](https://github.com/cnlohr/rawdrawandroid)
- [Flapper](https://github.com/its-Lyn/Flapper)
- [Raylib](https://github.com/raysan5/raylib)
- [ImGui](https://github.com/ocornut/imgui/)

## Star History
## 🌠 Star History

[![Star History Chart](https://api.star-history.com/svg?repos=VadimBoev/FlappyBird&type=Timeline)](https://star-history.com/#VadimBoev/FlappyBird&Timeline)

---

🎉 Наслаждайтесь игрой и не забудьте поставить звезду! 🌟

0 comments on commit 70a4ba7

Please sign in to comment.