背景

STF是一个web端移动设备管理平台,可以从浏览器端远程调试、远程管理设备(目前仅支持android),再通过端口开放从而实现web端远程调试真机的目的,同时还可以配置wifi连接实现无线调试的功能

安装

  1. 安装Docker

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # 先卸载已安装的Docker包
    sudo apt-get remove docker docker-engine docker-ce docker.io
    # 更新软件包
    sudo apt-get update
    # 安装Https实用存储库
    sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
    # 添加Docker官方的GPG密钥
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    # 设置stable存储库
    sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
    # 再次更新以下apt包
    sudo apt-get update
    # 安装Docker
    sudo apt-get install docker-ce docker-ce-cli containerd.io
  2. 拉取STF相关镜像

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # STF镜像
    sudo docker pull openstf/stf:latest
    # adb 镜像
    sudo docker pull sorccu/adb:latest
    # rethinkdb 镜像
    sudo docker pull rethinkdb:latest
    # ambassador 镜像
    sudo docker pull openstf/ambassador:latest
    # nginx 镜像
    sudo docker pull nginx:latest
  3. 查看已安装的镜像

    1
    sudo docker images

    img

  4. 启动镜像

    1
    2
    3
    4
    5
    6
    # 启动rethinkdb数据库
    sudo docker run -d --name rethinkdb -v /srv/rethinkdb:/data --net host rethinkdb rethinkdb --bind all --cache-size 8192 --http-port 8090
    # 启动adb
    sudo docker run -d --name adbd --privileged -v /dev/bus/usb:/dev/bus/usb --net host sorccu/adb:latest
    # 启动stf:启动时配置的IP地址通过ifconfig命令查询到的结果, 其中--allow-remote是设置允许adb远程连接android真机
    sudo docker run -d --name stf --net host openstf/stf stf local --public-ip 192.168.85.129 --allow-remote

    img

  5. 查看运行中的容器

    1
    sudo docker ps -a

    img

  6. 然后在浏览器中访问STF所在服务器的即可访问相应的数据:http://192.168.140.129:7100

    img

知识点

  1. Docker服务状态

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # 查看docker服务启动状态
    systemctl status docker
    # 启动docker服务
    sudo systemctl start docker
    # 重启docker
    sudo service docker restart
    # 停止docker
    sudo service docker stop
    # 启动docker
    sudo service docker start
  2. 容器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # 查看所有正在运行容器
    docker ps
    # containerId 是容器的ID
    docker stop containerId
    # 查看所有容器
    docker ps -a
    # 查看所有容器ID
    docker ps -a -q
    # start启动所有停止的容器
    docker start $(docker ps -a -q)
    # stop停止所有容器
    docker stop $(docker ps -a -q)
    # remove删除所有容器
    docker rm $(docker ps -a -q)
  3. 删除镜像

    1
    2
    3
    4
    # 删除所有的镜像
    docker rmi $(docker images -q)
    # 根据格式删除所有镜像
    docker rmi $(docker ps -qf status=exited)
  4. 查看日志

    1
    2
    3
    4
    5
    6
    7
    8
    # 日志命令格式
    docker logs [options] [容器的号]
    --details:显示更多的信息
    -f, --follow:跟踪实时日志
    --since=[日期格式]:显示自某个时间(timestamps)之后的日志,或者相对时间,如42m,或2020-02-09T13:23:25
    --tail=数字:从日志末尾显示多少行日志,默认为all
    -t,--timestamps:显示时间戳
    --until=[时间格式]:显示子某个timestamp之前的日志,或相对时间,如42m(42分钟)
  5. Docker启动提示Get Permission Denied

    解决办法1:

    1
    # 使用sudo获取管理员权限,运行docker命令

    解决办法2:docker守护进程启动的时候,会默认赋予名字为docker的用户组读写Unix socket的权限,因此只要创建docker用户组,并将当前用户加入到docker用户组中,那么当前用户就有权限访问Unix socket了,进而也就可以执行docker相关命令

    1
    2
    3
    4
    5
    6
    7
    8
    # 添加docker用户组
    sudo groupadd docker
    # 将登陆用户加入到docker用户组中
    sudo gpasswd -a $USER docker
    # 更新用户组
    newgrp docker
    # 测试docker命令是否可以使用sudo正常使用
    docker ps
  6. 配置手机允许远程adb

    • **(背景,了解)**在adbd启动时首先检查是否设置了service.adb.tcp.port,如果设置了,就是使用TCP作为连接方式;如果没设置,就去检查是否有adb的USB设备(dev/android_adb),如果有就用USB作为连接方式;如果没有USB设备,则还是用TCP作为连接方式。因此只需要在启动adbd之前设置service.adb.tcp.port,就可以让adbd选择TCP模式,也就可以通过网络来连接adb了。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      /* for the device, start the usb transport if the
      ** android usb device exists and "service.adb.tcp"
      ** is not set, otherwise start the network transport.
      */
      property_get("service.adb.tcp.port", value, "0");
      if (sscanf(value, "%d", &port) == 1 && port > 0) {
      // listen on TCP port specified by service.adb.tcp.port property
      local_init(port);
      } else if (access("/dev/android_adb", F_OK) == 0) {
      // listen on USB
      usb_init();
      } else {
      // listen on default port
      local_init(ADB_LOCAL_TRANSPORT_PORT);
      }

      有两种修改方式:

      • 需要修改init.rc文件。
      • 通过命令设置,以下步骤是通过命令修改的,但每次重启手机后就需要重新设置。
    • 本地配置android sdk环境,手机(android版本别太低)开启了usb调试开关,且确保手机与电脑位于同一wifi下(其实有公网IP理论上应该都可以,我还没有尝试),然后执行如下命令

      1
      2
      3
      4
      5
      6
      # 5555是tcp服务端口号,这个可以随意给(端口必须未被占用)
      # 端口大于1023即可,因为小于1023的是系统内部使用的高级端口,大都服务于系统内部服务
      adb tcpip 5555

      # 如果需要切换会usb调试,则执行如下命令
      adb usb
    • 然后拔掉usb,执行如下命令远程连接手机

      1
      2
      3
      4
      5
      # ip是自己手机在局域网的IP
      adb connect 192.168.8.101:5555

      # 执行成功后,查看连接是否正常
      adb devices

参考文献