22 KiB
Apenas o README original é garantido estar atualizado.
scrcpy (v1.17)
Esta aplicação fornece exibição e controle de dispositivos Android conectados via USB (ou via TCP/IP). Não requer nenhum acesso root. Funciona em GNU/Linux, Windows e macOS.
Foco em:
- leveza (nativo, mostra apenas a tela do dispositivo)
- performance (30~60fps)
- qualidade (1920×1080 ou acima)
- baixa latência (35~70ms)
- baixo tempo de inicialização (~1 segundo para mostrar a primeira imagem)
- não intrusivo (nada é deixado instalado no dispositivo)
Requisitos
O dispositivo Android requer pelo menos a API 21 (Android 5.0).
Tenha certeza de ter ativado a depuração adb no(s) seu(s) dispositivo(s).
Em alguns dispositivos, você também precisa ativar uma opção adicional para controlá-lo usando teclado e mouse.
Obter o app
Linux
No Debian (testing e sid por enquanto) e Ubuntu (20.04):
apt install scrcpy
Um pacote Snap está disponível: scrcpy
.
Para Fedora, um pacote COPR está disponível: scrcpy
.
Para Arch Linux, um pacote AUR está disponível: scrcpy
.
Para Gentoo, uma Ebuild está disponível: scrcpy/
.
Você também pode compilar o app manualmente (não se preocupe, não é tão difícil).
Windows
Para Windows, por simplicidade, um arquivo pré-compilado com todas as dependências
(incluindo adb
) está disponível:
Também está disponível em Chocolatey:
choco install scrcpy
choco install adb # se você ainda não o tem
E no Scoop:
scoop install scrcpy
scoop install adb # se você ainda não o tem
Você também pode compilar o app manualmente.
macOS
A aplicação está disponível em Homebrew. Apenas instale-a:
brew install scrcpy
Você precisa do adb
, acessível pelo seu PATH
. Se você ainda não o tem:
# Homebrew >= 2.6.0
brew install --cask android-platform-tools
# Homebrew < 2.6.0
brew cask install android-platform-tools
Você também pode compilar o app manualmente.
Executar
Conecte um dispositivo Android e execute:
scrcpy
Também aceita argumentos de linha de comando, listados por:
scrcpy --help
Funcionalidades
Configuração de captura
Reduzir tamanho
Algumas vezes, é útil espelhar um dispositivo Android em uma resolução menor para aumentar a performance.
Para limitar ambos (largura e altura) para algum valor (ex: 1024):
scrcpy --max-size 1024
scrcpy -m 1024 # versão curta
A outra dimensão é calculada para que a proporção do dispositivo seja preservada. Dessa forma, um dispositivo de 1920x1080 será espelhado em 1024x576.
Mudar bit-rate
O bit-rate padrão é 8 Mbps. Para mudar o bit-rate do vídeo (ex: para 2 Mbps):
scrcpy --bit-rate 2M
scrcpy -b 2M # versão curta
Limitar frame rate
O frame rate de captura pode ser limitado:
scrcpy --max-fps 15
Isso é oficialmente suportado desde o Android 10, mas pode funcionar em versões anteriores.
Cortar
A tela do dispositivo pode ser cortada para espelhar apenas uma parte da tela.
Isso é útil por exemplo, para espelhar apenas um olho do Oculus Go:
scrcpy --crop 1224:1440:0:0 # 1224x1440 no deslocamento (0,0)
Se --max-size
também for especificado, o redimensionamento é aplicado após o corte.
Travar orientação do vídeo
Para travar a orientação do espelhamento:
scrcpy --lock-video-orientation 0 # orientação natural
scrcpy --lock-video-orientation 1 # 90° sentido anti-horário
scrcpy --lock-video-orientation 2 # 180°
scrcpy --lock-video-orientation 3 # 90° sentido horário
Isso afeta a orientação de gravação.
A janela também pode ser rotacionada independentemente.
Encoder
Alguns dispositivos têm mais de um encoder, e alguns deles podem causar problemas ou travar. É possível selecionar um encoder diferente:
scrcpy --encoder OMX.qcom.video.encoder.avc
Para listar os encoders disponíveis, você pode passar um nome de encoder inválido, o erro dará os encoders disponíveis:
scrcpy --encoder _
Gravando
É possível gravar a tela enquanto ocorre o espelhamento:
scrcpy --record file.mp4
scrcpy -r file.mkv
Para desativar o espelhamento durante a gravação:
scrcpy --no-display --record file.mp4
scrcpy -Nr file.mkv
# interrompa a gravação com Ctrl+C
"Frames pulados" são gravados, mesmo que não sejam exibidos em tempo real (por motivos de performance). Frames têm seu horário carimbado no dispositivo, então variação de atraso nos pacotes não impacta o arquivo gravado.
Conexão
Sem fio
Scrcpy usa adb
para se comunicar com o dispositivo, e adb
pode conectar-se a um
dispositivo via TCP/IP:
-
Conecte o dispositivo no mesmo Wi-Fi do seu computador.
-
Pegue o endereço IP do seu dispositivo, em Configurações → Sobre o telefone → Status, ou executando este comando:
adb shell ip route | awk '{print $9}'
-
Ative o adb via TCP/IP no seu dispositivo:
adb tcpip 5555
. -
Desconecte seu dispositivo.
-
Conecte-se ao seu dispositivo:
adb connect DEVICE_IP:5555
(substituaDEVICE_IP
). -
Execute
scrcpy
como de costume.
Pode ser útil diminuir o bit-rate e a resolução:
scrcpy --bit-rate 2M --max-size 800
scrcpy -b2M -m800 # versão curta
Múltiplos dispositivos
Se vários dispositivos são listados em adb devices
, você deve especificar o serial:
scrcpy --serial 0123456789abcdef
scrcpy -s 0123456789abcdef # versão curta
Se o dispositivo está conectado via TCP/IP:
scrcpy --serial 192.168.0.1:5555
scrcpy -s 192.168.0.1:5555 # versão curta
Você pode iniciar várias instâncias do scrcpy para vários dispositivos.
Iniciar automaticamente quando dispositivo é conectado
Você pode usar AutoAdb:
autoadb scrcpy -s '{}'
Túnel SSH
Para conectar-se a um dispositivo remoto, é possível conectar um cliente adb
local a
um servidor adb
remoto (contanto que eles usem a mesma versão do protocolo
adb):
adb kill-server # encerra o servidor adb local em 5037
ssh -CN -L5037:localhost:5037 -R27183:localhost:27183 your_remote_computer
# mantenha isso aberto
De outro terminal:
scrcpy
Para evitar ativar o encaminhamento de porta remota, você pode forçar uma conexão
de encaminhamento (note o -L
em vez de -R
):
adb kill-server # encerra o servidor adb local em 5037
ssh -CN -L5037:localhost:5037 -L27183:localhost:27183 your_remote_computer
# mantenha isso aberto
De outro terminal:
scrcpy --force-adb-forward
Igual a conexões sem fio, pode ser útil reduzir a qualidade:
scrcpy -b2M -m800 --max-fps 15
Configuração de janela
Título
Por padrão, o título da janela é o modelo do dispositivo. Isso pode ser mudado:
scrcpy --window-title 'Meu dispositivo'
Posição e tamanho
A posição e tamanho iniciais da janela podem ser especificados:
scrcpy --window-x 100 --window-y 100 --window-width 800 --window-height 600
Sem bordas
Para desativar decorações de janela:
scrcpy --window-borderless
Sempre no topo
Para manter a janela do scrcpy sempre no topo:
scrcpy --always-on-top
Tela cheia
A aplicação pode ser iniciada diretamente em tela cheia:
scrcpy --fullscreen
scrcpy -f # versão curta
Tela cheia pode ser alternada dinamicamente com MOD+f.
Rotação
A janela pode ser rotacionada:
scrcpy --rotation 1
Valores possíveis são:
0
: sem rotação1
: 90 graus sentido anti-horário2
: 180 graus3
: 90 graus sentido horário
A rotação também pode ser mudada dinamicamente com MOD+← (esquerda) e MOD+→ (direita).
Note que scrcpy controla 3 rotações diferentes:
- MOD+r requisita ao dispositivo para mudar entre retrato e paisagem (a aplicação em execução pode se recusar, se ela não suporta a orientação requisitada).
--lock-video-orientation
muda a orientação de espelhamento (a orientação do vídeo enviado pelo dispositivo para o computador). Isso afeta a gravação.--rotation
(ou MOD+←/MOD+→) rotaciona apenas o conteúdo da janela. Isso afeta apenas a exibição, não a gravação.
Outras opções de espelhamento
Apenas leitura
Para desativar controles (tudo que possa interagir com o dispositivo: teclas de entrada, eventos de mouse, arrastar e soltar arquivos):
scrcpy --no-control
scrcpy -n
Display
Se vários displays estão disponíveis, é possível selecionar o display para espelhar:
scrcpy --display 1
A lista de IDs dos displays pode ser obtida por:
adb shell dumpsys display # busca "mDisplayId=" na saída
O display secundário pode apenas ser controlado se o dispositivo roda pelo menos Android 10 (caso contrário é espelhado como apenas leitura).
Permanecer ativo
Para evitar que o dispositivo seja suspenso após um delay quando o dispositivo é conectado:
scrcpy --stay-awake
scrcpy -w
O estado inicial é restaurado quando o scrcpy é fechado.
Desligar tela
É possível desligar a tela do dispositivo durante o início do espelhamento com uma opção de linha de comando:
scrcpy --turn-screen-off
scrcpy -S
Ou apertando MOD+o a qualquer momento.
Para ligar novamente, pressione MOD+Shift+o.
No Android, o botão de POWER
sempre liga a tela. Por conveniência, se
POWER
é enviado via scrcpy (via clique-direito ou MOD+p), ele
forçará a desligar a tela após um delay pequeno (numa base de melhor esforço).
O botão POWER
físico ainda causará a tela ser ligada.
Também pode ser útil evitar que o dispositivo seja suspenso:
scrcpy --turn-screen-off --stay-awake
scrcpy -Sw
Renderizar frames expirados
Por padrão, para minimizar a latência, scrcpy sempre renderiza o último frame decodificado disponível, e descarta o anterior.
Para forçar a renderização de todos os frames (com o custo de um possível aumento de latência), use:
scrcpy --render-expired-frames
Mostrar toques
Para apresentações, pode ser útil mostrar toques físicos (no dispositivo físico).
Android fornece esta funcionalidade nas Opções do desenvolvedor.
Scrcpy fornece esta opção de ativar esta funcionalidade no início e restaurar o valor inicial no encerramento:
scrcpy --show-touches
scrcpy -t
Note que isto mostra apenas toques físicos (com o dedo no dispositivo).
Desativar descanso de tela
Por padrão, scrcpy não evita que o descanso de tela rode no computador.
Para desativá-lo:
scrcpy --disable-screensaver
Controle de entrada
Rotacionar a tela do dispositivo
Pressione MOD+r para mudar entre os modos retrato e paisagem.
Note que só será rotacionado se a aplicação em primeiro plano suportar a orientação requisitada.
Copiar-colar
Sempre que a área de transferência do Android muda, é automaticamente sincronizada com a área de transferência do computador.
Qualquer atalho com Ctrl é encaminhado para o dispositivo. Em particular:
- Ctrl+c tipicamente copia
- Ctrl+x tipicamente recorta
- Ctrl+v tipicamente cola (após a sincronização de área de transferência computador-para-dispositivo)
Isso tipicamente funciona como esperado.
O comportamento de fato depende da aplicação ativa, no entanto. Por exemplo, Termux envia SIGINT com Ctrl+c, e K-9 Mail compõe uma nova mensagem.
Para copiar, recortar e colar em tais casos (mas apenas suportado no Android >= 7):
- MOD+c injeta
COPY
- MOD+x injeta
CUT
- MOD+v injeta
PASTE
(após a sincronização de área de transferência computador-para-dispositivo)
Em adição, MOD+Shift+v permite injetar o texto da área de transferência do computador como uma sequência de eventos de tecla. Isso é útil quando o componente não aceita colar texto (por exemplo no Termux), mas pode quebrar conteúdo não-ASCII.
ADVERTÊNCIA: Colar a área de transferência do computador para o dispositivo (tanto via Ctrl+v quanto MOD+v) copia o conteúdo para a área de transferência do dispositivo. Como consequência, qualquer aplicação Android pode ler o seu conteúdo. Você deve evitar colar conteúdo sensível (como senhas) dessa forma.
Alguns dispositivos não se comportam como esperado quando a área de transferência é definida
programaticamente. Uma opção --legacy-paste
é fornecida para mudar o comportamento
de Ctrl+v e MOD+v para que eles
também injetem o texto da área de transferência do computador como uma sequência de eventos de tecla (da mesma
forma que MOD+Shift+v).
Pinçar para dar zoom
Para simular "pinçar para dar zoom": Ctrl+clicar-e-mover.
Mais precisamente, segure Ctrl enquanto pressiona o botão de clique-esquerdo. Até que o botão de clique-esquerdo seja liberado, todos os movimentos do mouse ampliar e rotacionam o conteúdo (se suportado pelo app) relativo ao centro da tela.
Concretamente, scrcpy gera eventos adicionais de toque de um "dedo virtual" em uma posição invertida em relação ao centro da tela.
Preferência de injeção de texto
Existem dois tipos de eventos gerados ao digitar um texto:
- eventos de tecla, sinalizando que a tecla foi pressionada ou solta;
- eventos de texto, sinalizando que o texto foi inserido.
Por padrão, letras são injetadas usando eventos de tecla, assim o teclado comporta-se como esperado em jogos (normalmente para teclas WASD).
Mas isso pode causar problemas. Se você encontrar tal problema, você pode evitá-lo com:
scrcpy --prefer-text
(mas isso vai quebrar o comportamento do teclado em jogos)
Repetir tecla
Por padrão, segurar uma tecla gera eventos de tecla repetidos. Isso pode causar problemas de performance em alguns jogos, onde esses eventos são inúteis de qualquer forma.
Para evitar o encaminhamento eventos de tecla repetidos:
scrcpy --no-key-repeat
Clique-direito e clique-do-meio
Por padrão, clique-direito dispara BACK (ou POWER) e clique-do-meio dispara HOME. Para desabilitar esses atalhos e encaminhar os cliques para o dispositivo:
scrcpy --forward-all-clicks
Soltar arquivo
Instalar APK
Para instalar um APK, arraste e solte o arquivo APK (com extensão .apk
) na janela
scrcpy.
Não existe feedback visual, um log é imprimido no console.
Enviar arquivo para dispositivo
Para enviar um arquivo para /sdcard/
no dispositivo, arraste e solte um arquivo (não-APK) para a
janela do scrcpy.
Não existe feedback visual, um log é imprimido no console.
O diretório alvo pode ser mudado ao iniciar:
scrcpy --push-target /sdcard/foo/bar/
Encaminhamento de áudio
Áudio não é encaminhado pelo scrcpy. Use sndcpy.
Também veja issue #14.
Atalhos
Na lista a seguir, MOD é o modificador de atalho. Por padrão, é Alt (esquerdo) ou Super (esquerdo).
Ele pode ser mudado usando --shortcut-mod
. Possíveis teclas são lctrl
, rctrl
,
lalt
, ralt
, lsuper
e rsuper
. Por exemplo:
# usar RCtrl para atalhos
scrcpy --shortcut-mod=rctrl
# usar tanto LCtrl+LAlt quanto LSuper para atalhos
scrcpy --shortcut-mod=lctrl+lalt,lsuper
Super é tipicamente a tecla Windows ou Cmd.
Ação | Atalho |
---|---|
Mudar modo de tela cheia | MOD+f |
Rotacionar display para esquerda | MOD+← (esquerda) |
Rotacionar display para direita | MOD+→ (direita) |
Redimensionar janela para 1:1 (pixel-perfect) | MOD+g |
Redimensionar janela para remover bordas pretas | MOD+w | Clique-duplo¹ |
Clicar em HOME |
MOD+h | Clique-do-meio |
Clicar em BACK |
MOD+b | Clique-direito² |
Clicar em APP_SWITCH |
MOD+s |
Clicar em MENU (desbloquear tela |
MOD+m |
Clicar em VOLUME_UP |
MOD+↑ (cima) |
Clicar em VOLUME_DOWN |
MOD+↓ (baixo) |
Clicar em POWER |
MOD+p |
Ligar | Clique-direito² |
Desligar tela do dispositivo (continuar espelhando) | MOD+o |
Ligar tela do dispositivo | MOD+Shift+o |
Rotacionar tela do dispositivo | MOD+r |
Expandir painel de notificação | MOD+n |
Colapsar painel de notificação | MOD+Shift+n |
Copiar para área de transferência³ | MOD+c |
Recortar para área de transferência³ | MOD+x |
Sincronizar áreas de transferência e colar³ | MOD+v |
Injetar texto da área de transferência do computador | MOD+Shift+v |
Ativar/desativar contador de FPS (em stdout) | MOD+i |
Pinçar para dar zoom | Ctrl+clicar-e-mover |
¹Clique-duplo em bordas pretas para removê-las.
²Clique-direito liga a tela se ela estiver desligada, pressiona BACK caso contrário.
³Apenas em Android >= 7.
Todos os atalhos Ctrl+tecla são encaminhados para o dispositivo, para que eles sejam tratados pela aplicação ativa.
Caminhos personalizados
Para usar um binário adb específico, configure seu caminho na variável de ambiente
ADB
:
ADB=/caminho/para/adb scrcpy
Para sobrepor o caminho do arquivo scrcpy-server
, configure seu caminho em
SCRCPY_SERVER_PATH
.
Por quê scrcpy?
Um colega me desafiou a encontrar um nome tão impronunciável quanto gnirehtet.
strcpy
copia uma string; scrcpy
copia uma screen.
Como compilar?
Veja BUILD.
Problemas comuns
Veja o FAQ.
Desenvolvedores
Leia a página dos desenvolvedores.
Licença
Copyright (C) 2018 Genymobile
Copyright (C) 2018-2021 Romain Vimont
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.