パソコンにつなぎっぱなしのAndroidをボット専用機にする

 ・ 7分

photo by Pat Whelen(https://unsplash.com/@patwhelen?utm_source=templater_proxy&utm_medium=referral) on Unsplash

使っていないAndroidスマホ、引き出しに一台くらいありますよね。私はそのスマホを自宅のMac miniにUSBでつなぎっぱなしにして、ボットがadbで代わりに操作する自動化専用スマホとして使うことにしました。Mac miniでなくても、adbが動くパソコンなら同じようにできます。

人が持ち歩くスマホとボットが使うスマホでは、必要な設定がかなり違います。画面が消えたりロックされたりすると、ボットはそこで止まってしまうからです。この記事では、Galaxy S23をボット向けに設定した手順を順番に整理してみます。

メニュー名はGalaxy(One UI)基準なので、ほかのメーカーのスマホでは少し異なる場合があります。

adb(Android Debug Bridge)は、パソコンからAndroid端末にコマンドを送る公式ツールです。アプリのインストール、画面のタップ、文字入力、ファイル管理までターミナルからできます。

スマホ側の設定:ボットが止まらないように#

画面ロックはいっそ解除しました#

ボットが一番よく止まるのはロック画面です。最初はパターンロックを残したまま、ロック解除を延長(Smart Lock)の「信頼できる場所」を試しました。自宅にいる間はロックが解除された状態を保ってくれる機能です。

ところが、位置情報をオンにしていてもスマホがロックされることが続きました。調べてみると、原因はいくつもありました。

  1. 最初のロック解除 — 再起動直後は、信頼できる場所にいても一度は自分で解除する必要があります。
  2. 4時間ルール — ロック解除の延長中でも、4時間自分でロックを解除しないと再びロックされます。
  3. 再起動 — アップデートなどで再起動すると、1の状態に戻ります。
  4. 位置情報の精度 — 屋内では位置がずれて「自宅ではない」と判定されることがあります。
  5. バッテリーの最適化 — 省電力のせいで位置情報サービスが時間どおりに更新されないことがあります。

毎日持ち歩くスマホなら、4時間ルールは大した問題ではありません。でも誰も触らない自動化スマホにとっては致命的ですよね。このスマホは自宅に置きっぱなしの端末なので、ロック自体をなしに変更しました。

開発者向けオプションで変えた3つの設定#

設定 → 端末情報 → ソフトウェア情報で、ビルド番号を7回タップすると開発者向けオプションが表示されます。ここで3つの設定を変えました。

  1. スリープモードにしない — 充電中は画面が消えません。USBで常時接続しているので、実質いつも点いています。
  2. 画面のタイムアウトを最大に — ディスプレイ設定の画面のタイムアウトも一番長くしました。
  3. アニメーションスケールを0に — ウィンドウアニメスケール、トランジションアニメスケール、Animator再生時間スケールをすべてオフにすると、画面の切り替えが一瞬で終わります。ボットが「画面が切り替わるまで」待つ時間が短くなります。

アニメーションスケールはadbでも変更できます。

# 3つのアニメーションスケールをすべて0に
adb shell settings put global window_animation_scale 0
adb shell settings put global transition_animation_scale 0
adb shell settings put global animator_duration_scale 0

画面とバッテリーを守る#

画面がずっと点いていると、焼き付き(同じ画面が長く表示されて残像が残る現象)が心配ですよね。なので明るさは最低まで下げました。

バッテリーはバッテリー保護機能で、79%で充電が止まるようにしました。一日中充電器につながっているスマホは、100%のまま長く置くとバッテリーの劣化が早まります。最後にサイレントモードをオンにして、通知が画面を覆わないようにしました。

パソコン側の設定:adbを使いやすく#

私の環境はmacOSとzshなので、以下の例もそれを前提にしています。ほかのOSを使っている場合は、パスとインストール方法だけ環境に合わせて変えればOKです。

adbのパスとzshの関数#

macOSでAndroid StudioからSDKをインストールしていれば、adbは次のパスにあります。

~/Library/Android/sdk/platform-tools/adb

最初はよく使うコマンドを文字列の変数に入れて使っていましたが、zshでは期待どおりに動きませんでした。zshはbashと違って、クォートなしの変数もスペースで分割しないからです。そのためADB="adb -s シリアル"のように入れてから$ADB shell ...で呼ぶと、全体がひとつのコマンド名として扱われてしまいます。

こういうときは関数にまとめるのがすっきりします。

# ~/.zshrc
# <シリアル>はadb devicesで確認した端末のシリアルに置き換えます
phone() {
  "$HOME/Library/Android/sdk/platform-tools/adb" -s "<シリアル>" "$@"
}
 
# 使用例
# phone shell input tap 500 1200

scrcpyでパソコンからスマホの画面を見る#

scrcpyは、USBで接続したAndroidの画面をパソコンのウィンドウに表示し、マウスとキーボードで操作できるようにしてくれるツールです。ボットが何をしているか目で確認したいときに便利です。WindowsとLinuxにも対応していて、私はmacOSなのでHomebrewでインストールしました。今回入ったバージョンは5.0.1です。

brew install scrcpy

scrcpyは内部でadbを使うので、adbがPATHに入っている必要があります。SDKのplatform-toolsのパスをPATHに追加すればOKです。

# ~/.zshrc
export PATH="$HOME/Library/Android/sdk/platform-tools:$PATH"

これでターミナルでscrcpyと入力するだけで、パソコンの画面にスマホが映ります。

ADBKeyBoardで韓国語を入力する#

adbにはinput textという文字入力コマンドがありますが、韓国語はうまく入力できません。そこでADBKeyBoardという入力アプリを別途インストールしました。adbのブロードキャストで受け取った文字列をそのまま入力してくれるキーボードです。

Playプロテクトの警告#

インストールしようとすると、Playプロテクトが「安全でないアプリがブロックされました」と表示して止めました。古いAndroidバージョン向けに作られたアプリなので出る警告でした。

このアプリが何をするのか、どこから来たのかを確認したうえで、「詳細を表示 → 無視してインストール」でインストールしました。この判断については、後の注意点でもう一度触れます。

韓国語の文章を一度に入力する#

ADBKeyBoardはADB_INPUT_B64ブロードキャストで、Base64でエンコードされた文字列を受け取ります。Base64で送れば、韓国語やスペース、特殊文字がシェルで崩れません。

# 自動化するときだけADBKeyBoardに切り替え
adb shell ime enable com.android.adbkeyboard/.AdbIME
adb shell ime set com.android.adbkeyboard/.AdbIME
 
# 韓国語の文章をBase64でエンコードして一度に入力
adb shell am broadcast -a ADB_INPUT_B64 \
  --es msg "$(printf '%s' '안녕하세요, 자동화 테스트예요' | base64)"

普段のデフォルトキーボードはSamsungキーボードにしておき、自動化するときだけime setで切り替えます。作業が終わったらSamsungキーボードに戻せばOKです。入力方法のIDはadb shell ime list -sで確認できます。

これで何をしているかというと#

CapCutのTTS音声を作る#

CapCutの一部のTTS音声(例:「Adam」)はモバイルアプリでしか使えません。そこで、ボットがadbでCapCutアプリを操作して音声を作り、書き出すようにしました。デスクトップではできなかった作業を、スマホを経由して自動で処理しているわけです。

ギャラリーの整理#

自動化を回していると、書き出したファイルがギャラリーにどんどん溜まります。adbでファイルを削除しても、ギャラリーアプリにはしばらくそのまま表示されます。ギャラリーが参照するメディア一覧がすぐには更新されないからです。なのでファイルを削除したあとにメディアスキャンをやり直して、一覧を合わせています。

必ず知っておきたい注意点#

便利になった分、受け入れなければならない部分もあります。

  1. ロックのない端末 — このスマホをなくしたら、誰でも開けてしまいます。家の外に持ち出さない端末だけに適用し、重要なアカウントや決済手段にはログインしないほうがいいです。
  2. Playプロテクトの回避 — 警告を無視するのは、提供元と動作を自分で確認したアプリだけにしましょう。「普通にインストールできるじゃん」と流してしまうと、本物のマルウェアも同じ方法で入ってきます。
  3. アプリの自動化と利用規約 — 他社のアプリをボットで操作することは、そのプラットフォームの利用規約に反する場合があります。自動化する前に規約を一度確認してみてください。
  4. 個人情報を隠す — この記事のように設定を共有するときは、端末のシリアルやパスに含まれるユーザー名などの情報は隠しておくのがおすすめです。

まとめ#

まとめると、ボット専用スマホは3つのことを守れば大丈夫です。ロックされないこと、画面が消えないこと、そして長持ちすることです。そこにadbの関数、scrcpy、ADBKeyBoardまでそろえれば、パソコンからスマホをほとんど遠隔の手のように使えます。

引き出しにスマホが眠っているなら、まずは開発者向けオプションの「スリープモードにしない」をオンにしてみてください。そこから自動化がぐっと楽になります。


I endeavour to be wise when I cannot be merry, easy when I cannot be glad, content with what cannot be mended and patient when there is no redress.

— Elizabeth Montagu


他の投稿
7か月ぶりに比べ直したPaperclipとMultica 커버 이미지
 ・ 11分

7か月ぶりに比べ直したPaperclipとMultica

AIエージェントの作業を見守る画面を設計してみました 커버 이미지
 ・ 4分

AIエージェントの作業を見守る画面を設計してみました

MarkdownでAIエージェントの作業を自動化するときに押さえること 커버 이미지
 ・ 6分

MarkdownでAIエージェントの作業を自動化するときに押さえること