[Android]Android端末のデバイスファームSTFを構築する

2021-08-09

STF

このSTFというのは、AWS Device Farm のように Android端末のデバイスファームを自作できるツールになります。
GitHub – DeviceFarmer/stf: Control and manage Android devices from your browser.

このSTFを構築しておくと会社にあるAndroid端末でも自宅からリモートで接続してデバッグに使用できるようになります。

今回、これがDocker Composeで簡単に構築できるというのを耳にして構築してみました。

準備

まずはDocker ComposeとADBコマンドを使用できるようにします。

Dockerのインストールは下記を参照してインストールしておきます。
Docker Compose のインストール — Docker-docs-ja 19.03 ドキュメント

ADBコマンドはAndroidStudioをインストールすれば一緒についてきます。
そのままだとパスが通って無くて使えないのでパスを通しておきます。

Macの場合だと ~/.bash_profile にADBのパスの設定を追記しておきます。
[user_name]は自分のPCの環境に合わせてください。

export PATH=$PATH:/Users/[user_name]/Library/Android/sdk/platform-tools
source ~/.bash_profile

で反映して適当にadbコマンドが実行できるようになっていればOKです。

最後にdocker-compose.yamlを用意していきます。

STF公式のdocker-compose.yamlが下記にあります。
stf/docker-compose.yaml at master · DeviceFarmer/stf · GitHub

ただ、公式のものはADB用のコンテナ内からUSBに接続したAndroid端末を認識するようになっているのですが、
自分の場合だとうまく認識しなかったのでホストのADBコマンドを直接使うように変更しています。
また、stf の起動オプションに --no-cleanup で インストールしたアプリを端末利用終了時に削除されないようにしています。

下記の設定ファイルのIP:192.168.100.193 の部分を自分のホストのIPに変更すればMacでもWindowsでも構築できるはずです。

今回作成した docker-compose.yaml ファイル

# [DeviceFarmer/stf: Control and manage Android devices from your browser.](https://github.com/DeviceFarmer/stf)

# 使い方
# 1. 192.168.100.193 の部分を自分のホストのIPに変更
# 2. adb start-server
# 3. docker-compose up -d
# 4. http://192.168.100.193:7100 にアクセスすれば管理画面が表示される

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"

  # コンテナからUSBがうまく認識しなかったのでホストのadbを使うようにする
  # adb:
  #   container_name: adb
  #   image: devicefarmer/adb:latest
  #   restart: unless-stopped
  #   volumes:
  #     - "/dev/bus/usb:/dev/bus/usb"
  #   privileged: true

  # --adb-host host.docker.internal でホストのadbを使用する 
  #     コンテナを起動する前に adb start-server でadbを立ち上げておくこと
  # --no-cleanup で インストールしたアプリを端末利用終了時に削除されないようする
  # http://192.168.100.193:7100 にアクセスすれば管理画面が表示される

  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=p1j98x1i@gmail.com
      - STF_ADMIN_NAME=p1j98x1i
    restart: unless-stopped
    command: stf local --public-ip 192.168.100.193 --adb-host host.docker.internal --provider-min-port 7400 --provider-max-port 7500 --no-cleanup

volumes:
  rethinkdb-data: {}

起動

準備ができたらSTFサーバーを立ち上げていきます。

今回はホストのADBコマンドを直接使うように変更しているので、
まずはホスト側で端末を認識できるようにADBサーバを起動しておきます。

adb start-server

あとはdocker-compose.yamlがあるディレクトリで

docker-compose up -d

を実行すればSTFのサーバが立ち上がります。

ポートは7100で設定されているので
http://192.168.100.193:7100 にアクセスすればSTFの管理画面が表示されます。

使い方

STFの管理画面にアクセスるとユーザー登録の画面が表示されるので、
適当にユーザー登録するとログインできるようになります。

ホストPCにAndroid端末を接続すると端末側にデバッグ接続許可のダイアログが表示されるので承認すればDevicesの画面に接続した端末が表示されます。

デフォルトだと言語が英語になってますが、上部のメニューのSettingsから日本語に設定することもできます。

リストのUseボタンを押すと端末の操作画面が開きます。

端末の操作画面ではエミュレータを操作するようにブラウザ上で端末を操作できます。

さらにRemote debugの項目に記述されているコマンドを手元のPCで実行すれば、
AndroidStudioから直接ローカルの端末と同様に端末にリモート接続してデバッグが行なえます。

adb connect 192.168.100.193:7401

Appsの項目の設定アイコンを押すと端末の設定画面が直接開けたりと他にも便利な機能がいろいろとあります。

まとめ

STFを構築してみましたが、完成度が高くさまざまな機能があってデバッグする上で困ることはほぼなさそうです。
また、1度Docker Composeファイルを作ってしまえば構築もほとんど手間がかかりません。

昨今のリモートワークする機会が多くなっていますが、なかなか自宅に端末を揃えるのも負担です。

会社の端末でデバッグしたいというときに、このSTFを構築してVPNで接続できるようにしておけば、
自宅からエミュレータでデバッグするように会社の実機端末でデバッグできるため、端末を取りに出社するというようなことも減らせそうです。