Call of Duty: Modern Warfare 2 (2009) for the Xbox 360, recompiled ahead-of-time into native machine code for Android (ARM64), Linux, and Windows (x86-64).
This is not an emulator: Xbox 360 PowerPC machine instructions are translated ahead-of-time into native C++ via XenonRecomp and compiled directly into native binaries. The game executes directly on host hardware with full platform integration.
Important: No copyrighted game assets, executables, or code are included in this repository. You must provide your own legally obtained Xbox 360 game disc image (
Call of Duty: Modern Warfare 2, version 1.0.557).
- Full Campaign & Multiplayer: Play the single-player campaign or multiplayer matches offline and online.
- LAN & Steam Networking:
- Steam Build: Invite friends directly via Steam friends list without port forwarding.
- LAN / Direct IP Build: Local system link matches for offline or private networks.
- Modern Graphics Pipeline: Native Vulkan renderer targeting 720p, 1080p, 1440p, or 4K with native MSAA.
- Full Gamepad Support: Xbox, PlayStation, and generic Bluetooth/USB controllers with haptic rumble.
- Native Android Runtime: Built from source as a standalone APK (
com.mw2.recomp.spandcom.mw2.recomp.mp) using the Android NDK (r28+) and modern Kotlin. - Universal Multi-SoC Optimization: Dynamic scheduler thread-pinning and CPU core affinity tuned for:
- Qualcomm Snapdragon (Prime + Gold performance cores)
- MediaTek Dimensity (Cortex-A78/X-series clusters)
- Google Tensor (Tri-cluster 2+2+4 architecture)
- Samsung Exynos (Mali & AMD RDNA Xclipse GPUs)
- Vulkan 1.1 Legacy RenderPass Fallback: Fully supported classic
VkRenderPassand static pipeline state path for devices lackingVK_KHR_dynamic_renderingorVK_EXT_extended_dynamic_state(e.g. Dimensity 920 Mali-G68 MC4). - Zero-Copy BC1–BC5 SIMD-Optimized Decoder: Full software decompressor using aligned 32-bit and 64-bit direct word stores, eliminating per-block
std::memcpyoverhead and infinite re-staging loops on uncompressed targets for mobile GPUs without hardware BC compression (Mali). - Adaptive Memory Management & LMK-Safe Budgeting: 128 MB default texture budget on Android unified memory architectures with 16 MB allocation blocks (
kBlockBytes), featuring 2-pass dynamic eviction that strictly bounds memory below 1.0 GB RSS and prevents Android Low Memory Killer (LMKD) terminations. - Accurate 3D Lighting & Normal Reconstruction: Resolved silhouette artifacts on character models, gear, weapons, and foreground geometry by applying neutral opaque white fallback samplers and correct component swizzle for BC5 / DXN normal maps on mobile GPUs.
- Live Performance & Diagnostics HUD: Interactive in-game overlay displaying real-time FPS, frame time, CPU usage, SoC thermals, app & system RAM, texture memory, and active Vulkan device.
- Direct Play & One-Tap Setup: The launcher automatically discovers game disc images (
.iso/.7z/.zip) in/sdcard/Download/and sets up everything in one tap. - Customizable Touch Pad: Virtual on-screen touch controls with customizable layout, opacity, button toggle modes (sticky ADS), and velocity-based look gestures.
- Persistent Pipeline & Shader Cache: Multi-tiered shader architecture caching both translated SPIR-V microcode and native driver Vulkan pipelines (
shader_cache.bin). Features an instant-boot budget (15 pipelines / 250 ms) guaranteeing sub-2-second launcher-to-title transitions at locked 60 FPS, with a non-blocking background warmup scheduler compiling remaining gameplay pipelines asynchronously during menus and cutscenes. - Custom Driver Loader: Sideload and switch to custom Mesa Turnip Vulkan drivers for Adreno hardware on the fly via
libadrenotoolsdirectly from the in-app Graphics Driver menu. - Low-Latency 3D Audio: AAudio backend with automatic downmixing from Xbox 360 5.1 surround sound to high-fidelity stereo, driven by a rock-solid 5.333 ms wall-clock cadence eliminating audio stutter and underruns.
- Lean Asset Pipeline & Cutscene Compression:
- Built-in cutscene compression tool (
tools/compress_cutscenes.py) powered by official RAD Video Tools, reducing cutscene disk and memory footprint by 77% (shaving 940 MB) while optimizing mobile CPU/RAM decoding. - Lean 5.14 GB campaign ISO package (
mw2_campaign_lean.iso), saving over 2.7 GB compared to retail DVD-9 images by pruning unneeded multiplayer fastfiles and stripping dummy sectors while retaining 100% of the single-player campaign and offline solo Spec Ops.
- Built-in cutscene compression tool (
- Modern OS Support: Full 16 KB memory page compatibility for Android 14 and Android 15.
- Architecture: 64-bit ARM (
arm64-v8a). 32-bit devices are not supported. - OS: Android 10 or later (API level 29+).
- GPU / Vulkan:
- Vulkan 1.3 or Vulkan 1.1+.
- Modern path: Vulkan 1.3 with dynamic rendering & extended dynamic state.
- Legacy path: Automatic Vulkan 1.1
VkRenderPassfallback for Mali / older vendor drivers. - BC Texture decompression: Automatic hardware BC if supported, or CPU fallback decoding on GPUs lacking BC compression.
- Tier 1 (High / 1080p 60 FPS): Qualcomm Snapdragon 8-series (SD 865 up to 8 Gen 3), Dimensity 8000/9000-series, Tensor G2–G4.
- Tier 2 (Mid-Range / 720p 60 FPS - Fully Supported): Qualcomm Snapdragon 7-series (SD 778G / 778G+, 782G, 7 Gen 1/2/3, 7+ Gen 2 with Turnip / Adreno 642L), Dimensity 920 / 1080 / 1200 / 7050.
- Tier 3 (Entry / 540p–720p 30–60 FPS): Snapdragon 695 / 6 Gen 1, MediaTek Helio G99 / G96 (via Vulkan 1.1
VkRenderPassfallback + CPU BC decompressor).
- Storage: ~7-8 GB free internal storage for game assets.
- Game Media: An ISO or disc dump of Call of Duty: Modern Warfare 2 (Xbox 360, version 1.0.557, USA or Europe).
- 64-bit Windows 10/11 or modern x86-64 Linux distribution.
- Vulkan 1.2+ capable GPU (AMD, NVIDIA, or Intel).
- Xbox 360 game disc image (v1.0.557).
- Install the APK:
Download the latest
app-campaign-release.apk(orapp-multiplayer-release.apk) from Releases and install it on your device. - Provide Game Files:
Copy your game disc image (
mw2.isoorCall of Duty - Modern Warfare 2 (USA, Europe).iso) into your phone'sDownloadfolder. - Launch & Play:
- Open MW2 Campaign.
- If a disc image is detected in
Download, tap ⚡ INSTALL & PLAY. The installer will unpack and verify the game files into your app storage. - Once installation completes, tap ▶ LAUNCH GAME to start playing.
- Enable Direct Launch to automatically bypass the launcher and jump straight into gameplay on future launches.
- The launcher features Graphics Driver settings (sideload Turnip drivers for Adreno devices), Graphics (Resolution scale, FPS limit, FOV), and Profiles (mission unlocks and progress).
- Download the
steamorlanrelease archive from Releases and extract it anywhere. - Run
mw2-launcherand select INSTALL GAME, pointing it to your game ISO. - Choose PLAY CAMPAIGN or PLAY MULTIPLAYER.
The launcher also features PROFILES (set multiplayer rank and prestige, unlock everything, open campaign and Special Ops missions), GRAPHICS (the RESOLUTION the game draws at: 720p, 1440p, or 4K), and CHECK FOR UPDATES, which updates newer releases in place.
- Left Stick (LS): True analog joystick for player movement (walk/run).
- Right Stick (RS): True analog joystick for camera look & aiming.
- Action Buttons: Xbox 360-styled ABXY jewel buttons (Jump, Crouch/Prone, Reload, Swap Weapon).
- Bumpers & Triggers: LB (Tactical/Flashbang), RB (Lethal/Frag), LT (Aim Down Sights), RT (Fire).
- Click Actions & Menus: L3 (Sprint), R3 (Melee), Start (Pause), Back (Scoreboard).
- ADS Toggle: Tap the Aim button to aim down sights; can be configured as tap-to-toggle or hold-to-aim.
- Customize Layout: Open pause menu → Edit controls to drag, resize, or adjust transparency of any button.
- Physical Gamepad: Bluetooth or USB Xbox/PlayStation controllers are automatically detected.
Settings: MW2_FULLSCREEN=1, MW2_SCALE=<2 or 3> (what RESOLUTION sets), MW2_FPS_LIMIT=<n> (what FPS LIMIT sets; 0 is no limit), MW2_FOV=<65 to 120> (what FOV sets), MW2_MSAA=<n> or MW2_NO_MSAA=1, MW2_NO_AUDIO=1. Set them as environment variables, or keep them in a file named .env beside the executables, one per line.
Players & Profiles. You are a profile, made the first time you play and named after your login; your rank is kept under it. The launcher's PROFILES screen renames it, and puts another profile in your place. On Steam other players see your Steam name. A second, third or fourth controller signs in on the game's sign-in screen, which opens where the game asks for it (SIGN IN PROFILE in split screen, SYSTEM LINK) or with the Guide button (or Back and Start together): choose a profile, which keeps its own rank and settings, or make a new one. Two copies of mw2-mp on one PC can play a SYSTEM LINK match, each with the controller that chose SYSTEM LINK in it.
- Steam: With Steam running, the game shows as Spacewar. Without it, the
steamdownload plays as thelanone does, with a rank of its own. Host a PLAY ONLINE → PRIVATE MATCH, invite from Steam's friend list (orF6). - LAN: SYSTEM LINK finds games on the network automatically. For private matches, the lobby's "Invite friends" invites everyone on the network.
- Profiles: Every player is a profile, made the first time you play and named after your login. The launcher's PROFILE screen renames it, and puts another profile in your place. Additional controllers can sign in with separate profiles, ranks, and settings.
| Key / Input | Action / Xbox 360 Equivalent |
|---|---|
W, A, S, D |
Movement (Left Analog Stick) |
Mouse Movement |
Aim & Look (Right Analog Stick) |
Left Mouse Click |
Fire Weapon (Right Trigger) |
Right Mouse Click |
Aim Down Sights (Left Trigger) |
Space, Z, Enter |
A (Jump / Accept / Confirm) |
C, X, Left Ctrl |
B (Crouch / Prone / Cancel) |
F, R |
X (Use / Reload) |
1, 2, Y |
Y (Switch Weapon) |
Left Shift |
Sprint (Left Thumbstick Click) |
V, Middle Click |
Melee Attack (Right Thumbstick Click) |
Q, 4 |
Tactical Equipment / Flashbang (LB) |
E, G |
Lethal Equipment / Frag Grenade (RB) |
Enter |
START (Pause Menu / Skip Intro) |
Esc, Tab |
BACK (Scoreboard / Cancel) |
Arrow Keys |
D-Pad (Night Vision / Killstreaks) |
F8 |
Toggle Fullscreen |
F6 |
Invite Friends (Steam build) |
- Desktop environment (Linux or Windows).
- JDK 17.
- Android SDK with NDK 28.2.13676358 (
platforms;android-35). - CMake 3.22.1+ and Python 3.10+.
# 1. Recompile Xbox 360 guest executables to C++
TITLE=sp ./build.sh
TITLE=mp ./build.sh
# 2. (Optional) Fetch libadrenotools for custom Adreno GPU driver support
./android/fetch_deps.sh
# 3. Build the Campaign APK via Gradle
cd android
./gradlew assembleCampaignRelease
# The output APK will be in:
# android/app/build/outputs/apk/campaign/release/app-campaign-release.apkThe .github/workflows/android.yml workflow builds installable APKs directly on GitHub runners:
- Go to Actions → android → Run workflow.
- Supply a download link to your legal game executables or ISO archive.
- The runner recompiles the tree, runs the NDK toolchain with
ccache, and attaches the signed APK as an artifact.
- Log Files:
- Android runtime logs are mirrored to internal and external storage:
/sdcard/Android/data/com.mw2.recomp.sp/files/game.logandlauncher.log. - On PC: pass
MW2_LOG_FILE=mw2.logor view the terminal output.
- Android runtime logs are mirrored to internal and external storage:
- Black Screen on Android:
- Check
game.log. If the log reportsvulkan: the device lacks dynamic rendering and extended dynamic state, your device's stock GPU driver lacks Vulkan 1.3 core features. For Adreno devices, use the in-app Driver menu to load a Turnip driver package.
- Check
- Performance Tuning:
- Open Settings inside the Android app:
- Set Render Scale to
60% - 75%for solid 60 FPS on mid-range devices. - Keep Multisampling (MSAA) OFF on mobile tiled GPUs.
- Set Texture Budget to 256 MB or 512 MB to prevent memory pressure.
- Set Render Scale to
- Open Settings inside the Android app:
- PaulCombal/mw2-recompiled: Original Xbox 360 ahead-of-time recompilation project and Vulkan renderer architecture.
- hedge-dev/XenonRecomp: PowerPC to C++ static recompiler.
- KisakCOD & IW4x: Research into engine systems, audio mixing, and mobile input adaptations.
- OpenAssetTools: Call of Duty FastFile and asset format tools.
- libadrenotools: Custom Vulkan driver loading on Android.
This project is licensed under the GNU General Public License v3.0 (GPL-3.0-only).
See LICENSE.md for full terms, conditions, and third-party notices.
Disclaimer: This project is an independent open-source research initiative. It is not affiliated with, authorized, or endorsed by Activision, Infinity Ward, or Microsoft. All trademarks and game content belong to their respective owners. No copyrighted game assets or proprietary binaries are hosted in this repository.