DriftDroid
DriftDroid is a native Android port of Mario Kart Wii that runs as ARM64 code with touch controls and motion steering.
- Type: PC port
- Game: Mario Kart Wii
- Runs on Windows, Linux and Android
- By dorPXP
- Latest release v1.4.0, 2026-11-02
- Source: https://github.com/dorPXP/driftdroid
README
DriftDroid
A native Android port of WiiCompiled, a static recompilation of Mario Kart Wii to native code. This fork adds everything the game needs to be a phone app: touch controls, motion steering, a mobile settings menu and a launcher. The Android APK includes the translated game code but none of the game's files (courses, music, textures): those always come from your own disc. DriftDroid Builder, a Windows and Linux program, makes the Switch version, and an optional Android game pack with the newest Retro Rewind code, from your own disc.
There's no emulator in the loop, no interpreter, no JIT, no PowerPC anywhere at runtime - the game runs as translated native ARM64 code, same as the original desktop project.
Important
There is no Nintendo code, no assets and no game data anywhere in this project or its releases. You need your own legally dumped copy of the PAL version of the game. Nothing in this repo, in any release APK, or in the build process contains or downloads Nintendo IP.
Status
DriftDroid is playable end to end: install the APK and pick your own disc image on the phone for the game's data. No PC is needed on Android. (A PC with DriftDroid Builder is needed for Switch, and optional on Android for the newest Retro Rewind code.)
- Races, menus, audio, saves and online play work, with touch controls or a physical controller.
- Both Original Mario Kart Wii and Retro Rewind are supported, chosen from the launcher screen. Retro Rewind 6.13.4 is the version this release runs.
- The game code is in the APK. DriftDroid Builder can also translate and compile it on your PC from your own disc into a game pack (one zip) that the app imports and prefers: that is how a newer Retro Rewind is supported before a new DriftDroid release.
- The game data comes from your disc, on the phone: pick your disc image
and DriftDroid verifies it's a clean PAL
RMCP01disc and extracts it.
It is still an active, personal fork rather than a finished product. Expect rough edges, and expect performance to vary a lot between devices - see Performance.
What it does
Native rendering via aurora. The graphics layer is built on aurora, a source-level GameCube & Wii compatibility layer, running on Vulkan through Google's Dawn.
An OpenGL ES fallback. Some phones ship a Vulkan driver too broken to start the game at all. The launcher's Graphics... screen can switch the renderer to OpenGL ES for those devices. It is slower than Vulkan by nature - OpenGL only lets one thread talk to the GPU, so shaders compile on the render thread and the multithreaded graphics path is unavailable - so leave it on Automatic unless Vulkan doesn't work for you.
Touch controls, tuned for Mario Kart Wii specifically. Drag-anywhere steering joystick, GameCube-diamond-style face buttons, D-Pad (needed for bike wheelies), and L/R for items and drift. In the layout editor (Settings > Controls > Edit touch layout) you drag buttons to move them, pinch to resize, and tap one to hide it, fade it or recolour it (including how solid the colour is). Layouts can be saved, swapped, exported and imported; vertical and horizontal mode each keep their own layout and their own saved list. Double-tapping A can hold acceleration for you.
Motion controls. Settings > Controls > Motion controls, "Steer with":
- Tilt: tilt the phone like a wheel, with sensitivity, flip and "set straight ahead".
- Wii Wheel: the phone is handed to the game as a Wii Remote in a Wii Wheel, so the game's own wheel code steers and shaking the phone does real tricks and wheelies. The phone's own vibration is filtered out so it can't steer or trick.
- Stick with Shake for tricks: steer with the stick, shake for tricks.
In every mode, pushing the stick sideways takes over the steering. With a real controller connected the phone's motion is paused and the controller plays like a normal controller (its D-pad does tricks). Wii Wheel and shake changes need a restart, which the menu does for you.
Vertical mode (experimental). Play upright like Mario Kart Tour: the race fills the tall screen, the race HUD moves to the corners and the touch controls get their own layout. Launcher > Graphics > Vertical mode.
Save import and export. Bring your profile over from a Wii NAND backup or
Dolphin (rksys.dat), or copy it out, from the launcher's Save data.
Picture settings. Brightness, contrast and saturation in the Display settings.
Real controller support. Controllers are fed to the game as a GameCube-style
pad. Mappings are positional (south, east, west, north) rather than
Xbox-labelled, so one config makes sense across Xbox, PlayStation, Nintendo and
generic controllers.
Unlocked framerate with interpolation. The original game is hard-locked to 60 fps. The runtime can generate interpolated frames in between for a smoother feel on high-refresh displays.
Warning
Interpolation is experimental and will show artifacts in specific scenarios.
A 30 FPS mode for phones that can't hold 60. With 30 FPS races turned on, every race uses the game's own 30 FPS mode - the one it uses for three- and four-player split-screen - so it plays at normal speed while drawing half as many frames, instead of running in slow motion. It works in the original game and in Retro Rewind, offline and online. Menus stay at 60, and Retro Rewind's time trials and ghost races stay at 60 because the mod requires it there.
It behaves like a phone app. The game pauses when you background it instead of fast-forwarding through everything it missed, it can drop its render resolution when the device gets hot rather than sliding into a slideshow, and it mutes its own music while you play something else - without stealing audio focus from your music app.
An in-game settings menu, reachable from the gear button or the Back button. It slides in from the side (in vertical mode it comes up from the bottom), the race stays visible behind it, and every change is saved the moment you make it. Pages Display, Controls and Sound:
- Internal resolution, display mode, and FPS counter
- Frame interpolation, copy filter, and shader-compilation behavior
- 30 FPS races, and simpler computer karts for lighter races
- Thermal resolution scaling and experimental multithreaded graphics
- Touch control visibility and double-tap auto-hold
- Controller assignment (pick a player and a controller from dropdowns) and full per-button mapping, with presets
- Vibration and its strength (the phone vibrates for a controller without a motor)
- Volume sliders and instant mute
Everything you change is saved to Config.toml on the device and restored on
the next launch.
Performance
This is native ARM64 code, not emulation, but Mario Kart Wii still asks a lot of a phone, and the honest summary is:
- A cold phone holds 60 fps on the devices this has been tested on. A hot one does not - sustained play throttles the SoC, and the port is CPU-bound, so lowering the resolution only helps so much.
- Thermal resolution scaling (on by default) trades pixels for frame rate automatically as the device heats up.
- 30 FPS races (off by default) is the setting for a phone that can't hold 60: the race stays at normal speed and the phone has half as many frames to draw.
- Simpler computer karts (off by default) gives computer players the lighter kart models the game uses in split-screen.
- The first few minutes after installing are the worst, because shaders are still compiling. It settles down. After an update the shaders are rebuilt in the background on a single low-priority thread, so the phone stays cool while it happens.
- The display is held at the game's frame rate, so a 120 Hz phone does not redraw twice per game frame.
- Release builds can be compiled with a recorded profile of real play
(profile-guided optimization), which cuts the work per frame. See
docs/android-performance.mdfor how to record one and how to measure a release build. - Debug builds are much slower than release builds, so don't judge the port by one.
Requirements
- Android 10 (API 29) or newer, on a 64-bit ARM (
arm64-v8a) chip. There is no 32-bit or x86 build. - A working Vulkan driver for the best experience. Devices without one can fall back to OpenGL ES from the launcher's Graphics... screen.
- Enough free storage for the extracted game data (a few GB) plus headroom during the one-time extraction step.
- A clean, unmodified PAL
RMCP01disc image of Mario Kart Wii (.iso or .wbfs), dumped by you. Only the clean PAL revision is supported; other regions or modified executables are rejected. - Optional, and needed for Switch: a Windows 10/11 or Linux (x86-64) PC, once, to run DriftDroid Builder (about 10 GB of free space while it works for Android, 16 GB if you also build for Switch).
Note
Nobody here will tell you where to get the game. Dumping your own disc is on you, and links to game files won't be provided or tolerated.
Installing
From this repo's Releases page, get the APK (and DriftDroid Builder, a zip of the same version, if you want the Switch version or a game pack). The app isn't on the Play Store.
- Install the APK on your phone.
- Open it, tap Install with ISO/WBFS and pick your disc image. The first time, DriftDroid extracts the game's data on the phone.
- For Retro Rewind, tap Install on its card.
To update, install the new APK over the old one - saves, the extracted game data and Retro Rewind all stay.
Optional: a game pack. On your PC, unpack DriftDroid Builder, open DriftDroidBuilder.exe
(Linux: DriftDroidBuilder), choose your disc image, pick Android and press Start. It takes 30
minutes to a couple of hours and makes output/DriftDroid-GamePack-<version>.zip. Copy it to the
phone and tap Import Game Pack...: the app then uses that game code, for example a newer Retro
Rewind. A game pack fits one app version, so make a new one with the matching builder.
DriftDroid Builder also makes the Switch version (DriftDroid.nro and RetroRewind.nro); that
needs devkitPro's "Switch Development" tools installed on the PC.
Caution
Only take builds from this repository's own Releases page. Don't install an APK someone shared through Discord or a random download site.
Building from source
Owning the game is still required even if you compile everything yourself. You'll need:
- Android Studio / the Android SDK and NDK (this project targets
arm64-v8a) - CMake and Ninja
- A JDK compatible with the Gradle version in
android/
Build the native runtime and the app:
# native runtime (produces libWiiCompiled.so / libGameCombined.so)
cmake --build <your-android-build-dir>
# copy the built .so files into android/app/src/main/jniLibs/arm64-v8a/, then:
cd android && ./gradlew assembleRelease
A build made this way carries the game code inside the APK. Release APKs do too, and also carry a
toolkit id (assets/toolkit-id.txt), so a game pack made by DriftDroid Builder with the same id takes
over the code in the APK. DriftDroid Builder is made from a finished build by tools/pc-builder/extract_plan.py
and tools/pc-builder/make_toolkit.sh; how it works is in docs/pc-builder.md.
Switch files, controls and log messages are in docs/switch.md.
Build assembleRelease for anything you intend to measure. Debug builds enable Android's runtime
checks and are substantially slower.
Launch both the original game and Retro Rewind once before calling a build good - they use
different libraries. Profile-guided builds, measuring and the build traps that have bitten this
project are written up in docs/android-performance.md.
This project also still carries the original desktop build (Windows, via the .NET translator and
Launcher under translator/ and Launcher/) from upstream WiiCompiled - see
translator/README.md if you're interested in that side instead.
A note on related projects
WiiCompiled, KartPad, Wheel Wizard, Retro Rewind, and other related projects are developed independently and each has its own contribution rules. What applies here does not automatically apply there, and vice versa.
Retro Rewind
Retro Rewind is a separate, optional community mod - nothing in this repo or any release bundles it, the same way nothing here includes the base game. The app's first screen lets you choose Original Mario Kart Wii or Retro Rewind; picking Retro Rewind before it's installed walks you through getting it set up, three ways:
- Download it - the app asks the mod's own official update service
(
update.rwfc.net, the same one Wheel Wizard and the Retro Rewind updater use) which release is newest, and fetches it straight from there: the newest full download, then any small updates released on top of it. Nothing is mirrored or re-hosted here, and the game code in every download is checked against this build before it's installed. - Select the
.zipfile you already downloaded - the app extracts it for you, no separate unzip step needed. - Select a folder, if you've already extracted it yourself. Use this one if you're bringing an install over from Dolphin with your own mods in it - your files are copied as they are.
Either way the pack lands in place (~2GB, so it takes a few minutes) and you're done: no manual file management, no computer required. Downloads resume where they left off if your connection drops, and the copy keeps running while you're in another app.
Retro Rewind versions
Retro Rewind releases more often than this app does, so the app checks what's actually out there rather than knowing about one hardcoded release, and "Check for updates" in the Retro Rewind menu applies the mod's own small per-version update archives - a few megabytes instead of re-downloading the whole pack.
There is one real limit worth understanding. Retro Rewind's game logic lives in
Binaries/Code.pul, and because DriftDroid compiles everything to native code ahead of time
rather than emulating a Wii, that file has to be compiled into the app itself - it can't be picked
up on your phone at runtime. So:
- A Retro Rewind update that changes tracks, characters or other assets works immediately, with no app update at all.
- A Retro Rewind update that changes game code needs a new DriftDroid build (and a new game pack made with its builder). The app detects this before downloading anything large, tells you, and leaves your working install alone rather than replacing it with something that would crash. When that new DriftDroid build is out, run its DriftDroid Builder on your PC to make the new game pack.
- After DriftDroid itself has been updated for a newer Retro Rewind, an install still on the old one is brought up to date when you tap Retro Rewind, before the game starts.
Mods that replace Retro Rewind's own menu or race files are tied to the Retro Rewind version they were made from. One made for 6.12.8 can crash on 6.13 (for example when opening Retro WFC) until it is rebuilt.
This is also why importing a Retro Rewind copy from somewhere else can be refused: it's checked against the code this build was compiled for. Character/track mods in an otherwise-supported install are fine - those are assets, and they're preserved.
Both the Riivolution-style file-overlay system this depends on, and a network stack built specifically to talk to the community Retro-WFC service, are shared with upstream WiiCompiled's runtime and already wired up on Android.
FAQ
Is this an emulator? No. Everything is compiled to native code before you ever press play. At runtime there's nothing emulating a Wii CPU or GPU.
Do you provide the game? No. Don't ask. Nothing in this repo or any release contains Nintendo code or assets.
Which game version works?
Clean PAL RMCP01. Other regions and modified executables are rejected outright.
Can I use the newest Retro Rewind version? If it only changed assets, yes - the app picks it up on its own. If it changed game code, it needs a DriftDroid update first; the app will say so instead of installing something broken. See Retro Rewind versions.
How do I update DriftDroid? Install the new APK over the old one and import the game pack made by the same version of DriftDroid Builder. Saves, settings and Retro Rewind stay.
Is there gonna be a Switch version? There is one: DriftDroid for Nintendo Switch - Beta 1 (a pre-release, original game only). Retro Rewind on Switch is being worked on.
Is it done? No - this is an active, personal work-in-progress fork. It's playable start to finish, but performance work, device compatibility and bug fixing are ongoing.
It won't start / the screen stays black. Most often a Vulkan driver the device can't actually deliver on. Open the launcher, tap Graphics..., choose OpenGL ES, and try again. Report it either way - which renderer worked is exactly the information that's useful.
It runs at 60 fps and then gets slower. That's thermal throttling, not a bug in the build. See Performance. Leaving "Lower resolution when the phone gets hot" enabled keeps the frame rate steadier as the device heats up.
It never reaches 60, and everything looks like slow motion. Turn on 30 FPS races in the settings menu. The race then runs at normal speed with half the frames. It applies from the next race.
Retro Rewind crashes when I open Retro WFC or a menu after updating. Most likely a mod that replaces Retro Rewind's own files and was made for an older Retro Rewind. Turn your mods off in Mods... and try again; if that fixes it, the mod needs a version made for the Retro Rewind you have now.
Characters or menu icons are stretched across the screen. A driver bug on Snapdragon 8 Elite class GPUs (Adreno 8xx). The fix turns itself on for those GPUs; if you still see it, set Fix stretched graphics (Snapdragon) in the settings menu to Everything, or try a different GPU driver (next question).
Can I use a different GPU driver?
On Snapdragon phones, yes: Graphics... -> GPU driver... installs an AdrenoTools driver
package such as Turnip. DriftDroid does not ship drivers; where to get them and how to check which
one is active is in docs/android-gpu-compatibility.md.
I picked Vulkan but it says OpenGL ES. The game shows a notice at start when the renderer you chose could not start and another one was used. Please report the device and GPU - that is exactly the list that needs fixing.
Some characters or objects are invisible. A few Adreno GPUs miscompile one of the shaders. Enable Fix missing characters (some Adreno GPUs) in the settings menu. It turns itself on for the Adreno 750 (Galaxy S24 class).
The game crashed / stopped with an error. Open an issue with the crash template. If you're on a debug build you can pull the run log with:
adb shell run-as com.driftdroid.android cat files/WiiCompiled/android_runtime_attempt.log
(Release builds aren't debuggable, so run-as won't work on them.)
How do I open the settings if I hid the gear button? Press the phone's Back button.
Why doesn't my Switch Pro Controller rumble?
Confirmed at the kernel level (adb shell getevent -pl): stock Android's Bluetooth HID gamepad
driver doesn't expose any force-