PCでAndroid端末を操作したい(wifi, non root)

2019/03/24追記 最近のプチフリ問題を追記
2019/06/17追記 v1.9更新に伴いバッチ記述を修正、古いのはまとめてセクションも整理、導入を少し詳細に
2019/08/06追記 v1.10について更新
2019/12/10追記 v1.12について更新（すぐ修正が来たのでv1.12.1に更新を推奨）
2021/01/02追記 v1.17更新が来たのでno console記述を追記
2021/06/09追記 Android11の機種が繋がりにくかったので対策を追記
2021/09/15追記 1.19アップデートに伴いバッファ指定パラメータを例に追加
2021/11/07追記 バックアップバッチ追加
2021/11/15追記 キーボードの接続に対応したみたいなのでパラメータ追加
2023/04/18追記 おすすめクレードル情報更新

# scrcpyというのでリモート操作できる
[scrcpy](https://github.com/Genymobile/scrcpy/)。DLはreleasesってなってるタブから[scrcpy-releases](https://github.com/Genymobile/scrcpy/releases)。
Androidアプリ開発で昔お世話になったGenymotionが関係しているのかな。出元は確かな気がする多分。
Windows, Mac, Linuxなどなど対応してるっぽい。
以下使ってみた感想と、使い方。

## 利点
- PCにインストール不要でポータブルに使いまわせる。apkインストールも不要。
- [ワイヤレス接続できる](https://github.com/Genymobile/scrcpy#wireless)。
- エミュレーターと違って起動終了が楽ちん。
- Windows側のリソースをエミュレータほど使わない。
- ゲームとかもスルスル動いている模様、[録画もできる](https://github.com/Genymobile/scrcpy#record-screen)。
- 実在端末そのもののリモート操作なのでアカウントやデータが複数端末に散らばらない。
- 起動はバッチでワンクリック。即座に接続、接続終了できる。
- 一度Android端末にadb tcpip xxxxしてやれば、複数PCから接続できる。繋ぎ変えには一回一回切断作業が必要。
- 複数Android端末を同時に起動できない？
  - 複数同時に起動するには別フォルダにadb.exeとscrcpy.exeのセットを用意して使用すれば大丈夫？確認が必要。
    - [こちら](#複数端末を同時に操作する参考バッチ)に追記
- マウスキーボード操作が可能、クリップボード文字列も共有される。(v1.9で正式に相互共有対応)
- 画面を消灯したまま操作可能！(v1.9)
- WindowsタッチパネルPCで長押しに対応してた！(v1.10)

## 問題点
- Android5以上の端末が必要。[最低動作環境](https://github.com/Genymobile/scrcpy#get-the-app)。
- Android端末の再起動のたびにUSBで直接接続してadb tcpip xxxxの操作が必要。
  - ただAndroidは基本起動しっぱなし運用だろうし大きな問題ではないのでは。
  - root化済み端末だと自動で設定できる → [再起動したあと自動的にadb tcpipを有効化する (root化必要)](https://qiita.com/Nanashia/items/f4a47f863889f1ca9e9c)
- 音が出ないので別途Android端末から音を引っ張ってくるものが必要(bluetoothヘッドホンとか)。
  - 公式で[ページ下の方](https://github.com/Genymobile/scrcpy#forward-audio)に以下記述あり
  - Linuxで、USB接続が前提だが[一応実装はあるみたい](https://github.com/Genymobile/scrcpy/issues/14#issuecomment-375103051)
  - sndcpyというものを使うと音声も付く？未検証 https://github.com/rom1v/sndcpy
- マウスで操作できるが[ショートカットは覚える必要](https://github.com/Genymobile/scrcpy#shortcuts)がある。
- 片側が有線LANでないと動作遅延が酷い。PC(有線LAN)←→Android(無線LAN)だと快適。PC(無線LAN)←→Android(無線LAN)だと100~500msくらい遅延する気がする。
  - かと思いきや、端末パワー依存っぽい。左記構成でも、貧弱スマホだと遅い。
  - Zenpad3 8.0(2016/9発売)は片側無線接続でも快適だが、同じ接続方式でもXperia Z3 Compact(2014/11発売)は動作がぬるい。
- Android側に有線LANアダプタが欲しくなるが、アダプタの対応端末が少ない。

# 使い方
**! [Android端末側で「USBデバッグを許可」の設定が必要です](https://qiita.com/knakamigawa/items/5b8bd2793920b517bf25)**
一旦Android端末をPCにUSBで繋いでadb tcpip xxxxしてしまえば違うPCからもadb connect xxx.xxx.xx.xx:xxxxxで接続が可能です。

DLしたscrcpy一式をお好きなフォルダに設置して、初回のADB登録操作をまず行います。[バッチ作ってもいいし](#adb登録用バッチ)、コマンドプロンプトで直でもOK。
USBケーブルでAndroid端末を接続して、WindowsからAndroid端末が認識されてから行ってください。
登録が無事終わったら、USBケーブルを外してOK。この操作は、Android端末を再起動する度に必要になります。
```"C:\Users\xxx\OneDrive\sync\scrcpy"```のところを書き換えてください。

```wsh:@@@adb_touroku.bat
cd /d "C:\Users\xxx\OneDrive\sync\scrcpy"
adb tcpip 5555
```

詳しくは[ドキュメント](https://github.com/Genymobile/scrcpy#run)見てください。
OneDrive等、共有フォルダに一式丸ごと共有して使いまわすと便利です。
以下、ADB登録が終わったあとにリモート接続するバッチ。

# バッチ記述例
ポートは何処でもよさげです。公式例では5555。
Android側のIPアドレス固定については、やったほうがいいですが、必須ではないので必要なら[検索してください](https://www.buffalo.jp/support/faq/detail/15994.html)。
使ってるAndroid端末のIPアドレスの調べ方は[このへん](http://qa.elecom.co.jp/faq_detail.html?id=6050)で。


2019/06/17 以下のセクションのバッチをすべて盛り込んだ最新のバッチをここに記載する。
~~[#画面を消灯したまま操作できるようになった！(v1.9)](#画面を消灯したまま操作できるようになったv19参考バッチ)~~ 問題出たので外しました
[#複数端末を同時に操作する](#複数端末を同時に操作する参考バッチ)
[#動作がぬるいのをオプションで改善してみる](#動作がぬるいのをオプションで改善してみる参考バッチ)
DOS窓が邪魔なので[バッチファイルを最小化で起動](http://piyopiyocs.blog115.fc2.com/blog-entry-731.html)の情報を参考に組み込んだ。

~~v1.12では--bit-rateのオプションを付けると起動しない模様なので一旦消しました。デフォルト8Mで動くはず。~~
--bit-rate は1.5Mという指定をしたかったけど小数点解釈してくれないようなので1500Kという表現で代用。

```wsh:@@xperia.bat
@echo off
if not "%~0"=="%~dp0.\%~nx0" (
     start /min cmd /c,"%~dp0.\%~nx0" %*
     exit
)
::↑はコマンドプロンプト最小化起動記述
cd /d "C:\Users\xxx\OneDrive\sync\scrcpy"
::↑はscrcpyの設置してあるフォルダを指定
adb connect 192.168.1.5:5555
::↓この行はコメントアウト行、参考オプション記述例 window-x 1400はFullHDで右端に寄せて起動させて丁度いい数値
::scrcpy -s 192.168.1.5 -p 5555 --bit-rate 2M --max-size 1440 --display-buffer=100 --turn-screen-off --stay-awake --hid-keyboard --window-x 1400
scrcpy -s 192.168.1.5 -p 5555 --bit-rate 1500K --max-size 1024 --display-buffer=75
adb disconnect 192.168.1.5:5555
if errorlevel 1 pause
```

## 以下は作っておくと便利なバッチ。

### ADB登録用バッチ。
Android端末を再起動したときなどに、Android端末をUSB接続してからバッチ一発叩くだけで再登録完了。

```wsh:@@@adb_touroku.bat
cd /d "C:\Users\xxx\OneDrive\sync\scrcpy"
adb tcpip 5555
```

### ADBキルバッチ。
なんらかのタイミングで、scrcpyで接続できなくなったときにWindowsやAndroid端末の再起動を行う前に試すと吉。

```wsh:@@@adb_kill.bat
cd /d "C:\Users\xxx\OneDrive\sync\scrcpy"
adb kill-server
```

### 端末フルバックアップ用バッチ。
バッチ一発叩くだけでバックアップ。万が一のためにバックアップ大事。
バッチ叩いたあとにAndroid本体の画面にでてくるバックアップ開始ボタンを押すこと。
復元などオプションはこちらの記事など参照。
https://qiita.com/niusounds/items/7b4959c3b1c1272d6c9a

```wsh:@@@adb_backup.bat
@echo off
cd /d "C:\Users\xxx\OneDrive\sync\scrcpy"
adb connect 192.168.1.5:5555
adb backup -apk -shared -all -f C:\@home\20210101_pixel6.ab
adb disconnect 192.168.1.5:5555
if errorlevel 1 pause

```

# v1.20アップデート
https://github.com/Genymobile/scrcpy/releases

``` --hid-keyboard ```
一瞬メジャーアップデートかと思ったがバージョン番号は一つ上がっただけだった。
目玉はアイコンが変わったことと、USB接続時にハードウェアキーボードが認識されるようになったことか。wifi接続時はあまり関係ない模様。


# v1.19アップデートでバッファが追加された模様
https://github.com/Genymobile/scrcpy/releases

``` --display-buffer=75 ```
グラフを見ると、ブレブレの線がバッファを入れると安定した直線になっている感じ。
なのでパラメータを例に追加。試してみたが、あんまり数値を高くすると遅延するので75ぐらいがちょうどいいかもしれない。
Wifi-Wifi間通信でも、スクロール操作してダダーっと勝手に一番下に移動、ということが減り、スムーズに操作できるようになったかも？

#　noconsoleバージョンで書いた起動スクリプト(v1.17)
```wsh:@@xperia.vbs
CreateObject("Wscript.Shell").Run "cmd /c scrcpy -s 192.168.1.5 -p 5955 --bit-rate 3M --max-size 1344 --turn-screen-off", 0, true
```
拡張子をvbsにする。一行で行けた。過去のは無駄な記述があるな・・

# --bit-rateのオプションを付けると起動しない模様(v1.12)
2019/12にリリースされたv1.12を試したところ、`-bit-rate 2M`の記述があると起動しなかった。
軽く値を変えて試してみたが、どうもout of rangeと出て起動しない。
~~とりあえず上のほうの記述例からbitradeの記述を消した。~~

バグだったようですぐ更新がリリースされた。
v1.12.1をダウンロードしたら直ったので記述を戻した。


# 画面消したままでも安定した！あとWindowsのタッチパネルに対応したっぽい(v1.10)
2019/08にリリースされたv1.10を試してみてる途中で気付いたのだけどタッチパネル長押しに対応したっぽいです。
普通にタブレットPCから指で長押しが反応するようになった模様！右クリック反応が起きない！これで捗るね。。
あと画面暗転起動のオプションがv1.9だと不安定だったけどv1.10だと安定してるっぽいです。
一晩置いておいても接続に失敗しない！

追記
暗転起動オプション、リモート接続は問題ないんだけど、、今度は本体が暗転してどうやっても復帰しなくなる気がする。
scrcpyで接続すると動くんだけど、本体直で弄るのが出来なくなるっぽい。
このオプションはもうしばらく様子見再開。


# 画面を消灯したまま操作できるようになった！(v1.9)
https://github.com/Genymobile/scrcpy/releases/tag/v1.9
2019/6にリリースされたv1.9だと画面を消灯したまま操作できるようになった模様。
オプションを追記したバッチは[こっち](#バッチ記述例)。プチフリ問題も再現しなくなった（SDLを公式にダウングレードしたらしい）ようなのでそのまま全上書きアップデートで大丈夫っぽい。
```scrcpy --turn-screen-off```

~~githubのスレッド見てると音声の転送系にも言及してるようなので、v2.0辺りでついに音声系も転送できるようになったりするかしら？~~
Linuxで、USB接続が前提だが[一応実装してみたレベル](https://github.com/Genymobile/scrcpy/issues/14#issuecomment-375103051)の段階らしい


追記
しばらく放置していた端末に接続しようとすると接続失敗するような気がする。
数時間～一晩？放置していると接続失敗になる気がする。端末を直接触って画面ロック解除なりしてやるとまたリモート接続できるようになる模様。
利用環境によるが、サーバー用途で使うならこのオプションは外しておいた方がいいと思う。


# 複数端末を同時に操作する（※参考バッチ）
adb.exeとscrcpy.exeのセットは1つで大丈夫っぽい。
IPアドレスだけ分けて記述してやればOK。
DOS窓は複数出す必要あるのでバッチファイルは分けます。
何か出てるけど動いてるのでとりあえず(ﾟεﾟ)ｷﾆｼﾅｲ!!

`adb tcpip 5555`での初回登録の記述を消し忘れると同時起動できないので注意。

[複数記述例あると混乱するので、すべて盛り込んだバッチはこちらのセクションに移動](#バッチ記述例)

```wsh:@@xperia.bat
@echo off
cd /d "C:\Users\xxx\OneDrive\sync\scrcpy"
::
adb connect 192.168.1.5:5555
scrcpy -s 192.168.1.5 -p 5555
adb disconnect 192.168.1.5:5555
```

```wsh:@@zenfone.bat
@echo off
cd /d "C:\Users\xxx\OneDrive\sync\scrcpy"
::
adb connect 192.168.1.6:5555
scrcpy -s 192.168.1.6 -p 5555
adb disconnect 192.168.1.6:5555
```

# 動作がぬるいのをオプションで改善してみる（※参考バッチ）
scrcpyのドキュメントを見ると、デフォルトだと8M/bで通信しているらしい。
ここを2M程度にすると反応がよくなった。
さらに画面解像度を1024辺りに制限すると更によくなった気がする。
ただし画面は粗い。
Surfaceと上述のぬるいxperiaで使ってみたが、無線LAN←→無線LANでも動作遅延が許容できるレベルに。

[複数記述例あると混乱するので、すべて盛り込んだバッチはこちらのセクションに移動](#バッチ記述例)

```wsh:@@xperia.bat
cd /d "C:\Users\xxx\OneDrive\sync\scrcpy"
::
adb connect 192.168.1.5:5555
scrcpy -s 192.168.1.5 -p 5555 --bit-rate 2M --max-size 1024
::pause
adb disconnect 192.168.1.5:5555
```

# Android11のpixel4aが繋がりにくい？
いつ頃だったか、Android11のアップデートが降ってきてからだと思うが、scrcpyで接続しようとすると「xx.xx.xx.xx is not connected.」などと出て接続できない事象が起きていた。
たまーに繋がるが、たいていは繋がらない。なぜか。
wifiが眠っている？そのあたりにアタリを付けて設定を変更したら、繋がるようになった気がする。
以下画面の個所を設定変更する。自己責任で。

その後android12になった。そしたら一発でつながるようになった気がする。
あと5Ghz帯のwifiよりは2.4Ghz帯のwifiを使うようにしたところ、一発でつながるようになった気がする。
（acやら付いてるものより、gのアクセスポイントを使う）

##ネットワークの設定セクション
![スクリーンショット 2021-06-09 105813.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25349/8daed7e1-428c-ae79-cd11-ae0ac92518ff.png)
![スクリーンショット 2021-06-09 105841.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25349/14407cc3-f5c0-4ce1-1cca-dc1c41480d48.png)
##開発者設定セクション
![スクリーンショット 2021-06-09 113017.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25349/30702969-3242-058c-33c5-bfdfe85d32ef.png)
![スクリーンショット 2021-06-09 113104.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25349/bcd74369-f136-e62a-740b-b4ea29401873.png)

## やはりダメっぽい、有線LAN接続できるドックを試す
[Switch/Switch 有機ELモデル用 TVドック HDMI出力ミニ充電ドック Switch充電スタンド 4K@60Hz HDCP技術を搭載する 三つのUSBポート& 100Mbpsイーサネット Switch OLED/Switch用スイッチ ドック 持ち運び便利 【ホワイト】](https://amzn.to/41f3Fxp)**アプデ**

2023/04/18追記
最近のscrcpyは音の転送にも対応して、有線LANでつないだほうが安定するシーンは増えてると思うのでクレードルをおすすめしたい。
安いものもあるが、ドック的な感じに運用すると便利ですよ。


こういうものを試してみた。
Switch用のものだけど、type-cだし最近の機種ならばいけそう。変換噛まさないとだめな機種はダメだと思う。
繋がらなくなるのは充電クレードルに置きっぱの間だから、その間は有線LANにすれば解決するだろう、、という狙い。
ついでに接続の安定を図れる。
追記
ちゃんとLANもUSBハブも動作したし運用に耐えるものではあった。
ただSwitch用なせいか、スマホカバーを付けていると端子の丈が足りない。
スマホカバーを外して運用する必要があるのでもう少しモノは選ぶべきか。あとだいぶ寝てる角度になるので好みが別れるかと。
検索ワードとしては「Switch ドック LAN」あたりで探して選ぶといいだろう。


# 最近のアップデートからプチフリするようになってきた→解決（※旧情報）
当方の環境だと、2月くらい？1月？のアップデート辺りから、特定の環境でプチフリーズするようになっていた。
3秒ごとくらいにscrcpyの窓が少し固まる。
Ryzen+RadeonのデスクトップPCだとOS切り変えてもだめで、Intel coremのタブレットPCだと快適に使えていた。

## githubのissuesを見るとプチフリについてのスレッドがあった。
https://github.com/Genymobile/scrcpy/issues/425
最近スレッドに進展があったようなので対策を試してみた。
内容はよくわからないがSDL2.dllがscrcpy1.5から変わったから古いのを試してみろと言ってる気がする。
https://www.libsdl.org/download-2.0.php
ここからURLをごにょって、一個古いバージョンに置き換えてDLする。上からWin32bitOS、64bit、Mac用。
https://www.libsdl.org/release/SDL2-2.0.8-win32-x86.zip
https://www.libsdl.org/release/SDL2-2.0.8-win32-x64.zip
https://www.libsdl.org/release/SDL2-2.0.8.dmg

scrcpyを終了してそのままSDL2.dllを置き換え。
scrcpyを再起動してみるとプチフリ解決。デスクトップPCでも快適になった。
環境が原因かはわからないが、とりあえず解決。

# Windowsの次期アップデートでAndroidアプリを使えるようになる？
[こんな](https://japanese.engadget.com/2018/10/03/windows-10-android-pc/)ニュースも見かけてはいたが、いつ出てくるか分からない。
### 続報きました
[続報](https://news.mynavi.jp/article/20190313-788142/)がきたようです。
ただ、scrcpyよりかなり動作条件が厳しいようです。
> Bluetooth LEをサポートするWindows PCと、Android 7.0以上で動作するスマートフォン


# Windows 2in1 PCのタッチパネルで操作がしづらい？
v1.10から普通に長押しできるようになった模様。

一見、Winタッチパネル+Androidタッチパネルなので問題なさげだが致命的な問題がある。
長押しができないのだ。長押しするとWindows側の長押しが優先され、Windowsの右クリックが発動してしまう。
これの回避策を発見したので書いておく。
> 「ダブルタップ&ホールド」するとAndroid窓側で長押し判定される
> 2回目のタップで指を離さないこと

# 利用シーン
Android端末を非root化でVNCできると用途に幅がでますね。

わざわざ端末を充電器から外して・・とやる必要がないのでゲームのデイリー消化にも。
ゲームは録画できるので何かと重宝できそう。音は別途LineInジャックとかで引き回す必要ありそうですが。。

あと、遅延が気になりだすと、Android端末に接続するOTG対応の有線LANアダプタが欲しくなる。
手持ちはAndroidバージョン古かったり有線LAN非対応端末だったり、
Android5以上で有線LAN対応端末で、、と探し出すと新しいものが欲しくなるのが辛い。


2021年現在はandroid端末をサーバー用途で使うのにすっかり慣れてしまった。
pixel3無印がほどよく安くなっていて、root取るのもほどよく簡単になってるのでおすすめ。
ただし、新しめの機種っぽい面倒はある（音量が勝手に下がる聴覚保護的な機能だったり、イヤホン端子なかったり）。
これはusb type cの多機能ハブを噛ませたり、gravity boxで設定したり色々回避方法はあるようなので好きな人なら回避はできるであろう。
なによりgoogle謹製なので安定性がよいし、有線LANで使えるのでレスポンスがいい。
ただまあ課題は色々あったり。
android8までのbluetooth音楽リモコンの挙動に戻す方法ご存じの方いないです？

root化したあとこれを設定したらとても気楽になった。
再起動時に自動でadb tcpipを有効化とか、ものぐさには快適すぎる。
https://qiita.com/Nanashia/items/f4a47f863889f1ca9e9c

# 参考URL
https://github.com/Genymobile/scrcpy
https://blog.c6h12o6.org/post/freebsd-android-scrcpy/
https://www.moongift.jp/2018/04/scrcpy-android%E7%AB%AF%E6%9C%AB%E3%82%92pc%E3%81%8B%E3%82%89%E6%93%8D%E4%BD%9C/

# qiita内で似たようなことを実現している方々の記事リンク
> ASM(Android Screen Monitor)使ってみた
> https://qiita.com/TK223/items/5d260ad976071449240c
>
> 【Vysor】開発中のAndroidアプリを別の人のPC上で操作してもらう
> https://qiita.com/shota_low/items/9b6458b58f55ad944479
>
> Android 端末画面を Windows に表示/操作可能な Android Control の使い方
> https://qiita.com/aoi70/items/404f63161b12be016420
>
> ワイヤレスでWindows/MacをAndroid/iOSデバイスにミラーリングして、操作する方法
> https://qiita.com/salaryman/items/08a74d0dc35238dad0b7
>
> Android の画面を PC に転送する Mobizen が凄い
> https://qiita.com/ytabuchi/items/f00545fa7618460491a0
>
> Windows + Android(iOS)端末でフリーなマルチディスプレイ環境構築
> https://qiita.com/dwarfJP/items/2e1491e8144355e6d7f9