mirror of
https://github.com/Genymobile/scrcpy.git
synced 2026-03-19 10:34:53 +01:00
Compare commits
18 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d744837f13 | ||
|
|
f7bc0bd5b5 | ||
|
|
8a3c6a3ae7 | ||
|
|
c530d95881 | ||
|
|
0b1e59186f | ||
|
|
e69f6f710d | ||
|
|
b858204786 | ||
|
|
e8510a8cc3 | ||
|
|
f9a63ec272 | ||
|
|
f6d0893316 | ||
|
|
ed65cd72fd | ||
|
|
70599998eb | ||
|
|
e87cd175cc | ||
|
|
14b15ceb06 | ||
|
|
b9bb4ff740 | ||
|
|
cc4a015256 | ||
|
|
8476b4aab8 | ||
|
|
a1491862e4 |
84
FAQ.md
Normal file
84
FAQ.md
Normal file
@@ -0,0 +1,84 @@
|
||||
# Frequently Asked Questions
|
||||
|
||||
## Common issues
|
||||
|
||||
The application is very young, it is not unlikely that you encounter problems
|
||||
with it.
|
||||
|
||||
Here are the common reported problems and their status.
|
||||
|
||||
### On Windows, I have no output in the console
|
||||
|
||||
When run in `cmd.exe`, the application does not print anything. Even `scrcpy
|
||||
--help` have no output. We don't know why yet.
|
||||
|
||||
However, if you run the very same `scrcpy.exe` from
|
||||
[MSYS2](https://www.msys2.org/) (`mingw64`), then it correctly prints output.
|
||||
|
||||
|
||||
### On Windows, when I start the application, nothing happens
|
||||
|
||||
The previous problem does not help to get a clue about the cause.
|
||||
|
||||
The most common is your device not being detected by `adb`, or is unauthorized.
|
||||
Check everything is ok by calling:
|
||||
|
||||
adb devices
|
||||
|
||||
Windows may need some [drivers] to detect your device.
|
||||
|
||||
[drivers]: https://developer.android.com/studio/run/oem-usb.html
|
||||
|
||||
If you still encounter problems, please see [issue 9].
|
||||
|
||||
[issue 9]: https://github.com/Genymobile/scrcpy/issues/9
|
||||
|
||||
|
||||
### The application does not work over `adb connect`
|
||||
|
||||
If the device is connected using `adb connect`, then you'll get this error:
|
||||
|
||||
error: more than one device/emulator
|
||||
ERROR: "adb reverse" returned with value 1
|
||||
|
||||
We plan to support it in future versions. See [issue 5].
|
||||
|
||||
[issue 5]: https://github.com/Genymobile/scrcpy/issues/5
|
||||
|
||||
|
||||
### Mouse clicks do not work
|
||||
|
||||
On many LG devices, [mouse clicks do not work][issue 18]. We're [working][pr27]
|
||||
on it.
|
||||
|
||||
[issue 18]: https://github.com/Genymobile/scrcpy/issues/18
|
||||
[pr27]: https://github.com/Genymobile/scrcpy/pull/27
|
||||
|
||||
|
||||
### I get a black screen for some applications like Silence
|
||||
|
||||
This is expected, they requested to protect the screen.
|
||||
|
||||
In [Silence], you can disable it in settings → Privacy → Screen security.
|
||||
|
||||
[silence]: https://f-droid.org/en/packages/org.smssecure.smssecure/
|
||||
|
||||
See [issue 36].
|
||||
|
||||
[issue 36]: https://github.com/Genymobile/scrcpy/issues/36
|
||||
|
||||
|
||||
### Mouse clicks at wrong location
|
||||
|
||||
On MacOS, with HiDPI support and multiple screens, input location are wrongly
|
||||
scaled. See [issue 15].
|
||||
|
||||
[issue 15]: https://github.com/Genymobile/scrcpy/issues/15
|
||||
|
||||
A workaround is to build with HiDPI support disabled:
|
||||
|
||||
```bash
|
||||
meson x --buildtype release -Dhidpi_support=false
|
||||
```
|
||||
|
||||
However, the video will be displayed at lower resolution.
|
||||
177
README.md
177
README.md
@@ -2,7 +2,7 @@
|
||||
|
||||
This application provides display and control of Android devices connected on
|
||||
USB. It does not require any _root_ access. It works on _GNU/Linux_, _Windows_
|
||||
and _Mac OS_.
|
||||
and _MacOS_.
|
||||
|
||||

|
||||
|
||||
@@ -37,15 +37,44 @@ The client requires _FFmpeg_ and _LibSDL2_.
|
||||
|
||||
#### Linux
|
||||
|
||||
Install the required packages from your package manager (here, for Debian):
|
||||
Install the required packages from your package manager.
|
||||
|
||||
# runtime dependencies
|
||||
sudo apt install ffmpeg libsdl2-2.0.0
|
||||
##### Debian/Ubuntu
|
||||
|
||||
# build dependencies
|
||||
sudo apt install make gcc openjdk-8-jdk pkg-config meson zip \
|
||||
libavcodec-dev libavformat-dev libavutil-dev \
|
||||
libsdl2-dev
|
||||
```bash
|
||||
# runtime dependencies
|
||||
sudo apt install ffmpeg libsdl2-2.0.0
|
||||
|
||||
# client build dependencies
|
||||
sudo apt install make gcc pkg-config meson \
|
||||
libavcodec-dev libavformat-dev libavutil-dev \
|
||||
libsdl2-dev
|
||||
|
||||
# server build dependencies
|
||||
sudo apt install openjdk-8-jdk
|
||||
```
|
||||
|
||||
##### Fedora
|
||||
|
||||
```bash
|
||||
# enable RPM fusion free
|
||||
sudo dnf install https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm
|
||||
|
||||
# client build dependencies
|
||||
sudo dnf install SDL2-devel ffms2-devel meson gcc make
|
||||
|
||||
# server build dependencies
|
||||
sudo dnf install java
|
||||
```
|
||||
|
||||
##### Arch Linux
|
||||
|
||||
Two [AUR] packages have been created by users:
|
||||
|
||||
- [`scrcpy`](https://aur.archlinux.org/packages/scrcpy/)
|
||||
- [`scrcpy-prebuiltserver`](https://aur.archlinux.org/packages/scrcpy-prebuiltserver/)
|
||||
|
||||
[AUR]: https://wiki.archlinux.org/index.php/Arch_User_Repository
|
||||
|
||||
|
||||
#### Windows
|
||||
@@ -65,22 +94,24 @@ project. From an MSYS2 terminal, install the required packages:
|
||||
|
||||
[MSYS2]: http://www.msys2.org/
|
||||
|
||||
# runtime dependencies
|
||||
pacman -S mingw-w64-x86_64-SDL2 \
|
||||
mingw-w64-x86_64-ffmpeg
|
||||
```bash
|
||||
# runtime dependencies
|
||||
pacman -S mingw-w64-x86_64-SDL2 \
|
||||
mingw-w64-x86_64-ffmpeg
|
||||
|
||||
# build dependencies
|
||||
pacman -S mingw-w64-x86_64-make \
|
||||
mingw-w64-x86_64-gcc \
|
||||
mingw-w64-x86_64-pkg-config \
|
||||
mingw-w64-x86_64-meson \
|
||||
zip
|
||||
# client build dependencies
|
||||
pacman -S mingw-w64-x86_64-make \
|
||||
mingw-w64-x86_64-gcc \
|
||||
mingw-w64-x86_64-pkg-config \
|
||||
mingw-w64-x86_64-meson
|
||||
```
|
||||
|
||||
Java (>= 7) is not available in MSYS2, so if you plan to build the server,
|
||||
install it manually and make it available from the `PATH`:
|
||||
|
||||
export PATH="$JAVA_HOME/bin:$PATH"
|
||||
|
||||
```bash
|
||||
export PATH="$JAVA_HOME/bin:$PATH"
|
||||
```
|
||||
|
||||
#### Mac OS
|
||||
|
||||
@@ -88,17 +119,20 @@ Use [Homebrew] to install the packages:
|
||||
|
||||
[Homebrew]: https://brew.sh/
|
||||
|
||||
# runtime dependencies
|
||||
brew install sdl2 ffmpeg
|
||||
```bash
|
||||
# runtime dependencies
|
||||
brew install sdl2 ffmpeg
|
||||
|
||||
# build dependencies
|
||||
brew install gcc pkg-config meson zip
|
||||
# client build dependencies
|
||||
brew install gcc pkg-config meson
|
||||
```
|
||||
|
||||
Java (>= 7) is not available in Homebrew, so if you plan to build the server,
|
||||
install it manually and make it available from the `PATH`:
|
||||
|
||||
export PATH="$JAVA_HOME/bin:$PATH"
|
||||
|
||||
```bash
|
||||
export PATH="$JAVA_HOME/bin:$PATH"
|
||||
```
|
||||
|
||||
### Common steps
|
||||
|
||||
@@ -107,21 +141,29 @@ its directory. For example:
|
||||
|
||||
[Android SDK]: https://developer.android.com/studio/index.html
|
||||
|
||||
export ANDROID_HOME=~/android/sdk
|
||||
```bash
|
||||
export ANDROID_HOME=~/android/sdk
|
||||
```
|
||||
|
||||
Then, build `scrcpy`:
|
||||
|
||||
meson x --buildtype release --strip -Db_lto=true
|
||||
cd x
|
||||
ninja
|
||||
```bash
|
||||
meson x --buildtype release --strip -Db_lto=true
|
||||
cd x
|
||||
ninja
|
||||
```
|
||||
|
||||
You can test it from here:
|
||||
|
||||
ninja run
|
||||
```bash
|
||||
ninja run
|
||||
```
|
||||
|
||||
Or you can install it on the system:
|
||||
|
||||
sudo ninja install # without sudo on Windows
|
||||
```bash
|
||||
sudo ninja install # without sudo on Windows
|
||||
```
|
||||
|
||||
This installs two files:
|
||||
|
||||
@@ -147,12 +189,13 @@ In that case, the build does not require Java or the Android SDK.
|
||||
Download the prebuilt server somewhere, and specify its path during the Meson
|
||||
configuration:
|
||||
|
||||
meson x --buildtype release --strip -Db_lto=true \
|
||||
-Dprebuilt_server=/path/to/scrcpy-server.jar
|
||||
cd x
|
||||
ninja
|
||||
sudo ninja install
|
||||
|
||||
```bash
|
||||
meson x --buildtype release --strip -Db_lto=true \
|
||||
-Dprebuilt_server=/path/to/scrcpy-server.jar
|
||||
cd x
|
||||
ninja
|
||||
sudo ninja install
|
||||
```
|
||||
|
||||
## Run
|
||||
|
||||
@@ -160,50 +203,63 @@ _At runtime, `adb` must be accessible from your `PATH`._
|
||||
|
||||
If everything is ok, just plug an Android device, and execute:
|
||||
|
||||
scrcpy
|
||||
```bash
|
||||
scrcpy
|
||||
```
|
||||
|
||||
It accepts command-line arguments, listed by:
|
||||
|
||||
scrcpy --help
|
||||
```bash
|
||||
scrcpy --help
|
||||
```
|
||||
|
||||
For example, to decrease video bitrate to 2Mbps (default is 8Mbps):
|
||||
|
||||
scrcpy -b 2M
|
||||
```bash
|
||||
scrcpy -b 2M
|
||||
```
|
||||
|
||||
To limit the video dimensions (e.g. if the device is 2540×1440, but the host
|
||||
screen is smaller, or cannot decode such a high definition):
|
||||
|
||||
scrcpy -m 1024
|
||||
```bash
|
||||
scrcpy -m 1024
|
||||
```
|
||||
|
||||
If several devices are listed in `adb devices`, you must specify the _serial_:
|
||||
|
||||
scrcpy -s 0123456789abcdef
|
||||
```bash
|
||||
scrcpy -s 0123456789abcdef
|
||||
```
|
||||
|
||||
To run without installing:
|
||||
|
||||
./run x [options]
|
||||
```bash
|
||||
./run x [options]
|
||||
```
|
||||
|
||||
(where `x` is your build directory).
|
||||
|
||||
|
||||
## Shortcuts
|
||||
|
||||
| Action | Shortcut |
|
||||
| -------------------------------------- |:---------------------------- |
|
||||
| switch fullscreen mode | `Ctrl`+`f` |
|
||||
| resize window to 1:1 (pixel-perfect) | `Ctrl`+`g` |
|
||||
| resize window to remove black borders | `Ctrl`+`x` |
|
||||
| click on `HOME` | `Ctrl`+`h` \| _Middle-click_ |
|
||||
| click on `BACK` | `Ctrl`+`b` \| _Right-click¹_ |
|
||||
| click on `APP_SWITCH` | `Ctrl`+`m` |
|
||||
| click on `VOLUME_UP` | `Ctrl`+`+` |
|
||||
| click on `VOLUME_DOWN` | `Ctrl`+`-` |
|
||||
| click on `POWER` | `Ctrl`+`p` |
|
||||
| turn screen on | _Right-click¹_ |
|
||||
| paste computer clipboard to device | `Ctrl`+`v` |
|
||||
| enable/disable FPS counter (on stdout) | `Ctrl`+`i` |
|
||||
| Action | Shortcut |
|
||||
| -------------------------------------- |:---------------------------- |
|
||||
| switch fullscreen mode | `Ctrl`+`f` |
|
||||
| resize window to 1:1 (pixel-perfect) | `Ctrl`+`g` |
|
||||
| resize window to remove black borders | `Ctrl`+`x` \| _Double-click¹_ |
|
||||
| click on `HOME` | `Ctrl`+`h` \| _Middle-click_ |
|
||||
| click on `BACK` | `Ctrl`+`b` \| _Right-click²_ |
|
||||
| click on `APP_SWITCH` | `Ctrl`+`m` |
|
||||
| click on `VOLUME_UP` | `Ctrl`+`+` |
|
||||
| click on `VOLUME_DOWN` | `Ctrl`+`-` |
|
||||
| click on `POWER` | `Ctrl`+`p` |
|
||||
| turn screen on | _Right-click¹_ |
|
||||
| paste computer clipboard to device | `Ctrl`+`v` |
|
||||
| enable/disable FPS counter (on stdout) | `Ctrl`+`i` |
|
||||
|
||||
_¹Right-click turns the screen on if it was off, presses BACK otherwise._
|
||||
_¹Double-click on black borders to remove them._
|
||||
_²Right-click turns the screen on if it was off, presses BACK otherwise._
|
||||
|
||||
|
||||
## Why _scrcpy_?
|
||||
@@ -216,6 +272,11 @@ A colleague challenged me to find a name as unpronounceable as [gnirehtet].
|
||||
[`strcpy`]: http://man7.org/linux/man-pages/man3/strcpy.3.html
|
||||
|
||||
|
||||
## Common issues
|
||||
|
||||
See the [FAQ](FAQ.md).
|
||||
|
||||
|
||||
## Developers
|
||||
|
||||
Read the [developers page].
|
||||
|
||||
@@ -42,7 +42,7 @@ conf = configuration_data()
|
||||
conf.set('BUILD_DEBUG', get_option('buildtype') == 'debug')
|
||||
|
||||
# the version, updated on release
|
||||
conf.set_quoted('SCRCPY_VERSION', '1.0')
|
||||
conf.set_quoted('SCRCPY_VERSION', '1.1')
|
||||
|
||||
# the prefix used during configuration (meson --prefix=PREFIX)
|
||||
conf.set_quoted('PREFIX', get_option('prefix'))
|
||||
|
||||
@@ -172,7 +172,10 @@ SDL_bool mouse_wheel_from_sdl_to_android(const SDL_MouseWheelEvent *from,
|
||||
to->scroll_event.position = position;
|
||||
|
||||
int mul = from->direction == SDL_MOUSEWHEEL_NORMAL ? 1 : -1;
|
||||
to->scroll_event.hscroll = mul * from->x;
|
||||
// SDL behavior seems inconsistent between horizontal and vertical scrolling
|
||||
// so reverse the horizontal
|
||||
// <https://wiki.libsdl.org/SDL_MouseWheelEvent#Remarks>
|
||||
to->scroll_event.hscroll = -mul * from->x;
|
||||
to->scroll_event.vscroll = mul * from->y;
|
||||
|
||||
return SDL_TRUE;
|
||||
|
||||
@@ -235,6 +235,16 @@ void input_manager_process_mouse_button(struct input_manager *input_manager,
|
||||
action_home(input_manager->controller);
|
||||
return;
|
||||
}
|
||||
// double-click on black borders resize to fit the device screen
|
||||
if (event->button == SDL_BUTTON_LEFT && event->clicks == 2) {
|
||||
SDL_bool outside_device_screen =
|
||||
event->x < 0 || event->x >= input_manager->screen->frame_size.width ||
|
||||
event->y < 0 || event->y >= input_manager->screen->frame_size.height;
|
||||
if (outside_device_screen) {
|
||||
screen_resize_to_fit(input_manager->screen);
|
||||
}
|
||||
return;
|
||||
}
|
||||
};
|
||||
struct control_event control_event;
|
||||
if (mouse_button_from_sdl_to_android(event, input_manager->screen->frame_size, &control_event)) {
|
||||
|
||||
@@ -57,6 +57,7 @@ static void usage(const char *arg0) {
|
||||
" resize window to 1:1 (pixel-perfect)\n"
|
||||
"\n"
|
||||
" Ctrl+x\n"
|
||||
" Double-click on black borders\n"
|
||||
" resize window to remove black borders\n"
|
||||
"\n"
|
||||
" Ctrl+h\n"
|
||||
@@ -235,6 +236,12 @@ static SDL_bool parse_args(struct args *args, int argc, char *argv[]) {
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
#ifdef __WINDOWS__
|
||||
// disable buffering, we want logs immediately
|
||||
// even line buffering (setvbuf() with mode _IOLBF) is not sufficient
|
||||
setbuf(stdout, NULL);
|
||||
setbuf(stderr, NULL);
|
||||
#endif
|
||||
struct args args = {
|
||||
.serial = NULL,
|
||||
.help = SDL_FALSE,
|
||||
|
||||
@@ -35,7 +35,29 @@ static struct input_manager input_manager = {
|
||||
.screen = &screen,
|
||||
};
|
||||
|
||||
#if defined(__APPLE__) || defined(__WINDOWS__)
|
||||
# define CONTINUOUS_RESIZING_WORKAROUND
|
||||
#endif
|
||||
|
||||
#ifdef CONTINUOUS_RESIZING_WORKAROUND
|
||||
// On Windows and MacOS, resizing blocks the event loop, so resizing events are
|
||||
// not triggered. As a workaround, handle them in an event handler.
|
||||
//
|
||||
// <https://bugzilla.libsdl.org/show_bug.cgi?id=2077>
|
||||
// <https://stackoverflow.com/a/40693139/1987178>
|
||||
static int event_watcher(void *data, SDL_Event *event) {
|
||||
if (event->type == SDL_WINDOWEVENT && event->window.event == SDL_WINDOWEVENT_RESIZED) {
|
||||
// called from another thread, not very safe, but it's a workaround!
|
||||
screen_render(&screen);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static void event_loop(void) {
|
||||
#ifdef CONTINUOUS_RESIZING_WORKAROUND
|
||||
SDL_AddEventWatch(event_watcher, NULL);
|
||||
#endif
|
||||
SDL_Event event;
|
||||
while (SDL_WaitEvent(&event)) {
|
||||
switch (event.type) {
|
||||
|
||||
@@ -6,8 +6,8 @@ android {
|
||||
applicationId "com.genymobile.scrcpy"
|
||||
minSdkVersion 21
|
||||
targetSdkVersion 27
|
||||
versionCode 1
|
||||
versionName "1.0"
|
||||
versionCode 2
|
||||
versionName "1.1"
|
||||
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
|
||||
}
|
||||
buildTypes {
|
||||
|
||||
@@ -36,7 +36,11 @@ public final class DesktopConnection implements Closeable {
|
||||
|
||||
private static LocalSocket listenAndAccept(String abstractName) throws IOException {
|
||||
LocalServerSocket localServerSocket = new LocalServerSocket(abstractName);
|
||||
return localServerSocket.accept();
|
||||
try {
|
||||
return localServerSocket.accept();
|
||||
} finally {
|
||||
localServerSocket.close();
|
||||
}
|
||||
}
|
||||
|
||||
public static DesktopConnection open(Device device, boolean tunnelForward) throws IOException {
|
||||
|
||||
Reference in New Issue
Block a user