OpenMapper
1.2.2 · GitHub
More about this app
Free open-source gamepad keymapper using Shizuku for touch injection with sub-millisecond latency; alternative to Mantis and Panda.
🎮 OpenMapper
High-performance, standalone Android gamepad keymapper powered by Shizuku.
The 100% Free, Modern & Open-Source Alternative to Mantis Gamepad Pro, Panda Gamepad & Octopus.
Play touch-only mobile games with any physical gamepad without root and with ultra-low latency (< 0.5 ms).
Warning
⚠️ Early Development & Alpha/Beta Notice OpenMapper is actively under early development. While the core mapping engine, zero-allocation input streaming, and in-game HUD editor are fully operational, you may occasionally run into unexpected bugs or device-specific quirks across different Android ROMs (MIUI/HyperOS, OneUI, ColorOS, OxygenOS, etc.).
If you encounter any bugs, controller recognition issues, or have ideas for improvements, please feel free to Open an Issue on GitHub with your device model, controller model, and Android version!
⚡ Quick Start & Installation
Getting started takes less than 2 minutes. 100% PC-Free & No Root Required — everything is set up directly on your phone.
Step 1: Download the App
- Go to the Latest Releases page.
- Download and install
OpenMapper-vX.X.X.apkon your Android device.
Step 2: Install & Start Shizuku (Required)
OpenMapper requires Shizuku to inject touch events into games with high-speed shell privileges without requiring root.
Install Shizuku on your phone:
Start Shizuku using Option A (Phone only) or Option B (PC Cable):
📱 Option A: 100% On Phone (Android 11+ • No PC Needed)
- Go to Settings ➔ About Phone ➔ Tap Build Number 7 times to unlock Developer Options.
- In Developer Options, enable Wireless Debugging.
- Open the Shizuku app, tap Pairing (enter code from notification), then tap Start.
💻 Option B: Via Computer (USB Cable • Android 8.0+)
- Enable USB Debugging in Developer Options.
- Connect your phone to your PC with a USB cable.
- Open a terminal / command prompt on your PC and run:
adb shell sh /sdcard/Android/data/moe.shizuku.privileged.api/start.sh
💡 Once started, Shizuku remains active in the background until your phone is rebooted.
Step 3: Launch OpenMapper
- Connect your controller (Bluetooth or USB-C OTG): Xbox, PlayStation, Switch Pro, 8BitDo, Razer Kishi, etc.
- Open OpenMapper and grant:
- Shizuku Permission (Click Authorize).
- Display Over Other Apps (Overlay permission).
- Select your game profile (e.g., CoD Mobile, Warzone, PUBG, Genshin).
- Tap 🚀 LAUNCH OVERLAY & MAPPING.
Step 4: Customize Controls in Game
- Launch your game.
- Swipe the side handle 🎮 on the edge of the screen to open the fullscreen HUD Editor.
- Drag and position buttons directly over your game's touchscreen controls.
- Tap 💾 Save and enjoy full gamepad controls!
✨ Key Features & Highlights
🏎️ High-Performance Mapping Engine
- Ultra-Low Latency (< 0.5 ms): Direct Linux
/dev/input/event*binary stream parsing with zero memory allocation and zero garbage collection overhead. - 120 Hz – 240 Hz Real-Time Loop: High-priority dedicated engine thread synchronized with modern high-refresh-rate gaming screens.
- Seamless 360° Camera: Dual-pointer handoff technology eliminating screen edge locks and angle snapping during continuous 360° rotations.
- Dynamic Flick & Boost Curve: Micro-precision center deadzone combined with instant 180° turn acceleration at outer stick reach.
🎯 Tactical Assists & Aim Enhancements
- Organic Jiggle Strafe: Automated left/right dodge patterns during weapon fire with randomized feints and humanized timing variations.
- Vertical Anti-Recoil: Smooth automated pull-down compensation with configurable speed (0.1x – 10.0x) and dedicated ADS-Only mode.
- Rotational Aim Assist (RAA) Keep-Alive: Micro-dithering ensures in-game aim assist rotational tracking remains active even when stationary.
- Controller Rumble & Recoil: Dynamic physical gamepad vibration with continuous firing recoil pulses and mechanical reload double-pulses.
🪟 In-Game HUD & Key Customization
- In-Game Floating HUD Editor: Retractable side-drawer to drag, scale, and test button mappings live without leaving your match.
- Special Button Roles: One-tap assignment for Primary Fire, Reload Magazine, and ADS Scope with dedicated sensitivities.
- Multi-Profile Management: Create, duplicate, rename, backup, and export custom mappings for any game.
🌐 Cloud Community & Hardware Diagnostic
- 1-Click Community Hub: Search, download, and vote on community-made game presets backed by Cloudflare D1 edge database.
- Hardware Diagnostic Suite: Real-time analog stick visualizer, 3-second automated drift test, circularity error check, and polling rate (Hz) monitor.
- In-App Auto-Updater: Direct background detection and 1-tap installation of new GitHub releases directly within the app.
🎮 Controller Compatibility
| Controller Type | Supported Models | Connection Modes |
|---|---|---|
| Xbox Controllers | Xbox Series X/S, Xbox One, Xbox Elite Series 2, Xbox Adaptive | Bluetooth / USB-C |
| PlayStation | DualSense (PS5), DualShock 4 (PS4) | Bluetooth / USB |
| Telescopic Mobile | Razer Kishi V1/V2, GameSir (G8 Galileo, X2/X3), Backbone One, BSP-D8 | USB-C OTG / Bluetooth |
| Nintendo & Others | Nintendo Switch Pro Controller, 8BitDo (Ultimate, Pro 2, SN30 Pro) | Bluetooth / USB |
🗺️ Roadmap & Planned Features
Check out our TODO.md roadmap for upcoming features and technical improvements (Virtual Mouse mode, e-Sport Macros, Radial Menus, Per-App Auto-Switching, Advanced Community Filters, Adaptive Polling, and more).
🛠️ Building from Source
# Clone the repository
git clone https://github.com/kinou-p/android-open-mapper.git
cd android-open-mapper/android
# Run unit tests
./gradlew testDebugUnitTest
# Compile debug APK
./gradlew assembleDebug
# Install on connected device via ADB
adb install -r app/build/outputs/apk/debug/app-debug.apk
⚖️ Legal Disclaimer & Trademarks
- Independent Open-Source Project: OpenMapper is a community-driven project for personal, non-commercial use. It is not affiliated with, endorsed, or sponsored by Activision, Tencent, HoYoverse, Krafton, or any other game publisher.
- Trademarks: All game titles, trademarks, and logos (Call of Duty: Mobile, PUBG, Genshin Impact, Mantis Gamepad Pro, Panda, Octopus, etc.) belong to their respective owners.
- Responsibility: Use of this tool is at the user's sole discretion and responsibility.
📄 License
This project is licensed under the PolyForm Noncommercial License 1.0.0 (Free for personal, non-commercial and educational use. Commercial exploitation and resale are strictly prohibited).
How Shizuku is used
Can map gamepad buttons and sticks to on-screen touches via `IInputManager.injectInputEvent` and privileged input reading.
This is an AI-assisted analysis of Shizuku-related usages in the app's public source code. It is best effort, so it may not catch every single usage.
How this app uses Shizuku
OpenMapper uses Shizuku to turn a physical gamepad into on-screen touches for games without controller support.
- Play with gamepad: buttons on the controller trigger taps and touches at positions configured in the app profile, injected through Shizuku with system input injection.
- Move with left stick: pushing the left stick produces a continuous touch drag for the virtual joystick, including movement and strafe actions.
- Aim with right stick: pushing the right stick produces a continuous touch drag for camera look and aiming, including sensitivity and recoil handling.
- Read controllers directly: the app discovers connected gamepads and streams their raw button and stick events using privileged
catandgeteventprocesses through Shizuku.
Android APIs or commands used
IInputManager.injectInputEventcatgetevent -pgetevent -qcat /proc/bus/input/devices
Changelog
What's new for version 1.2.2
🎮 OpenMapper v1.2.2
Bienvenue sur la version v1.2.2 d'OpenMapper !
📱 Installation & Démarrage
- Téléchargez l'APK
OpenMapper-v1.2.2.apkci-dessous. - Installez l'APK sur votre appareil Android.
- Assurez-vous que Shizuku est actif sur votre téléphone pour profiter du mapping et de l'injection tactile à ultra-faible latence (< 0.5 ms).
SHA-256: cdd2291296d6d05bf63256bb6146d9bc3250a72848c335cb138c35c0b29eeff4
📋 Nouveautés & Changements majeurs (depuis v1.2.1)
🕹️ Détection Matérielle Directe des Plages de Sticks (getevent -p)
- Inspection automatique du pilote noyau : Analyse en temps réel des bornes
minetmaxretournées pargetevent -ppour chaque axe analogique. - Support complet de tous les formats de manettes :
- Non-signé 16-bit (
0..65535, centre à~32768) : manettes Xbox filaires (USB OTG) sous Android et manettes Bluetooth. - Signé 16-bit (
-32768..+32767, centre à0) : manettes Nintendo Switch et pilotes xpad PC. - Non-signé 8-bit (
0..255, centre à128) : manettes PlayStation et manettes Bluetooth compactes.
- Non-signé 16-bit (
- Résolution du blocage au repos : Élimination définitive du problème où les sticks filaires USB étaient bloqués à 100% dans le coin supérieur gauche (-1.0f, -1.0f).
- Auto-apprentissage dynamique de secours : Détection et verrouillage automatique de la plage en mode
AUTOau premier mouvement de stick si les métadonnées matérielles sont absentes.
⚡ Optimisation Zéro-Allocation IPC & Taps (240 Hz)
- Pré-allocation IPC sous réflexion : Mise en cache de tableaux d'arguments réutilisables (
cachedArgs2,cachedArgs3) et constanteZERO_INTEGERdansIInputManagerHelper, éliminant les allocations d'objetsObject[]et le boxing d'entiers à chaque frame. - Mode TAP sans Garbage Collection : Remplacement de la file
ConcurrentLinkedQueueet de son itérateur par un tableau fixe de 16 slotsPendingTapSlotréutilisables dansButtonProcessor, supprimant tout risque de micro-stutter ou pause GC en pleine partie.
🛡️ Résilience & Double Fallback Dynamique
- Interfaçage Android 11 à 15+ : Restauration et sécurisation du double fallback dynamique AIDL / Réflexion (2 paramètres sur Android 8-10, 3 paramètres avec
displayId = 0sur Android 11-15+) dansIInputManagerHelper. - Sécurisation des cancels préventifs : Suppression de
handleInjectionErrorsur lesACTION_CANCELspéculatifs au démarrage dansShizukuTouchInjector(ne déconnecte plus l'injecteur au lancement). - Stabilité des coroutines Linux :
LinuxInputReadermaintient la coroutine parente active avecjoinAll()sur les fluxcat /dev/input/event*, garantissant que la lecture manette ne se ferme pas prématurément en arrière-plan pendant le jeu.
🎮 Filtrage Matériel & Routage Bluetooth Générique
- Élimination des faux positifs matériels : Exclusion stricte de
keypad,gpio-keypadetkpdpour ne plus capturer les boutons physiques de volume et de veille du téléphone. - Routage Bluetooth précis : Routage dédié
GENERIC_BLUETOOTHpour les manettes tierces (Ipega, Mocute, 8BitDo) avec seuil de déclenchement des gâchettes recalibré à 24% (rawValue > 60L) au lieu de 78%.
📳 Vibrations de Tir Asynchrones
- Boucle prioritaire protégée : La fonction
playFireHapticest désormais déportée de manière asynchrone surhapticScope.launch, empêchant les appels IPC synchrones vers le service systèmeIVibratorServicede faire caler le thread d'émulation à 240 Hz.
🔒 Concurrence Overlay & Mises à Jour APK
- Anti-Race Condition de Profil :
liveProfileUpdateFlowutilise désormais unMutableSharedFlow(replay = 0, extraBufferCapacity = 1), évitant tout rejeu intempestif d'un profil obsolète lors du démarrage du service. - Fallback Signatures d'Installation : Ajout d'un repli sur
info.signaturessiinfo.signingInfoest nul lors de la vérification de l'APK sur Android 9 et 10 (bogue AOSP documenté).
📋 Changelog détaillé des commits
Full Changelog: https://github.com/kinou-p/android-open-mapper/compare/v1.2.1...v1.2.2
Permissions
12 permissions requested