„scrcpy”, czyli wygodny sposób na wyświetlanie i kontrolę ekranu Androida na Twoim komputerze

Nie każdy zdaje sobie sprawę, że bez instalacji dodatkowych aplikacji na smartfonie można wyświetlać i kontrolować w wygodny sposób obraz Androida 5.0 (i nowszych) z poziomu komputera z systemami Linux, Windows i macOS.

Jest to możliwe dzięki połączeniu ADB przez USB lub bezprzewodowo przy pomocy Wi-Fi po protokole TCP/IP i aplikacji „scrcpy”.

GitHub: https://github.com/Genymobile/scrcpy

Projekt skupia się na:

  • wydajności (30-60 fps) *
  • jakości (1080x1920px i więcej)
  • niskich opóźnieniach (35~70ms) *
  • szybkim czasie uruchamiania (~1 sek. do wyświetlania pierwszego obrazu) *
  • nie inwazyjności (nic dodatkowo nie trzeba instalować na urządzeniu z Androidem)

* dotyczy trybu USB

Wiem, że część z Was powie, ale przecież Windows 10 ma aplikację „Twój telefon” i można po Bluetooth uzyskać także dostęp do ekranu Androida.

Tak, było to opisywane na Dobrych Programach, lecz ma kilka zasadniczych wad:

  • ograniczony zasięg i jakość połączenia Bluetooth
  • nie działa to na każdym smartfonie z Androidem
  • minimalna wersja Androida 7.0+ - odpada część TVboxów, tabletów i innych zapomnianych urządzeń
  • trzeba mieć majową aktualizację Windows 10 z 2019r. (nie na wszystkich urządzeniach można ją zainstalować)
  • Bluetooth w odpowiedniej wersji sprzętowej na obu urządzeniach
  • płynność działania, kończąc na jakości obrazu i ilości jednocześnie wyświetlanych urządzeń

    Nie brakuje również rozwiązań płatnych, ale skoro można mieć coś, co dobrze działa za darmo i na wielu platformach systemowych to przechodzimy „do tego, co tygryski lubią najbardziej”, czyli konfiguracji :)

    Wszystko będę wykonywać z poziomu dystrybucji Arch Linux, ale pod Windows i macOS oprócz procesu instalacji wygląda to b. podobnie.

    W Windows zamiast adb, wszędzie zamieniamy na adb.exe, pamiętając jednocześnie, aby używając wiersza poleceń (cmd.exe) być w folderze z rozpakowanym scrcpy.

    Instalacja

    Linux:

    • Debian (Sid i Testing), Ubuntu 20.04:

    apt install scrcpy

    (lub w Ubuntu z pakietu snap: https://snapcraft.io/scrcpy)

    • Arch Linux, Manjaro i inne z włączoną obsługą AUR:

      mkdir scrcpy && cd scrcpy
      curl -o PKGBUILD "https://aur.archlinux.org/cgit/aur.git/plain/PKGBUILD?h=scrcpy"
      makepkg -si PKGBUILD


      (lub jednym poleceniem używając wrappera pokroju: yay/pikaur/innego)

      Na niektórych dystrybucjach trzeba jeszcze doinstalować pakiet android-tools

      Windows:

      Standardowo pobrać i rozpakować do jakiegoś folderu:
      https://github.com/Genymobile/scrcpy/releases/download/v1.13/scrcpy-wi...
      (SHA-256: 806aafc00d4db01513193addaa24f47858893ba5efe75770bfef6ae1ea987d27)

      MacOS:

      W przypadku tego systemu trzeba najpierw zainstalować Homebrew:

      /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
      chmod +x install.sh
      ./install.sh
      brew install scrcpy


      Jeżeli nie mamy ADB to jeszcze jeden pakiecik doinstalowujemy:

      brew cask install android-platform-tools

      Przygotowanie do połączenia (Android 5.0 i nowszy)

      • Czysty Android

      Ustawienia > System > Zaawansowane > O telefonie > Odszukujemy wersję BUILD i wybieramy ją kilkukrotnie, aż do osiągnięcia napisu „Jesteś teraz programistą” (lub podobnego)

      • Nakładka MIUI 11 (smartfony Xiaomi)

      Ustawienia > O telefonie > Pełna specyfikacja > Odszukujemy wersję MIUI i wybieramy ją kilkukrotnie, aż do osiągnięcia napisu „Jesteś teraz programistą”
      W innych smartfonach będzie analogicznie. Odszukujemy „Informacje o smartfonie” i postępujemy podobnie.
      Otwieramy ponownie „Ustawienia” i wyszukujemy „Opcje programisty”.

      • Czysty Android

      System > Opcje programisty

      • Nakładka MIUI 11 (smartfony Xiaomi)

      Ustawienia > Dodatkowe ustawienia > Opcje programisty
      Inne smartfony podobnie – wyszukujemy „Opcje programisty”/”Opcje programistyczne”

      Aktywujemy przełącznikiem na górze wszystko, a następnie trzeba odszukać „Debugowanie USB” i też aktywować (w MIUI obie opcje „Debugowanie USB” trzeba aktywować). W nowszym Androidzie będzie pytanie o autoryzacje komputera – potwierdzamy zaznaczając opcję „Pozwól zawsze”.

      Dla pewności odłączamy USB i podłączamy ponownie.

      UWAGA!
      W niektórych smartfonach musi być aktywne połączenie z internetem, aby aktywować tryb debugowania.
      Na niektórych urządzeniach trzeba dodatkowo aktywować w opcjach debugowania symulację urządzeń wejścia (klawiatura, mysz) przez USB.

      Łączenie z ADB i „scrcpy” poprzez kabel USB

      Wpisujemy (użytkownicy Windows najpierw muszą otworzyć cmd.exe w folderze z rozpakowanym scrcpy, potem dopiero adb.exe devices):

      adb devices

      Jeżeli wszystko jest dobrze powinno pojawić się nasze urządzenie:
      List of devices attached
      ID_urządzenia device

      W przypadku komunikatu „no permissions” lub podobnego, spróbujmy jeszcze raz odłączyć i podłączyć kabel USB smartfona i sprawdzić, czy na pewno komputer jest na liście autoryzowanych urządzeń.

      Pozostaje uruchomić „scrcpy”. W Linux i MacOS po prostu wpisujemy w konsoli scrcpy, a w Windows dwuklik na scrcpy.exe.
      Po dosłownie chwili powinno ukazać się okienko z naszym „robocikiem”.

      W ten sposób możemy podłączyć, więcej niż jeden smartfon z Androidem, ograniczeni tylko ilością portów USB ;) Jednak przy większej ilości urządzeń trzeba już podać identyfikator adb danego smartfona jako parametr dla scrcpy.
      Jeżeli ktoś ma ekran blokady smartfona na hasło może zdarzyć się, że ENTER zostanie wpisany jako znak (zabezpieczenie?), więc trzeba potwierdzić kliknięciem, a nie klawiszem ENTER przy wpisywaniu hasła.

      Łączenie bezprzewodowe poprzez sieć Wi-Fi (adb tcpip)

      UWAGA!

      Tą metodą ze względów bezpieczeństwa podłączamy się tylko w zaufanej sieci domowej będącej za NATem.
      W popularnej wyszukiwarce IoT można znaleźć bardzo wiele urządzeń wystawiających usługę ADB na zewnątrz. Na dzień dzisiejszy na porcie 5555 znalazłem aż 21155 urządzeń (głównie chińskie TVboxy, ale też inne urządzenia).
      Do części z nich bez problemu można się w sposób nienadzorowany podłączyć, wyświetlić zawartość ekranu, odczytywać wrażliwe dane, instalować malware itp. rzeczy.

      W tym trybie nie działają nawet zabezpieczenia przed przechwytywaniem ekranu np. w aplikacjach bankowych, menadżerach haseł.

      Przestrzegam więc, jeżeli mamy smartfon przestawiony w tryb ADB TCPIP i nasze urządzenie dostępne jest z naszego zewnętrznego IP, oznacza to, że nie jesteśmy za NATem i nie powinniśmy w ten sposób podłączać naszego urządzenia.

      Wiem, że port można zablokować na routerze dla WAN, ale jeżeli w naszej sieci jakieś urządzenie jest zainfekowane np. nowym trojanem, nic nie przeszkodzi mu przekierować port na inny niezablokowany. Należy, więc używać tego trybu na czas, gdy potrzebujemy, pod nadzorem i z rozwagą.

      Parowanie urządzeń daje tylko pozorne bezpieczeństwo, ponieważ istnieje framework do włamywania się na wystawione "na świat" ADB.

      Aby przestawić tryb ADB USB na ADB TCPIP. W tym celu podłączamy naszego smartfona do USB, włączamy Wi-Fi (smartfon i komputer musi być w tej samej sieci, najmniejsze opóźnienia są przy wykorzystaniu Wi-Fi na paśmie 5GHz) i wykonujemy:

      adb devices
      (w celu sprawdzenia, czy urządzenie jest prawidłowo wykrywane)

      adb tcpip 5555

      Jeżeli wszystko poszło zgodnie z planem ujrzymy komunikat:
      restarting in TCP mode port: 5555

      Oczywiście możemy wybrać inny, nieużywany port, ale musi on być nieblokowany przez naszą zaporę sieciową (firewall) i router.
      Nasz smartfon jest teraz w trybie ADB TCP/IP. Musimy zobaczyć jakie ma IP w naszej sieci.

      Najprościej jest wpisać:


      adb shell ip -f inet addr show wlan0 | grep inet

      Powinna pojawić się informacja podobna do tej:
      inet IP_SMARTFONA/24 brd 192.168.0.255 scope global wlan0

      Nasze IP smartfona jest podane po napisie „inet”.
      Alternatywnie IP możemy sprawdzić w ustawieniach sieci Wi-Fi w smartfonie lub bezpośrednio w panelu / aplikacji do obsługi routera.

      Dalej łączymy się zdalnie z ADB, w tym momencie musimy odłączyć smartfon od portu USB:

      adb connect IP_SMARTFONA:5555
      (port w tym wypadku jest 5555, ale ustawiamy na taki sam jak przy kroku zmiany ADB na TCPIP)

      Powinniśmy zobaczyć:
      connected to IP_SMARTFONA:5555

      Pozostaje teraz tylko uruchomić „scrcpy”:

      scrcpy
      (Windows – dwuklik na scrcpy.exe)

      Obsługa „scrcpy”

      Za podstawowe „dotknięcie” służy nam lewy przycisk myszy. Prawym realizujemy funkcję „cofnij”, a gdy wyświetlacz się wyłączy prawy przycisk myszy aktywuje ekran zarówno w „scrcpy” jak i smartfonie. Możemy go wygasić w samym smartfonie, aby oszczędzać baterię używając skrótu „Ctrl+O”. Aby tak szybko się nie wyłączał musimy w ustawieniach smartfona wydłużyć czas wygaszania ekranu.

      Za kopiowanie i wklejanie tekstu w obie strony (pc<>smartfon) odpowiadają standardowo Ctrl+C i Ctrl+V (Linux/Windows). Dodatkowo można kopiować pliki z komputera poprzez przeciąganie i analogicznie instalować aplikacje z paczek APK. (pod warunkiem, że włączyliśmy instalowanie aplikacji przez USB w opcjach debugowania)
      Brak jest informacji zwrotnej o tym w samym oknie „scrcpy”, ale w terminalu i wierszu poleceń widać postęp. (domyślna ścieżka kopiowania to /sdcard/)

      Wracając do nawigacji w scrcpy to Ctrl+S otwiera nam wybór uruchomionych aplikacji. Górny pasek powiadomień wysuwamy tradycyjnie przeciągnięciem lub skrótem Ctrl+N. Możemy także obrócić obraz na poziomy skrótem Ctrl+R, ale tylko w aplikacjach/menu, które obsługują widok poziomy.

      Mi osobiście bardzo podoba się parametr powodujący brak belki tytułowej okna i obramowań. Takie okno można przemieszczać z przytrzymanym klawiszem Alt, a wygląda to tak:

      Można też dodać parametr „-t” przy uruchamianiu powodując widoczność dotknięć na ekranie smartfona (nie w aplikacji):

      Nie bez znaczenia jest też funkcja bezpośredniego nagrywania ekranu smartfona lub smartfonów od razu do pliku.
      Z rzeczy, których zabrakło to solidna obsługa audio po USB i Wi-Fi. Niby można uzyskać dźwięk poprzez „usbaudio” (tylko w systemie Linux), ale działa to zamiennie z obrazem. Pełne wsparcie API audio playback ma dopiero Android 10 (Q). Aplikacja jest rozwijana, nie wykluczone, że zostanie dodana ta funkcjonalność w przyszłych wydaniach scrcpy.

      Parametry do „scrcpy”

      • Redukcja rozmiaru (limit rozmiaru z zachowaniem proporcji ekranu urządzenia) w celu poprawienia np. wydajności

      scrcpy --max-size 1024
      scrcpy -m 1024 # wersja skrócona

      • Zmiana bit-rate (domyślny bit-rate jest ustawiony na 8Mbps)

      scrcpy --bit-rate 2M
      scrcpy -b 2M # wersja skrócona

      • Limit FPS nagrywania (tylko Android 10 i nowszy, ale może działać na wcześniejszych)

      scrcpy --max-fps 15

      • Przycinanie do danego fragmentu ekranu (można używać z --max-size)

      scrcpy --crop 1224:1440:0:0 # 1224x1440 z przesunięciem (0,0)

      • Zablokowanie orientacji ekranu (wpływa na orientację nagrywania)

      scrcpy --lock-video-orientation 0 # naturalna orientacja
      scrcpy --lock-video-orientation 1 # 90° w lewo
      scrcpy --lock-video-orientation 2 # 180°
      scrcpy --lock-video-orientation 3 # 90° w prawo

      • Nagrywanie (podczas mirroringu)

      scrcpy --record file.mp4
      scrcpy -r file.mkv # skrócona wersja

      • Nagrywanie (z wyłączonym mirroringiem)

      scrcpy --no-display --record file.mp4
      scrcpy -Nr file.mkv # skrócona wersja

      # przerywanie nagrywania Ctrl+C (w Windows nie działa, trzeba odłączyć urządzenie)

      • Wiele urządzeń (można ustanowić wiele instancji scrcpy dla wielu urządzeń)

      Uzyskujemy listę urządzeń poprzez adb devices

      scrcpy --serial ID_URZĄDZENIA
      scrcpy -s ID_URZĄDZENIA # skrócona wersja

      W trybie (Wi-Fi) ADB TCPIP:
      scrcpy --serial ADRES_IP_URZĄDZENIA:PORT
      scrcpy -s ADRES_IP_URZĄDZENIA:PORT # skrócona wersja

      Konfiguracja okna

      • Własny tytuł okna

      scrcpy --window-title 'Mój hiper uber smartfon'

      • Początkowa pozycja okna i rozmiar

      scrcpy --window-x 100 --window-y 100 --window-width 800 --window-height 600

      • Okno bez obramowań

      scrcpy --window-borderless

      • Okno zawsze na wierzchu

      scrcpy --always-on-top

      • Tryb pełnoekranowy

      scrcpy --fullscreen
      scrcpy -f # skrócona wersja

      (można także przełączać w trakcie przy pomocy Ctrl+F)

      • Obrót okna

      scrcpy --rotation 1 # 0: brak obrotu, 1: 90 stopni w lewo, 2: 180 stopni, 3: 90 stopni w prawo

      Informacja: scrcpy obsługuje 3 typy obrotu:
      • Ctrl+R przełącza pomiędzy trybem poziomym i pionowym (aktualnie wyświetlana aplikacja może odrzucić polecenie obrotu, jeżeli go nie obsługuje).
      • --lock-video-orientation zmienia orientację mirroringu (orientację obrazu wideo przesyłanego z urządzenia na komputer). Wpływa to na nagrywanie.
      • --rotation (lub Ctrl+‹/Ctrl+›) obraca tylko zawartość okna. Wpływa tylko na wyświetlanie, nie na nagrywanie.

      Inne opcje mirroringu

      • Tylko-odczyt - wyłącza wszelkie próby klikania, wpisywania z klawiatury komputera i wysyłania plików

      scrcpy --no-control
      scrcpy -n # skrócona wersja

      • Wyłączanie ekranu urządzenia na starcie

      scrcpy –turn-screen-off # lub skrótem Ctrl+O podczas przesyłania obrazu
      scrcpy -S # skrócona wersja

      • Renderowanie pominiętych ramek (kosztem czasu reakcji)

      scrcpy --render-expired-frames

      • Pokazywanie fizycznych dotknięć palcem na ekranie

      scrcpy --show-touches
      scrcpy -t # skrócona wersja

      • Zmiana domyślnego miejsca wysyłania plików po upuszczeniu ich na okno scrcpy

      scrcpy --push-target /sdcard/Pobrane/jakis_katalog/

      Myślę, że mój wpis wielu mniej technicznym osobom ułatwi obsługę tego świetnego narzędzia.

      Zapraszam do komentowania ;-)