通过ADB连接到Docker容器中的USB Android设备

时间:2015-04-10 13:49:14

标签: android docker adb

我创建了一个包含Android SDK的Docker镜像,并试图在运行此图像的容器中展示我的Android手机。所以我使用--privileged标志并按如下方式安装USB设备:

$ docker run --privileged -v /dev/bus/usb:/dev/bus/usb -d -P my-android:0.0.1

但是,当我运行ADB设备时,它不会显示USB设备:

ubuntu@d56b666be455:~/Android/Sdk/platform-tools$ ./adb devices
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
List of devices attached

ubuntu@d56b666be455:~/Android/Sdk/platform-tools$

容器内的lsusb列出了设备:

ubuntu@d56b666be455:~$ lsusb
...
Bus 002 Device 017: ID 04e8:6866 Samsung Electronics Co., Ltd GT-I9300 Phone [Galaxy S III] (debugging mode)

然而,该设备在主机上可见:

⇒  ./adb devices
List of devices attached
4d11abcd65b74045    device

主机操作系统

$ uname -a
Linux ananya 3.16.0-33-generic #44~14.04.1-Ubuntu SMP Fri Mar 13 10:33:29 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

Docker版本

$ docker --version
Docker version 1.5.0, build a8a31ef

可能是什么问题?

5 个答案:

答案 0 :(得分:13)

我认为设备上运行的ADB守护程序不能连接到两个ADB服务器。尝试将其与主机的ADB断开连接,然后将其连接到Docker容器的ADB。

答案 1 :(得分:1)

这不能回答您所问的确切问题,但可以解决您要完成的任务-从运行在Docker容器中的adb客户端连接到连接到docker主机的android设备。我会将其包含在所有试图完成同一件事的人中(就像我以前一样)。

adb客户端支持-H选项,该选项告诉它在哪里找到要连接的adb服务器。 Docker支持主机名“ host.docker.internal”,该主机名始终映射到Docker主机的IP地址。假设您的设备已连接到Docker主机,则可以执行以下操作以使容器化adb客户端连接到在docker主机上运行的adb服务器:

adb -H host.docker.internal devices

无需安装USB端口即可实现目标。

参考:https://developer.android.com/studio/command-line/adb

更新: 我最近了解到,仅适用于Mac的Docker在18.0及更高版本中支持host.docker.internal。

答案 2 :(得分:0)

打扰我了。但是我无法回答this问题,因此在这里写下。

我正在使用ubuntu:18.04,并尝试连接我的Samsung Galaxy A3 2016并使用ADB对其进行调试。设备未经授权,并且屏幕上没有弹出对话框!

我如何解决问题:

我很感兴趣,问题是否还会在Docker容器内发生?答案是“不!”。

  1. 在Docker容器中,我使用以下命令调用了它:(这是此主题的答案:))

    docker run --name android-adb -it -d --privileged -v /dev/bus/usb:/dev/bus/usb ubuntu:16.04 bash
    
  2. 我下载了platform-tools(通过ADB发行)。添加了其通往环境的路径。并重新启动bash

  3. 在Docker容器中重新启动ADB服务器并杀死主机上的ADB服务器之后。我发现确认对话框出现在智能手机的屏幕上!

所以在主机上,我认为问题出在.android目录中。只需将其移至.android-backup。下一个adb start-server命令将创建一个新命令。我还用最新的文件夹platform-tools替换了

答案 3 :(得分:0)

仅靠--privileged -v /dev/bus/usb:/dev/bus/usb跑步对我不起作用。 我尝试使用-p 5037:5037转发adb守护程序的侦听端口,但这也无济于事。

只有在我添加了--net host之后,它才起作用。 这意味着主机的网络接口暴露给docker,因此如果可以的话使用它。也许除了5037以外,还需要转发更多端口。...

答案 4 :(得分:-1)

更新

我最终使用--privileged和-v来映射整个/dev/bus/usb并修补adb以接受一个环境变量来指定根USB设备树 - /dev/bus/usb/001等。

这允许我们针对同一电话的不同组使用不同的USB容器用于不同的容器,而另一个环境变量补丁允许针对不同类型的电话使用不同的VID:PID列表。

我们正在尝试将不同的USB总线分配给运行TeamCity个客户端的不同Docker容器。

每个容器都需要将ANDROID_ADB_SERVER_PORT设置为不同的端口(因为我们不使用隔离网络)。

主机无法运行adbd,因为在任何给定时间只有一个adbd可以与手机通话。

每个容器都有一个/dev/bus/usb/xxx目录,因此我们可以将手机插入特定的容器中。

我们必须每隔几秒同步/dev/bus/usb/xxx目录,以允许热插拔和重新启动 - 只需在运行tar cf devxxx.tar /dev/bus/usb/xxxdocker cp的主机上进行shell循环传输,然后docker exec在容器/tmp内解压,diff检测要删除的节点,mv -n移动新节点。

事实上,由于我们在Linux上运行,我们可能只需按 Howto run a script when a USB device is pluged in 设置udev脚本。