Control an Android device from another Android device. Fork of yutils/Easycontrol 1.6.1.
- Android 16 black screen fixed. On Android 14+ the server mirrors the screen with
DisplayManager.createVirtualDisplay(name, width, height, displayIdToMirror, surface), as scrcpy does, and falls back toSurfaceControlif that fails. - Resolution tiers follow the phone screen: native, 80%, 60%, 40%.
- Change resolution on connect can match the phone. The tablet switches to the phone's screen resolution, orientation matched automatically, and switches back on disconnect.
- Resolution is always restored. This covers a normal disconnect, the adb shell closing, a dead network (10 s heartbeat timeout), the server being killed or crashing (a separate guard process restores it), and a normal reboot or shutdown. The previous size and density are backed up on the tablet first, so your own display size or the system's resolution setting comes back exactly. After a power loss, a direct
reboot, or adb being restarted mid-session, the next connect restores from that backup. - Disconnect actions always run. Lock, restore backlight and mute are done by the server when the session ends, so they also happen when the connection drops. Restore backlight now also works after the screen-off button.
- Backlight toggle fixed. Turning the backlight back on left the panel in doze (dim).
- Density follows resolution. When the resolution is changed, density is scaled by the same ratio, so the smallest width in dp stays as before and the launcher still fits. Your own display size setting is backed up on the tablet and restored afterwards.
- Foreground service while connected, so Android does not freeze the app in the background and drop the session.
- Bitrate up to 50 Mbps. It is picked automatically whenever resolution or FPS changes, and can still be set by hand.
- Update checker removed. The
com.kotlinx:appUpdatelibrary and its plain-HTTP check are gone. - No public signing key. Upstream ships its keystore and password, so you build with your own key.
- Fork branding removed.
You need JDK 21 and the Android SDK (platforms 34 and 35). Set ANDROID_HOME, or put sdk.dir=... in easycontrol/local.properties.
Create a signing key once and keep it. Every later build must use the same key, or you will have to uninstall before updating.
keytool -genkeypair -keystore easycontrol/app/doc/release.jks -storetype JKS \
-alias test -keyalg RSA -keysize 2048 -validity 10000 \
-storepass 123456 -keypass 123456 -dname "CN=private"Then build:
./easycontrol/gradlew --no-daemon assembleRelease -p easycontrolThe APK is written to easycontrol/app/build/outputs/apk/release/.
- Install it on the controlling device only.
- After you change server code, bump
versionCode. The client only pushes the server wheneasycontrol_server_<versionCode>.jaris missing. - Port 25166 has no authentication. Do not expose it, or the ADB port, to the internet. Use a VPN instead.
- To see which capture path is in use, run
adb logcat -s Easycontrol_Serveron the controlled device.
GPL-3.0. Based on mingzhixian/Easycontrol, yutils/Easycontrol and scrcpy.