LoginSignup
4
5

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-02-28

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

参考

4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5