From eb0c8951196c637e44daf3c0617b131b997d5d2c Mon Sep 17 00:00:00 2001 From: Lena Date: Thu, 1 Jan 2026 00:00:00 +0000 Subject: scrcpy-android: mirror an Android device over wireless ADB Native Java app for Android 12+ that mirrors another Android device over wireless ADB, forwarding video, audio, touch input, and clipboard. Bundles a pinned scrcpy-server.jar and the vendored libadb-android stack. Supports h264/h265/av1 video and raw/opus audio with in-app codec selection. No NDK, no Kotlin. Includes JVM unit tests and a Docker-based emulator e2e rig. --- app/src/debug/res/layout/mirror.xml | 93 ++++ app/src/main/AndroidManifest.xml | 49 +++ app/src/main/assets/scrcpy-server.sha256 | 1 + app/src/main/assets/scrcpy-server.version | 1 + app/src/main/java/invalid/lena/scrcpy/Adb.java | 210 +++++++++ app/src/main/java/invalid/lena/scrcpy/App.java | 15 + .../main/java/invalid/lena/scrcpy/AtomicFiles.java | 40 ++ .../main/java/invalid/lena/scrcpy/AudioFrames.java | 18 + .../main/java/invalid/lena/scrcpy/AudioSink.java | 215 ++++++++++ .../main/java/invalid/lena/scrcpy/AudioStream.java | 93 ++++ .../java/invalid/lena/scrcpy/ControlMessages.java | 72 ++++ .../java/invalid/lena/scrcpy/ControlStream.java | 154 +++++++ .../main/java/invalid/lena/scrcpy/Controller.java | 173 ++++++++ .../main/java/invalid/lena/scrcpy/Crashlog.java | 48 +++ app/src/main/java/invalid/lena/scrcpy/Devices.java | 126 ++++++ app/src/main/java/invalid/lena/scrcpy/Log.java | 26 ++ app/src/main/java/invalid/lena/scrcpy/Main.java | 150 +++++++ app/src/main/java/invalid/lena/scrcpy/Mirror.java | 471 +++++++++++++++++++++ .../main/java/invalid/lena/scrcpy/MuxRecorder.java | 225 ++++++++++ app/src/main/java/invalid/lena/scrcpy/Server.java | 304 +++++++++++++ app/src/main/java/invalid/lena/scrcpy/Session.java | 318 ++++++++++++++ .../main/java/invalid/lena/scrcpy/Sessions.java | 75 ++++ .../main/java/invalid/lena/scrcpy/Settings.java | 93 ++++ .../java/invalid/lena/scrcpy/SettingsActivity.java | 110 +++++ app/src/main/java/invalid/lena/scrcpy/Sync.java | 78 ++++ .../main/java/invalid/lena/scrcpy/VideoFrames.java | 17 + .../java/invalid/lena/scrcpy/VideoRecorder.java | 19 + .../main/java/invalid/lena/scrcpy/VideoSink.java | 244 +++++++++++ .../main/java/invalid/lena/scrcpy/VideoStream.java | 156 +++++++ app/src/main/java/invalid/lena/scrcpy/Wire.java | 99 +++++ app/src/main/res/drawable/bg_card.xml | 8 + app/src/main/res/drawable/bg_field.xml | 18 + app/src/main/res/drawable/bg_status_pill.xml | 7 + app/src/main/res/drawable/btn_primary.xml | 11 + app/src/main/res/drawable/btn_secondary.xml | 12 + app/src/main/res/drawable/ic_device.xml | 14 + .../main/res/drawable/ic_launcher_background.xml | 7 + .../main/res/drawable/ic_launcher_foreground.xml | 52 +++ app/src/main/res/drawable/ic_notification.xml | 21 + app/src/main/res/drawable/ic_settings.xml | 12 + app/src/main/res/layout/device_row.xml | 28 ++ app/src/main/res/layout/main.xml | 181 ++++++++ app/src/main/res/layout/mirror.xml | 67 +++ app/src/main/res/layout/settings.xml | 294 +++++++++++++ app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml | 6 + app/src/main/res/values/colors.xml | 16 + app/src/main/res/values/dimens.xml | 17 + app/src/main/res/values/ids.xml | 10 + app/src/main/res/values/strings.xml | 36 ++ app/src/main/res/values/styles.xml | 73 ++++ app/src/main/res/values/themes.xml | 32 ++ .../java/invalid/lena/scrcpy/AtomicFilesTest.java | 54 +++ .../java/invalid/lena/scrcpy/AudioStreamTest.java | 123 ++++++ .../invalid/lena/scrcpy/ControlMessagesTest.java | 65 +++ .../invalid/lena/scrcpy/ControlStreamTest.java | 152 +++++++ .../test/java/invalid/lena/scrcpy/DevicesTest.java | 64 +++ .../test/java/invalid/lena/scrcpy/SyncTest.java | 137 ++++++ .../java/invalid/lena/scrcpy/VideoStreamTest.java | 245 +++++++++++ .../test/java/invalid/lena/scrcpy/WireTest.java | 94 ++++ 59 files changed, 5549 insertions(+) create mode 100644 app/src/debug/res/layout/mirror.xml create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/assets/scrcpy-server.sha256 create mode 100644 app/src/main/assets/scrcpy-server.version create mode 100644 app/src/main/java/invalid/lena/scrcpy/Adb.java create mode 100644 app/src/main/java/invalid/lena/scrcpy/App.java create mode 100644 app/src/main/java/invalid/lena/scrcpy/AtomicFiles.java create mode 100644 app/src/main/java/invalid/lena/scrcpy/AudioFrames.java create mode 100644 app/src/main/java/invalid/lena/scrcpy/AudioSink.java create mode 100644 app/src/main/java/invalid/lena/scrcpy/AudioStream.java create mode 100644 app/src/main/java/invalid/lena/scrcpy/ControlMessages.java create mode 100644 app/src/main/java/invalid/lena/scrcpy/ControlStream.java create mode 100644 app/src/main/java/invalid/lena/scrcpy/Controller.java create mode 100644 app/src/main/java/invalid/lena/scrcpy/Crashlog.java create mode 100644 app/src/main/java/invalid/lena/scrcpy/Devices.java create mode 100644 app/src/main/java/invalid/lena/scrcpy/Log.java create mode 100644 app/src/main/java/invalid/lena/scrcpy/Main.java create mode 100644 app/src/main/java/invalid/lena/scrcpy/Mirror.java create mode 100644 app/src/main/java/invalid/lena/scrcpy/MuxRecorder.java create mode 100644 app/src/main/java/invalid/lena/scrcpy/Server.java create mode 100644 app/src/main/java/invalid/lena/scrcpy/Session.java create mode 100644 app/src/main/java/invalid/lena/scrcpy/Sessions.java create mode 100644 app/src/main/java/invalid/lena/scrcpy/Settings.java create mode 100644 app/src/main/java/invalid/lena/scrcpy/SettingsActivity.java create mode 100644 app/src/main/java/invalid/lena/scrcpy/Sync.java create mode 100644 app/src/main/java/invalid/lena/scrcpy/VideoFrames.java create mode 100644 app/src/main/java/invalid/lena/scrcpy/VideoRecorder.java create mode 100644 app/src/main/java/invalid/lena/scrcpy/VideoSink.java create mode 100644 app/src/main/java/invalid/lena/scrcpy/VideoStream.java create mode 100644 app/src/main/java/invalid/lena/scrcpy/Wire.java create mode 100644 app/src/main/res/drawable/bg_card.xml create mode 100644 app/src/main/res/drawable/bg_field.xml create mode 100644 app/src/main/res/drawable/bg_status_pill.xml create mode 100644 app/src/main/res/drawable/btn_primary.xml create mode 100644 app/src/main/res/drawable/btn_secondary.xml create mode 100644 app/src/main/res/drawable/ic_device.xml create mode 100644 app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 app/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 app/src/main/res/drawable/ic_notification.xml create mode 100644 app/src/main/res/drawable/ic_settings.xml create mode 100644 app/src/main/res/layout/device_row.xml create mode 100644 app/src/main/res/layout/main.xml create mode 100644 app/src/main/res/layout/mirror.xml create mode 100644 app/src/main/res/layout/settings.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/dimens.xml create mode 100644 app/src/main/res/values/ids.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/styles.xml create mode 100644 app/src/main/res/values/themes.xml create mode 100644 app/src/test/java/invalid/lena/scrcpy/AtomicFilesTest.java create mode 100644 app/src/test/java/invalid/lena/scrcpy/AudioStreamTest.java create mode 100644 app/src/test/java/invalid/lena/scrcpy/ControlMessagesTest.java create mode 100644 app/src/test/java/invalid/lena/scrcpy/ControlStreamTest.java create mode 100644 app/src/test/java/invalid/lena/scrcpy/DevicesTest.java create mode 100644 app/src/test/java/invalid/lena/scrcpy/SyncTest.java create mode 100644 app/src/test/java/invalid/lena/scrcpy/VideoStreamTest.java create mode 100644 app/src/test/java/invalid/lena/scrcpy/WireTest.java (limited to 'app/src') diff --git a/app/src/debug/res/layout/mirror.xml b/app/src/debug/res/layout/mirror.xml new file mode 100644 index 0000000..5d0e845 --- /dev/null +++ b/app/src/debug/res/layout/mirror.xml @@ -0,0 +1,93 @@ + + + + + + + + + + +