Extend is an all-purpose Android display manager for any connected physical or virtual display. It can be used standalone or alongside Mirror. It builds on top of Android desktop experience features, and allows you to place any application on any display and drive it with a built-in multi-touch virtual touchpad, an on-screen keyboard, a physical touchscreen, or any external input device connected to Android.
Combined with any supported launcher, it is a full open-source replacement for Samsung DeX, Motorola Smart Connect Mobile Desktop (formerly Ready For), and Honor Easy Projection, with additional features on top.
demo.mp4
Using without Shizuku is possible but outside the scope of support. For full feature compatibility, Shizuku is required: enable it in any supported mode (wireless debugging, USB debugging, or root) and grant access to this application. See Shizuku documentation for details.
Extend manages physical and virtual displays while Mirror creates them. External displays are picked up automatically through built-in DisplayManager API. For screens that Android cannot reach natively, Mirror registers virtual displays in the same way so DisplayManager recognizes them without any extra integration.
- Any device on Android 8.0+ (no privileged access required)
- An external display (connected via DisplayPort over USB-C, Wireless Display (Miracast), Google Cast, Samsung SmartView, or any screen sharing application)
- (Optional) Mirror for additional support for creating virtual displays for screen sharing over AirPlay, DisplayLink, Moonlight/Sunshine (Nvidia GameStream)
- (Optional) Shizuku for hidden API access
- Launch any application on any external display in full screen
- Fully customizable resolution, scaling, DPI, and rotation for any display
- Reset any per-display configuration back to system defaults
- Built-in on-screen touchpad and keyboard for controlling any display
- Touchpad control with support for multi-touch, rotation, and digitizer-only mode
- Per-device routing from any external input device to any display
- Back and Home navigation for content running on external displays
- Turn off the built-in screen while keeping external displays active
- Managed virtual display mode with customizable on-screen keyboard routing and window behavior, for legacy Android versions
| Feature | Shizuku | Accessibility | Min. API |
|---|---|---|---|
| Change resolution | R | N | 26 |
| Change DPI | R | N | 26 |
| Change rotation | R | N | 26 |
| Change mode (FPS) | R | N | 26 |
| Bind input device | R | N | 26 (base) 29 (external device detection) |
| Managed virtual display | O | N | 26 (base) 33 ( TRUSTED or OWN_DISPLAY_GROUP) 34 ( DEVICE_DISPLAY_GROUP) |
| On-screen keyboard routing | R | N | 30 (DisplayImePolicyCompat) |
| On-screen touchpad overlay | R | R | 26 (TYPE_ACCESSIBILITY_OVERLAY) 30 ( getWindowsOnAllDisplays) |
| Floating button | O | F | 26 (TYPE_APPLICATION_OVERLAY and SYSTEM_ALERT_WINDOW) |
| Built-in screen off | R | N | 26 (SurfaceControl.setDisplayPowerMode) 35 ( IDisplayManager.requestDisplayPower) |
| Physical-key routing | R | N | 26 |
| Display hotplug monitor | I | N | 26 |
| Input hotplug monitor | I | N | 26 |
| Legend | |
|---|---|
| R | Required |
| O | Optional |
| F | Fallback |
| I | Inherited |
| N | Unused |
This application calls Android's built-in IWindowManager, IDisplayManager, and IInputManager services directly. Per-display configuration is applied with setForcedDisplaySize, setForcedDisplayDensityForUser, freezeDisplayRotation, setDisplayImePolicy, etc. Input routing goes through the IInputManager bridge to associate input devices with any specified display.
flowchart LR
Extend["Extend (via Shizuku)"]
WM["IWindowManager<br/>IDisplayManager<br/>IInputManager"]
Displays["All connected displays<br/><small>(physical + virtual)</small>"]
Extend --> WM --> Displays
Check out the CI for help on how to create reproducible builds.
- Braden Farmer for the use of
IWindowManagerAPIs inSecondScreen - Tao Wen for the use of
IDisplayManagerAPIs inconnect-screen - Genymobile for the use of
SurfaceControlAPIs inscrcpy