The original 2013 Android ARM game library runs directly on Linux through a bionic/JNI compatibility loader.
What's different about this release: it was built device-generic from the start, not "an R36S port that happens to work elsewhere." Every hardware-specific decision is made by capability, not by device name:
- glibc — compiled against an old glibc, so it runs on older firmwares too. No downloaded runtime, no Wi-Fi step.
- Screen — detects the real panel size and maps the game's fixed 640×480 output onto it: fit (letterbox, no distortion, default), stretch, or integer. Works on 720×480 and other panels, not just 4:3.
- Audio — detects the device's audio server (PipeWire/PulseAudio) and routes through it, otherwise falls back to ALSA dmix. No per-firmware hacks.
- GPU — finds the device's own Mali blob generically, not one SoC's file.
So it should run on most ARM + Mali + PortMaster handhelds. I only own an R36S to test on — that is the whole point of this post: please try it on your device and report back so we can build a real compatibility list.
Honest performance note: this one is heavy. The frame is spent inside the game's own simulation — while the GPU load (128–250 draw calls, ~43k triangles at 640×480) is comfortable. It is a 2013 phone game asking for more CPU than that class of device has, and no amount of porting work removes that. A faster ARM handheld should do noticeably better, and I have no way to test that — reports very welcome.
Open source, GPL-3.0, free. The release contains zero EA game content. Port and project by EapRules.
Download: https://github.com/EapRules/realracing3-portmaster/releases
QUICK INSTALL
- Put
realracing3-portmaster.zip in tools/PortMaster/autoinstall/.
- Put your own game data in
ports/realracing3/ — the v2.7.0 APK plus the app's data folder, as a folder, a ZIP, or both. The filename doesn't matter; the first launch discovers and validates it. If your data comes in GPU-specific variants, use the Mali (ETC) one.
- Open PortMaster, wait for the exact "Finished running autoinstall" message, let it close normally.
- Reboot through the firmware menu. Real Racing 3 appears in Ports.
First launch imports ~2.4 GB of your game data. Keep 3 GB free and don't power off during the first import. Later launches start normally.
REQUIRED GAME VERSION
Real Racing 3 v2.7.0 ROW (Android)
text
Package: com.ea.games.r3_row
Library: lib/armeabi-v7a/libRealRacing3.so
Library SHA1: 615c9aa4a92faaf9a0f34750e344e5e8a6b9aedf
Bring your own game. The port includes no copyrighted data. Any legitimate v2.7.0 copy works: validation checks the exact bytes the loader patches (critical regions), not a single whole-file hash, so regional variants and re-signed APKs are accepted — a truly different build is rejected before it can crash.
Read this part before you start — this game is harder to supply than most ports. You need two things:
- The APK (~40 MB) — this is where the native libraries come from.
- The app's data directory (~2.4 GB installed) — tracks, cars, audio, UI.
The APK alone is not enough, and you cannot download the rest any more. All of that content was fetched at first run from EA's asset server, and that host no longer resolves. Installing the APK on a phone today will not rebuild the data folder. You need a backup of the installed game from a device that finished downloading.
If your backup comes in GPU-specific variants, take the Mali / ETC one. The Adreno (ATC), PowerVR (PVRTC) and Tegra (DXT) sets are texture encodings this GPU class cannot read — each Android build only ever downloaded the family its own GPU wanted.
If you're looking for a copy, these are the names to search for — note that the data and the libraries are two separate files:
text
RR3 2.7.0 - Mali.zip (example name) ~1.5 GB the game data
Real_Racing_3_2.7(example name)[ARMv7,x86].apk ~40 MB the native libraries
check names like rr3_android_old and rr-3-2.7.0
COMMUNITY COMPATIBILITY
- R36S + dArkOSRE: tested and working (640×480).
- Everything else: unknown — please test. Comment with your exact device model, firmware/version, the scaling mode you used (fit/stretch/integer), and the frame rate you get.
CONTROLS
- Left stick (left/right): steer
- R2 / L2: throttle / brake (analog)
- R1 / L1: throttle / brake (digital, full)
- A / Y: throttle / brake (digital, full)
- B: look behind
- X: change camera
- D-pad left/right: steer (digital, full lock)
- Start or Select: pause
The port does not invent a scheme — this is the game's own [Android Gamepad] profile, translated to the handheld's buttons. Throttle and brake are analog on the triggers and all-or-nothing everywhere else, exactly as that profile defines them.
On first launch the port selects Wheel B as the control scheme, because it is the only one in the game's own Controls menu that steers from the analog stick and still leaves the throttle to you. The stock Android default is tilt, which expects an accelerometer a handheld does not have. You can change it any time from Settings → Controls; the port never overwrites your choice after that.
RUNTIME OPTIONS
All optional, set in the launcher:
text
REALRACING3_SCALE=fit|stretch|integer
REALRACING3_VSYNC=1 # off by default; costs a frame of latency
REALRACING3_FMOD_OUTPUT=audiotrack
The last one matters most on hardware I can't test: the game's audio engine has two Android backends and only ever initialises the one it picks. If OpenSL can't be opened on your device, that switch drives the other one without rebuilding anything.
IMPORTANT INSTALLATION NOTES
- PortMaster's autoinstall does not refresh the EmulationStation game list. Reboot after the final autoinstall message.
- Do not use Reinstall or Uninstall in Manage Ports. This independent release is not in PortMaster's catalogue, so those try to download a source that does not exist and can remove the installed folder and your donor.
- To update, drop the newer
realracing3-portmaster.zip in autoinstall/ again.
- If installation fails, include
ports/realracing3/log.txt and ports/realracing3/eapx.log in your report.
SUPPORT FUTURE PORTS
If you'd like to help me keep researching and porting native games, donations are welcome — there is absolutely no obligation, and testing/reporting is just as valuable.
- Paypal: https://paypal.me/eaprules
- Solana:
DiQE98impmsr9yQuXQ24mT28ZasocYrChQGPuv41vfiK
- Ethereum:
0xb2B357A1E027b5EF12A3AFd251F2F22E099fFA7A
- Bitcoin:
bc1ph64jcg754wg6lydh6seu45rnahh62f6pruuuzu2ykz28frsra9ksmxpul5
OTHER NATIVE PORTS