ShizuStore

OpenMapper

kinou-p

1.2.2 · GitHub

Download APK
Input methods Android 8.0+ 4 weeks ago PolyForm-Noncommercial-1.0.0
39 ShizuStore
1.6k GitHub
9 Stars
2 MB Size

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).

Latest Release Early Development License Android 8.0+ No Root Required No Ads / No Paywall


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

  1. Go to the Latest Releases page.
  2. Download and install OpenMapper-vX.X.X.apk on 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.

  1. Install Shizuku on your phone:

  2. Start Shizuku using Option A (Phone only) or Option B (PC Cable):

📱 Option A: 100% On Phone (Android 11+ • No PC Needed)

  1. Go to Settings ➔ About Phone ➔ Tap Build Number 7 times to unlock Developer Options.
  2. In Developer Options, enable Wireless Debugging.
  3. Open the Shizuku app, tap Pairing (enter code from notification), then tap Start.

💻 Option B: Via Computer (USB Cable • Android 8.0+)

  1. Enable USB Debugging in Developer Options.
  2. Connect your phone to your PC with a USB cable.
  3. 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

  1. Connect your controller (Bluetooth or USB-C OTG): Xbox, PlayStation, Switch Pro, 8BitDo, Razer Kishi, etc.
  2. Open OpenMapper and grant:
    • Shizuku Permission (Click Authorize).
    • Display Over Other Apps (Overlay permission).
  3. Select your game profile (e.g., CoD Mobile, Warzone, PUBG, Genshin).
  4. Tap 🚀 LAUNCH OVERLAY & MAPPING.

Step 4: Customize Controls in Game

  1. Launch your game.
  2. Swipe the side handle 🎮 on the edge of the screen to open the fullscreen HUD Editor.
  3. Drag and position buttons directly over your game's touchscreen controls.
  4. 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).

Close

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 cat and getevent processes through Shizuku.

Android APIs or commands used

  • IInputManager.injectInputEvent
  • cat
  • getevent -p
  • getevent -q
  • cat /proc/bus/input/devices
Close

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

  1. Téléchargez l'APK OpenMapper-v1.2.2.apk ci-dessous.
  2. Installez l'APK sur votre appareil Android.
  3. 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 min et max retournées par getevent -p pour 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.
  • 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 AUTO au 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 constante ZERO_INTEGER dans IInputManagerHelper, éliminant les allocations d'objets Object[] et le boxing d'entiers à chaque frame.
  • Mode TAP sans Garbage Collection : Remplacement de la file ConcurrentLinkedQueue et de son itérateur par un tableau fixe de 16 slots PendingTapSlot réutilisables dans ButtonProcessor, 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 = 0 sur Android 11-15+) dans IInputManagerHelper.
  • Sécurisation des cancels préventifs : Suppression de handleInjectionError sur les ACTION_CANCEL spéculatifs au démarrage dans ShizukuTouchInjector (ne déconnecte plus l'injecteur au lancement).
  • Stabilité des coroutines Linux : LinuxInputReader maintient la coroutine parente active avec joinAll() sur les flux cat /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-keypad et kpd pour ne plus capturer les boutons physiques de volume et de veille du téléphone.
  • Routage Bluetooth précis : Routage dédié GENERIC_BLUETOOTH pour 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 playFireHaptic est désormais déportée de manière asynchrone sur hapticScope.launch, empêchant les appels IPC synchrones vers le service système IVibratorService de faire caler le thread d'émulation à 240 Hz.

🔒 Concurrence Overlay & Mises à Jour APK

  • Anti-Race Condition de Profil : liveProfileUpdateFlow utilise désormais un MutableSharedFlow(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.signatures si info.signingInfo est 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

Close

Permissions

12 permissions requested

  • android.permission.SYSTEM_ALERT_WINDOW
  • android.permission.FOREGROUND_SERVICE
  • android.permission.FOREGROUND_SERVICE_SPECIAL_USE
  • android.permission.POST_NOTIFICATIONS
  • android.permission.VIBRATE
  • android.permission.BLUETOOTH
  • android.permission.BLUETOOTH_CONNECT
  • android.permission.INTERNET
  • android.permission.ACCESS_NETWORK_STATE
  • android.permission.REQUEST_INSTALL_PACKAGES
  • com.kinou.gameassist.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION
  • moe.shizuku.manager.permission.API_V23
Close