Flappy Bird for Android, only C, under 100KB
github.com
github.com
The fastest, least ad-filled and micropayment filled apps are usually the small ones. By downloading a 3 megabyte thermometer app you'll be much happier than a 150 megabyte thermometer app.
And in any case, Android has had built-in flashlight support for a while now, for any phone that has a camera with a flash. Is the "turn the screen bright white" style still useful with modern Android?
[1]: https://github.com/cyb3rko/flashdim
[2]: https://f-droid.org/en/packages/com.cyb3rko.flashdim/
[3]: https://play.google.com/store/apps/details?id=com.cyb3rko.fl...
They'd ban Mozart and Shakespeare from the app store if they could.
Like, Google, all these megacorps, they are bad, but we should at least argue against their actual arguments.
So then if there happens to be some vulnerabilities in an older Android SDK then your app is susceptible. They could patch back security but that's expensive after a while. Easier to force app makers to update their apps.
We don't support old iOS versions at all. We can't source new devices on old iOS versions so we can't reliably develop or test on them.
Don’t want to speak too negative in regards to the orgs which use it but definitely wouldn’t be the best choice from an engineering perspective for a new project.
Sorry I am not a front end developer. I am a general software engineer please don’t effectively sabotage my career because Silicon Valley wants to make the entire discipline a group of hamsters learning tools which aren’t used by the largest organizations.
If you actually believe that, consider yourself very lucky.
React, like any FE framework, can be implemented well or implemented badly.
React benefits from a very strong (imo the strongest) ecosystem, so if you set up your tooling and patterns correctly its fantastic.
Here's my personal preference: NextJS as the backbone, RTKQ as the central data retrieval/API calls/caching management, RHF for form handling, ag-grid for data grids, and MUI as the component library (can optionally switch this to any equivalent).
If components are designed sufficiently generic and customizable, RTKQ is used to keep data fetching on component instances, and central state storage is avoided as much as possible, it's a great system. Unless you just really hate JSX syntax or something.
There's also currency / unit converter and calendar by Sam Ruston which are in the same vein very good and clean.
The gallery app is superb.
* build a nice product
* become popular and gain trust with customers
* sell the company to a scammer
* profit!
> My customers can follow me to my next project.
If you are willing to sell your customers to an ad firm, why should they trust your next project?
These applications are blessedly feature complete, and I haven't noticed any issues being "stuck" on the F-Droid versions.
[1] https://github.com/SimpleMobileTools/Simple-File-Manager
[2] https://f-droid.org/en/packages/com.simplemobiletools.filema...
Forgot about that!
Even something as silly as an app that does nothing can run into these issues. The APIs and other interfaces used to run applications are imperfect. Sometimes doing nothing about it is a choice, sometimes the vendor doesn't deem that acceptable and then it is no longer a choice. Either way, the application will have to adapt or degrade (to the point where it degrades out of existence).
Changing from using one system API to another shouldn't push an app over an N MB filter anyways. If the user runs into an issue, they can update. Otherwise, if it still works fine just continue to use it.
The argument for updating to keep up with API changes can also be flipped against updating to protect against UI/UX changes. I have lost features from Android updates that I have never been able to get back on my phone, only recreate them on my GNU/Linux desktop.
Often times the hiring managers wanted to see something more akin to a portfolio, like an art project, for apps that many times didn’t exist anymore or have a production server up anymore
But the more arbitrary metric was trying to be sure that I worked on anything “big”
And the 8-12 megabyte package sizes - which I spent a lot of time optimizing with many competence inspiring techniques - would signal that the app or service or userbase wasn't big. Which had nothing to do with anything, could have hundreds of millions of downloads and users
In that space there is a huuuge incentive for bloatware
although a form of affirmation about my experience, and caked in privilege, my experience is that a company that does one odd thing during an interview process isn't indicative of anything. actual job and team I’m on can be fine
i wrote a calculator app including its own implementation of decimal floating point and it's still only 20 kilobytes
2. The Qalculate CLI is 2mb, so perhaps your 20kb calculator could add some features while still being a 100% pure calculator
If you're using Rust and you have to compile in the whole world, probably not gonna be that small.
1. The app was not very optimised, perhaps created by a novice, containing a lot of things it doesn't need.
2. The app used to be really small, but a lot of extra code was added to serve you ads, profile you for better targeting or do sneaky stuff you didn't ask for.
And this is why a good '/S' keeps you safe from misunderstanding.
Let me filter by apps that cost money, are ad free, and sometimes even: don’t have in-app purchases.
(Only partly a joke, etc.)
Does such a thing really exist? Or are you just making a point?
For the curious minds, here it is [1].
On the one hand, there is no actual progression or ramping of difficulty in the game itself. The difficulty level remains the same whether your current score is 0 or 10 or 100. But every new highscore represents a new summit that the player has to scale. The first and maybe the most frustrating summit to scale is scoring a single point. To get your score into the double digits, the player has to have basic mastery of the core mechanics - including the precise physics, and timings- and learn how to handle a certain number of scenarios. The obstacles on the path to triple-digit territory and beyond seem almost self-imposed. The fear and tension as you approach your own highscore is the biggest impediment to breaking your highscore. Once you break that highscore - the hand tremors magically disappear the next time you approach it, only for it to re-appear as you near your new highscore.
All this, when the basic concept of the gameplay is deceptively simple. Like i said, there are many layers to unpack for someone who is willing to look into it.
Asteroids is a quintessential example - relatively flat difficulty curve once you've mastered the game - it really comes down to a test of the player's endurance. Scott Safran set a record game that lasted a grueling 60 hours.
https://en.wikipedia.org/wiki/Scott_Safran
EDIT: Anyone who has EVER tried for a high score (whether a personal best, or a world record) is familiar with the natural nervousness that increases in direct proportion to how close you are to breaking it. That's not a Flappy Bird thing, that's a literal every game thing. Go watch a live stream of a speed runner that's got a heart rate monitor attached to the feed for example.
It's almost more of a game of focus or how much you will _think_, because once you're distracted a bit and forget those physics or timing just one time, you're probably done.
Nonetheless, and for the benefit of the Lucky 10,000, I must present: QWOP.
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 totalSo does making the game work well in more than one device.
The bulk of the 3000 is fluff that you need because this is C on Android, not SFML.
to check:
- dependencies statically compiled-in
- debug symbols
/lib/arm64-v8a/libflappybird.so 48kb
/lib/armeabi-v7a/libflappybird.so 37kb
assets: 29kb
icon: 3kb
signature: 12kb
Plus the manifest (2kb) and resources.arsc (0.5kb)https://www.youtube.com/watch?v=wr9X5NCwPlI&list=PLxLdEZg8DR...
The code in the repo has unfortunately bitrotten. I am sometimes thinking to try and resurrect it Some Day™... from time to time I think of some simple app I could write if it was a bit more polished.
Congrats!
Also worth looking at the rawandroid project like others noted: https://github.com/cnlohr/rawdrawandroid/tree/master
In practice to be usable on a standard Android system, native code must always be compiled to a shared object, with JNI entry points to be called from Java userspace.
The only option is to write such native methods ourselves, or use one of the two predefined Activities for NDK that already expect specific functions to be present on the shared library.
Additionally, the zero Java part only works, if what NDK exposes as stable API is enough, and from Google's point of view, that is only for games, or faster compute, everything else requires JNI fun.
As tip, it is easier to deal with Android IPC for Java <-> NDK communication, than going through JNI boilerplate.
And maybe could this developing system be used through Termux, to have a C development environment on Android for Android?
https://gist.github.com/deniska/f1ee73e18e1444eb724c01f933b6...
This isn't to downplay this Android-based project though. They aren't claiming to have written the most compact Flappy Bird clone.
[0] https://laroldsjubilantjunkyard.itch.io/flappy-bird-gameboy/...
[1] https://laroldsjubilantjunkyard.itch.io/flappy-bird-gameboy
It would not at all surprise me to see a near perfect Flappy Bird under 4k (graphics and all) as a PC .com
I'd be curious to see what the minimum size of a simple C program would be. Say something that displayed a pixel that bounced up and down as you tapped.
Coincidentally, one of my first contributions to the community was a low fidelity "flappy bird" clone in less than 0.5 kb of javascript. Maybe someone will find fascination in my old hobby and its surrounding community:
https://github.com/VadimBoev/FlappyBird/blob/bf3287d90d93ec0...
the smaller the file size the more likely i am to enjoy it. and the opposite is true.
i think part of it is time investment. having less time. i dont see much value in 60gb of 4k graphics textures.
pac man on the atari or snes is maybe less than 100kb, while modern pac man could be easily 10gb or more. same for tetris or any game with the same gameplay that hasn't changed much.
Coincidentally I wrote a small 2048-inspired game just recently, it's under 13 KiB (zipped; the "real" file is about 30 KiB): https://js13kgames.com/2024/games/king-thirteen
If you're interested to check it out, please tell me what you think :)
Beat that! ;)
Off by an order of magnitude! Pac-man sizes:
4K: Atari 2600 (it's bad)
8K: Atari 800
16K: Atari 800 Ms. Pac-Man
24K: Original arcade machine (Z80)
BTW, Atari 2600 "Flappy" (4K):
https://atariage.com/store/index.php?l=product_detail&p=1038Nowadays Google offers a solution for this problem called app bundling. It’s especially good if you build a mono app that behaves differently in certain regions. Instead of delivering a raw apk, you deliver a region specific app bundle.
Sure - there are sometimes a few disabled features in one region or another, but is that really worth shipping a totally different binary for?
Even language packs can be tiny even for 200+ languages if they're pure text.
It's only when you get language/region specific artwork that there's a problem.
I'm wondering, can you debug C apps on Android?
It's a simple solution, but does mean that things are effectively capped at 60fps. The techniques in https://gafferongames.com/post/fix_your_timestep/ could be used to properly allow variable fps while maintaining constant physics speed.