tl;dr
- Android emulator の emulator Console を使用することで、任意のセンサーの値を読み取ったり書き込んだりできる
- emulator Console には telnet で接続する
- 標準入力にコマンドを指定することで、 telnet での操作は自動化できる
- 一連のコマンド操作をシェルスクリプトで記述しておけばセンサーのエミュレートを自動化できる
背景
会社で同僚がスマホの実機を振ったりしてセンサーを使ったアプリのデバッグを行っていたので、これを自動化できないものかと調べてみました。
Android emulator
Android emulator では各種センサーの値をインタラクティブにエミュレートすることができます。
Android emulator の Extended constrols
を開き、 Virtual sensors
を開くと CG で描画された端末をぐりぐりと動かすことができます。
emulator Console
Android emulator の操作はコマンドラインから行うことができます。
emulator Console を開くには、 Android emulator を起動した状態で次のコマンドを実行します。
$ telnet localhost 5554
5554
はエミュレータのポート番号を指定します。エミュレータのポート番号は adb devices
等で調べることができます。
auth コマンド
emulator Console で help
または ?
と打つと、使用可能なコマンドが表示されます。
しかしこの状態ではまだ後述する sensor
コマンドは利用できません。その前に auth
コマンドで認証する必要があります。
emulator Console を起動した時に次のようなメッセージが表示されたはずです。
Android Console: Authentication required
Android Console: type 'auth <auth_token>' to authenticate
Android Console: you can find your <auth_token> in
'/Users/yourname/.emulator_console_auth_token'
cat ~/.emulator_console_auth_token
などして内容を表示させ、その内容で auth
コマンドを実行してください。
OK
と表示されれば認証完了です。 help
コマンドで使用できるコマンドを確認すると、 sensor
などのコマンドが増えていることがわかります。
sensor コマンド
いよいよ本題です。 sensor
コマンドはその名の通り、各種センサの値を読み取ったり書き込んだりできます。
help sensor
で sensor
コマンドの使用方法を確認できます。
今回は指定した値をセンサーの値として使用するため、 sensor set
コマンドを使用します。
sensor set
コマンドは次のように使用します。
set <sensorname> <value-a>[:<value-b>[:<value-c>]]
<sensorname>
にはセンサー名を指定します。これは sensor status
コマンドで確認できます。
例えば次のように入力すると、加速度センサの Y 軸の値を 20
に指定できます。
sensor set acceleration 0:20:0
下の図のように端末を縦にした場合、加速度センサの平常時の値は 0:9.81:0
になります。
telnet でのコマンドの実行を自動化する
ここまでで Android emulator の emulator Console を使用して各種センサの値をエミュレートできるようになりました。
それではこれらの一連の作業を自動化してみましょう。
telnet でのコマンドの実行を自動化するには、以下のようにします。
$ (sleep 1; echo help; sleep 1) | telnet localhost 5554
これを実行すると、 emulator Console に接続し、1秒後に help
コマンドが実行され、さらに1秒後に telnet が終了します。
はじめに sleep 1
で1秒待つのは、 telnet の接続が完了するのを待つためです。
これだけで任意のコマンドを自動的に実行させられますが、予めコマンドを別ファイルで用意しておくと便利です。
次の内容で cmds.sh
を作成してください。
a=$(cat ~/.emulator_console_auth_token)
sleep 1
echo auth $a
echo sensor status
sleep 1
これを使用して telnet を制御するには次のように実行します。
$ sh ./cmds.sh | telnet localhost 5554
自動的に auth
コマンドを実行し、 sensor status
コマンドを実行できていることを確認できるはずです。
あとは cmds.sh
を自分の好きなコマンドに変更するだけです。シェルスクリプトで作成できるため、一定時間待ったり、条件分岐させたり、繰り返し処理を実行したりが容易に実現できます。