BlueStacksでadbが使えたり使えなかったりした話

BlueStacksでadbではまる

AndroidのエミュレータでBlueStacksでアプリをある程度自動コントロールしたくてadbコマンドでコントロールしようとした。
※ちなみに、BlueStacks4の古いバージョン(4.140.2.1004)からアップデートしないようにしているので、最新版はどうだか知りません。

そのときにはまったことのメモ

BlueStacksのadbのコマンド

BlueStacksのadbは通常のAndroidSDKのadb.exeでもよさそうだけど、BlueStacks用に、「C:\Program Files\BlueStacks\HD-Adb.exe」を使用する。


これは、BlueStacksのエミュレータに連動するので、BlueStacksが終了すれば
サービスも同時に終了するようになっているらしい。



adbを使えるようにする設定

 BlueStacksの右上の設定メニュー→「環境設定」→「環境設定」→「Android Debug Bridge(ADB)の有効化」のチェックをする。




立ち上げの時の注意(超ハマったポイント)

 1インスタンス目はポート番号「5555」で、この場合はadbを使える。(※なぜemulator-5554なのかは不明)


 2インスタンス目はそのままだとadbがつかえない。

 BlueStacksはインスタンスを作成したときにadbを受け付けるポートが勝手に決まっている。
 最初に作ったインスタンス1つの場合は特に設定は不要で使えるのだが、Googleアカウントを使い分けたい時などで2インスタンス目を作った場合やインスタンスを作ったり消したりするとadbのポートがかわるのでした。

 で、そのポートはレジストリを見ることで確認できる。
 「HKEY_LOCAL_MACHINE\SOFTWARE\BlueStacks\Guests」の下に各インスタンスのフォルダがあり、さらにその下の「Network\Redirect\tcp/5555」に設定されている値がポート番号になる。


この場合は「5605」が対象のポート番号となる。これを利用するために、ポート指定してadbのサービスに接続する。
"C:\Program Files\BlueStacks\HD-Adb.exe" connect 127.0.0.1:5605
とすることでadbにデバイス認識させることができる。

いったん認識すれば、あとはそのままadbコマンドが使用できる。(※複数インスタンス同時に使用する場合はデバイス名の指定が必要となるが、単インスタンスであればいったん接続さえすればデバイスの指定はする必要はない)




BlueStacksへのアプリ立ち上げの指示

 adbと同じabd shell am start -n アクティビティ名で起動できる。
 実際のアクティビティ名が何かについてはいったん以下のバッチを起動した状態でBlueStacks上でアプリをスタートさせることで調査する。

echo .> activitychk.txt
:loop
"C:\Program Files\BlueStacks\HD-Adb.exe" shell dumpsys activity | findstr "Run" | findstr "#" >> activitychk.txt
goto loop

例えば楽天Web検索ならactivitychk.txtには以下のように出力される。
com.bluestacks.appmart~はbluestacks自身なので無視して、それ以外の最初に現れたアクティビティを使う。アプリが立ち上がった後はアクティビティがかわる場合があるので、最初にでてきたものを使って以下のようにadbにコマンド送信するとコマンドでBlueStacks上でアプリを起動できる。
"C:\Program Files\BlueStacks\HD-Adb.exe" shell am start -n jp.co.rakuten.toolbar.raws/com.google.android.apps.chrome.Main




画面の操作をadbで行う

 BlueStacksのアプリが立ち上がればadbでアプリの画面をタップしたりスワイプさせることができる。
 注意が必要なのはアプリが立ち上がった状態でないと干渉できないことだ。
 BlueStacksのデスクトップを直接タップすることなどはできない。

 実際のタップについては例えば
"C:\Program Files\BlueStacks\HD-Adb.exe" shell input tap 300 100
とすれば、座標 300,100の位置をタップできる。
 このとき、画面が横を向いている場合、X軸は縦方向、Y軸が横方向になる(右上が 0,0となる)。
 また、PCのディスプレイのドット数ではなく、BlueStacksの解像度に合わせた座標となる。例えばBlueStacksの環境設定で設定されている解像度が1600x900、実際のBlueStacksのウインドウの画面サイズが1920x1080だとしたら、上記の300,100のタップ位置はPCの画面座標上の(300*1920/1600,100*1080/900)=(360,120)の画面座標がタップされる。

指示するべき座標を確かめるには
"C:\Program Files\BlueStacks\HD-Adb.exe" shell settings put system pointer_location 1
とすると、座標情報表示が有効化されるので、この状態で実際の画面をマウスクリックしてみると、座標が分かる。軌跡も確かめられるので便利。
"C:\Program Files\BlueStacks\HD-Adb.exe" shell settings put system pointer_location 0
で表示無効化する。

 スワイプであれば
"C:\Program Files\BlueStacks\HD-Adb.exe" shell input swipe 300 700 300 100
のようにすることで、スワイプできる。この場合は座標(300,700)→(300,100)を指でスワイプさせることを意味する。

 また、スワイプのコマンドの最後にスワイプにかける時間を指定できる。
"C:\Program Files\BlueStacks\HD-Adb.exe" shell input swipe 300 700 300 100 1500
 とした場合スワイプを1500ミリ秒=1.5秒で行うことを意味する。(1500ミリ秒とするとかなりゆっくりってこと。)

 タップではなく、ロングタップはこのスワイプを同じ座標で行うことで実現できる。
"C:\Program Files\BlueStacks\HD-Adb.exe" shell input swipe 300 100 300 100 1500
 こんな感じ。




アプリの終了

 adb の shell am force-stopで行うが、起動と違い、アクティビティ名ではなくパッケージ名(アクティビティの「/」より左側)を指定する。
 例えば、上述の楽天Web検索のアプリを終了させるには
"C:\Program Files\BlueStacks\HD-Adb.exe" shell am force-stop jp.co.rakuten.toolbar.raws

注意:BlueStacksのバグなのか、たまにうまく終了しないことがある。
"C:\Program Files\BlueStacks\HD-Adb.exe" shell dumpsys activity | findstr "Run"
でも出てこないが、BlueStacksの画面上では画面が中途半端にクリアされて、アプリタブが残ってしまうことがある。(プロセスの残らないゾンビ化??)
 この場合、アプリタブの×ボタンをクリックしないと画面上終了しないが、タップをコマンドで行えないので、マウスクリックするしかない。
 もしかしたら、BlueStacksを最新化すればいいのかもね。

コメント

コメントを投稿

このブログの人気の投稿

楽天ラッキーくじ 処理設定ページ

楽天ラッキーくじ スタートページ