いろんなAdvent Carenderに登録しておいたのに、時間通りに出せていませんでしたがようやく。。。
ということで、この記事は
です。
AndroidTVに関するネタにしようと決めてはいたので、AndroidTVアプリ開発でのちょっとしたつらみと、それに対して最近見つけた解決策を書いてみようと思う。
ちなみに本記事は今年のベストバイ候補、MacBook Air(M1)くんで執筆しました。最高。
ここがつらいよAndroidTV
AndroidTV向けアプリの開発をやっている方なら誰しもが悩んだことがあるんじゃないかと思う(思いたい?)が、実機でデバッグ作業をしようと思うとPCとは別にディスプレイが必要で、これが結構大変。
有り得そうな話として、不運にも外出中に「障害が起きたのでみて欲しい」と言われてしまった場合は絶望的。丸腰だと実機での確認すら十分にできないので、自分は万が一にモバイルディスプレイを持って歩いていることもありました。(もとから常に大荷物で行動するタイプであるということは気にしてはいけません。)
例えばこういうやつ
とはいえ、PCだけでも大荷物になるのに、実機+外部ディスプレイを持って歩くのは現実的ではないです。やってたけどね。
最初に思いついた作戦:HDMIキャプチャで取り込む
ディスプレイ持って歩くのはやはり大変。外部ディスプレイ不要な方法がないものかと考えました。
最初に思いついたのが、ゲーマーなどがプレイ動画を取り込むために使うようなHDMIキャプチャ。
HDMIキャプチャにも種類がありますが、UVC(USB Video Class)という規格に対応してる製品がおすすめ。
これにスティック型のAndroidTVデバイスを刺し、キャプチャのプレビュー画面を見て操作する、という作戦を思いついたわけです。
当時の自分は、我ながら完璧だ、完全勝利と確信し機材を買い揃えました。
以下がその機材たち。GV-HUVCとFireTVがダイレクト接続されていて、GV-HUVCの右側の端子とPCを接続する想定だったわけ。
フラグ立てまくったので、結果はもうお分かりだと思いますが 見事に完敗 。理由はただ1つで、HDCPによって画面が表示できなかった、という点が影響してしまった模様。
悩めるAndroidTVerの救世主scrcpy
上記以来、半ば諦めた感じでモバイルディスプレイを使っていました。
今年の9月か10月ぐらいのある日、社のSlackで「scrcpyというツール使うとPCにスマホ画面を表示できるらしい」という情報が流れていたのを発見。
scrcpyはGenymobileが公開しているAndroidデバイス制御ツールで、ごく簡単な手順でPCからAndroid端末の画面表示をミラーリングしたり、PC側から操作したりすることができる。
詳細は以下のGitHubリポジトリを参照。
MacユーザでHomebrewが使える環境であれば、 brew install scrcpy
を実行すれば完了。
コーヒーを淹れる余裕もないぐらい簡単です。
インストールできたら、表示したいAndroidデバイスがadb接続されている状態で scrcpy
を実行すると、PC側にAndroidデバイスの画面が表示されます。
Androidスマートフォンで動くなら、もしかしてAndroidTVでも動くのでは?と思い、普段使っているFireTVを接続して実行してみたところ、あっさり表示されるではないか。
実際に動作させている様子はこのような感じ。
夢にまでみたこの環境。scrcpy
のおかげでついにこれを実現することに成功したわけです。
ほんとにPCと実機、そしてそれらを繋ぐためのケーブルの3点セットだけで良いのです。それぞれを繋ぐだけで、PCがディスプレイに早変わり。必要最小限の荷物だけで、どこでも動作確認できるようになりました。これは肩に本当に優しい。
scrcpyをより使いこなすためのポイント
そのままでも便利ツールであることは間違いないのだが、業務で使うとなると使い勝手を求めたくなってしまう。
scrcpy --help
としてもらうだけでも、本当にたくさんのオプションが提供されていることがわかると思う。ここには全部は載せないので、ぜひ一度どんなことができるのかご自身の目で確かめて欲しいと思う。
その中でも、特に自分が普段使う際に気を遣う点や、指定しているオプションについて紹介しようと思う。
1. デバイスは有線で繋ぐ
外部ディスプレイを使わないという前提があるので事実上必須ではあるのだが、実機はUSB接続で。
理由はいくつかある。
- 大体のAndroidTVデバイスがUSBによる給電が必須。バッテリー持ってる端末はあまり見たことがない。
- 画面が見えないので、払い出されているIPアドレスがわからない。無闇に
adb connnect {{ip addr}}:5555
とかしたくないし。 - 画面表示の安定感(操作に対するレスポンス、フレームレート、etc)が増す。後述のオプションと組み合わせるとより安定する。
どうしても有線がつらい、ということであれば、最初だけ有線でつないでIPアドレスを確認してから切断、別ルートで電源供給しつつデバイスがブートし終わったと思ったらすかさず scrcpy
を実行すれば良いと思う。
2. -m
オプションで最大解像度を制限しよう
デバイスを有線で接続した場合でも、レスポンスが悪いと感じることがある。
さまざまな理由や原因が関連しているとは思うが、主目的はデバッグなので、ある程度ちゃんと表示されていれば良いはずだ。
そんなとき役に立つのが -m
オプションである。
-m, --max-size value
Limit both the width and height of the video to value. The
other dimension is computed so that the device aspect-ratio
is preserved.
Default is 0 (unlimited).
その名の通り、最大解像度を制限できるオプションで、アスペクト比を維持した状態で制限をかけてくれる。
例えば、 -m 1280
とすると、AndroidTVは基本16:9表示なので横幅が1280に制限され、アスペクト比から縦幅が720となって表示される。
このオプションをつける目的は2つ。
- PCでの画面占有領域を必要最小限にする
- 解像度を下げることで、表示の安定性向上を狙う
有線で繋ぐのと併用することで、だいぶ安定してきます。
3. Max FPSも制限して安定性向上を狙え
これまた実行時引数で指定するオプションに、 --max-fps
というオプションが存在している。名前の通りで、表示画面のFPSを制限することができるものだ。
--max-fps value
Limit the frame rate of screen capture (officially supported
since Android 10, but may work on earlier versions).
個人的には30fpsぐらいで十分なので、一応指定している。設定するモチベーションは、表示の安定化を狙っているのは言うまでもないでしょう。
4. スクリーンレコードもscrcpyでやってしまえ
PRに添付するために、動作の様子をスクリーンレコードすることってよくありませんか。今までAndroid Studioからぽちぽちして収録してたんですが、ちょっと面倒でした。
scrcpyには -r {{ファイル名}}
でスクリーンレコードができちゃいます。便利。
いつもDownloadsフォルダにスクリーンレコードの結果を保存して、シュッとPRに貼り付ける、という流れで作業してます。GUIに触れずにCLIからぽんぽん収録作業できるので、ストレスフリー。
まとめ
scrcpy
is GOD
これが1番速いと思います。
Appendix: 酒に関する話
飲酒プログラミングというアドカレの記事でもあるので、少しは酒の話も。
先日クラフトビールが飲めるお店に行ったのですが、そこではノンアルコール飲料がよくあるビールテイスト(ドライゼロみたいなやつ)以外に、輸入品?のノンアルコールビールが置いてありました。
そのうちの一つが、MIKKELLER LIMBO SERIES YUZUです。
ノンアルコールという名称で提供されていたので、ドライバーも安心して楽しめる、と思ったのですが…ラベルを見てびっくり。
いやがっつり発泡酒って書いてあるやん!
厚生労働省のHPに記載されている、日本での ノンアルコール飲料
の定義では、
酒税法の第2条で、酒類は「アルコール分1度以上の飲料」と定義されています。したがって、ノンアルコール飲料とは、含有アルコール量が1%未満の飲料です。この解釈にしたがうと、普通の清涼飲料水はすべて含まれることになりますが、ノンアルコール飲料というと、通常は外観、味、香りなどが酒類に似ているものを指します。
ということのようです。
cf. https://www.e-healthnet.mhlw.go.jp/information/dictionary/alcohol/ya-060.html
このLIMBO SERIES YUZUも缶に0.3%という記載があるので、くくりとしてはノンアルコールで間違ってはない?んですかね。
ただ飲みすぎたら普通に呼気検査引っかかりそうじゃない?というか1本でもだいぶ不安になるレベル。
誰かこの辺の話に詳しい人いたら教えてください。
ということで、これから開けて飲んでみようと思います。ではまた。