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コマンドが使用できる。(※複数インスタンス同時に使用する場合はデバイス名の指定が必要となるが、単インスタンスであればいったん接続さえすればデバイスの指定はする必要はない)
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 |
"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のデスクトップを直接タップすることなどはできない。
実際のタップについては例えば
とすれば、座標 300,100の位置をタップできる。
"C:\Program Files\BlueStacks\HD-Adb.exe" shell input tap 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 |
で表示無効化する。
スワイプであれば
のようにすることで、スワイプできる。この場合は座標(300,700)→(300,100)を指でスワイプさせることを意味する。
"C:\Program Files\BlueStacks\HD-Adb.exe" shell input swipe 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を最新化すればいいのかもね。
助かりました
返信削除