Android

Android でセンサーのエミュレートを自動化する

More than 1 year has passed since last update.


tl;dr


  • Android emulator の emulator Console を使用することで、任意のセンサーの値を読み取ったり書き込んだりできる

  • emulator Console には telnet で接続する

  • 標準入力にコマンドを指定することで、 telnet での操作は自動化できる

  • 一連のコマンド操作をシェルスクリプトで記述しておけばセンサーのエミュレートを自動化できる


背景

会社で同僚がスマホの実機を振ったりしてセンサーを使ったアプリのデバッグを行っていたので、これを自動化できないものかと調べてみました。


Android emulator

Android emulator では各種センサーの値をインタラクティブにエミュレートすることができます。

Android emulator の Extended constrols を開き、 Virtual sensors を開くと CG で描画された端末をぐりぐりと動かすことができます。

emulator.gif


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 sensorsensor コマンドの使用方法を確認できます。

今回は指定した値をセンサーの値として使用するため、 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 になります。

portrait.png


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 を作成してください。


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 を自分の好きなコマンドに変更するだけです。シェルスクリプトで作成できるため、一定時間待ったり、条件分岐させたり、繰り返し処理を実行したりが容易に実現できます。


参考