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

buz*_*ypi 22 android adb docker

我创建了一个包含Android SDK的Docker镜像,并试图在运行此图像的容器中公开我的Android手机.所以我使用了--privileged旗帜并安装了USB设备,如下所示:

$ docker run --privileged -v /dev/bus/usb:/dev/bus/usb -d -P my-android:0.0.1
Run Code Online (Sandbox Code Playgroud)

但是,当我运行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$
Run Code Online (Sandbox Code Playgroud)

容器内的lsusb列出了设备:

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

但是,该设备在主机上可见:

?  ./adb devices
List of devices attached
4d11abcd65b74045    device
Run Code Online (Sandbox Code Playgroud)

主机操作系统

$ 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
Run Code Online (Sandbox Code Playgroud)

Docker版本

$ docker --version
Docker version 1.5.0, build a8a31ef
Run Code Online (Sandbox Code Playgroud)

可能是什么问题?

jlh*_*ora 15

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

  • 在使用了一段时间后,我发现adb守护程序在主机上自动启动,这会阻止与Docker容器的连接.如果您终止主机中的adb守护程序,则Docker容器的adb守护程序可以与手机通信. (3认同)

pan*_*hra 5

在尝试相同操作时,我遇到了与此相关的其他一些问题,我希望与他人分享,以便其他人可以节省时间:

问题1:容器中未安装lsusb

在我的情况下,没有安装lsusb,所以我使用以下命令安装了它:

apt-get update
apt-get install usbutils
Run Code Online (Sandbox Code Playgroud)

问题2:即使在安装lsusb和ADB SDK之后也看不到设备

您需要使用该-v选项重新启动容器,是的,别忘了按照答案之一中的说明杀死ADB服务器。

在主机上:

adb-kill server
docker run -ti -d --privileged -v /dev/bus/usb:/dev/bus/usb   container_name
Run Code Online (Sandbox Code Playgroud)

万一有人想从头开始,我在上面写了一篇博客文章:

如何将ADB设备连接到Linux容器

  • “我发现此URL非常有用”。。。来自某位写过该URL的人说,“ *非常好*”。您应该在博客文章中透露您的隶属关系。 (5认同)
  • 撰写博客并链接到该博客并不违反 SO 政策。链接到它而不透露您是作者是一个问题。另外,使用大写的 i。 (2认同)
  • 您的+10分是命令:`adb-kill server`,以避免docker主机阻止容器中的adb。 (2认同)

RCh*_*vez 5

这并没有回答您提出的确切问题,但确实解决了您要完成的任务 - 从在 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

更新:我最近了解到 host.docker.internal 仅在 Docker for Mac 版本 18.0 及更高版本上受支持。