Androidを複数台リモート管理できる DeviceFarmerをMacで動かすためにやったことです。
目次
DeviceFarmerはOpenSTFではないの?
どうもOpenSTFのREADMEを見ると、DeviceFarmerに開発は移行したみたいです。
OpenSTFはAndroid9までの対応で止まっており、Android10や11に対応するにはDeviceFarmerへアップデートする必要があります。
事前準備
Docker Desktop for Macのインストール
起動はdocker-composeで行います。ので、Docker Desktop for Macはインストール済みです。
adbサービス
後述しますが、Macではadbサービスをマシンに直接インストールし、起動する必要がありました。
adbもインストール済みで、 adb devices
で接続した端末が認識される状態になっています。
DeviceFarmerの起動 (docker-compose)
インストールおよび起動、といってもリポジトリにdocker-compose.yamlが含まれているので、これを元にカスタマイズしました。
version: "3"
services:
rethinkdb:
container_name: rethinkdb
image: rethinkdb:2.3
restart: unless-stopped
volumes:
- "rethinkdb-data:/data"
command: "rethinkdb --bind all --cache-size 2048"
# adb:
# container_name: adb
# image: devicefarmer/adb:latest
# restart: unless-stopped
# volumes:
# - "/dev/bus/usb:/dev/bus/usb"
# privileged: true
stf:
container_name: stf
image: devicefarmer/stf
ports:
- "7100:7100"
- "7110:7110"
- "7400-7500:7400-7500"
environment:
- TZ='America/Los_Angeles'
- RETHINKDB_PORT_28015_TCP=tcp://rethinkdb:28015
- STF_ADMIN_EMAIL=<YOUR_EMAIL>
- STF_ADMIN_NAME=<YOUR_NAME>
restart: unless-stopped
# command: stf local --adb-host adb --public-ip YOUR_IP --provider-min-port 7400 --provider-max-port 7500
command: stf local --adb-host host.docker.internal --public-ip localhost --provider-min-port 7400 --provider-max-port 7500 --no-screen-reset --no-cleanup
volumes:
rethinkdb-data: {}
コメントアウトの部分が元のコードです。(YOUR_IPには公開するIPアドレスを指定します)
このファイルをdocker-compose.yamlとして保存し、そのディレクトリで docker-compose up
すれば完了。
あとは http://localhost:7100 にアクセスすると、DeviceFarmerのログイン画面が開きます。
起動まで何も躓くこと無く終わりました…
--public-ip:公開IPの設定
ローカルで使うだけなのでlocalhostに指定しました。アクセスした後、ここに書かれているホストへリダイレクトするみたいです。
もし社内サーバーなどローカルでは無い環境で起動する場合、そのホストを指定します。
--adb-host:adbとの接続
元のdocker-compose.yamlでは、adbのコンテナを使うようになっていましたが、Macでは使えなかったためホストマシンに向けています。
Docker for macはUSBデバイスが使えないため、adbサービスはローカルで起動させています。
--adb-host docker.for.mac.localhost
を指定することで、Dockerが動作しているマシンに接続先を向けています。
--no-cleanup:インストールしたアプリなどが自動的に消されるのを防ぐ
DeviceFarmerはデフォルトで、端末の使用を止めたときにインストールしたアプリなどを消したりして、使用前の状態に戻してくれるようでした。
テスト端末としては正しい動作かもしれませんが、使い勝手が悪いので --no-cleanup
オプションを付けて状態をリセットしないようにしました。
--cleanup Attempt to reset the device between uses by
uninstallingapps, resetting accounts and clearing
caches. Does not do a perfect job currently.
Negate with --no-cleanup.
[boolean] [default: true]
--no-screen-reset:自動回転をオンにすることを防ぐ
また、端末の使用を止めるとなぜか画面の自動回転が毎回オンにされていました。
これも使い勝手が悪かったので、--no-screen-reset
を指定して変更されないようにしました。
--screen-reset Go back to home screen and reset screen rotation
when user releases device. Negate with
--no-screen-reset. [boolean] [default: true]
コンテナを共通化/ディレクトリ別に管理したい場合
このyamlでは、container_nameとrethinkdbのvolumesが別途指定されています。
この設定ままだと、どのディレクトリで起動しても同じコンテナ名、共有されたデータで起動することができます。
普通に使う分には良いのですが、別ディレクトリで試してみたいなどといった場合には不便かもしれません。
もしディレクトリごとに管理を分けたい場合は、conainter_nameを消して、rethinkdbサービスのvolumesでカレントディレクトリをマウントするようにすれば、大丈夫だと思います。
volumes:
# - "rethinkdb-data:/data"
- "./data:/data"
Windowsでも動く
Macと書きましたが…そのままのdocker-comopseファイルでWindowsでも動きます!
参考
- DeviceFarmer
- Androidのリモート操作/管理ツール「OpenSTF」をDocker for Windowsで使う
以前OpenSTFをWindowsで起動したときの記事