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

ddarikpa  于 2023-09-29  发布在  Android
关注(0)|答案(8)|浏览(286)

我创建了一个Docker镜像,其中包含Android SDK,并试图在运行此镜像的容器中暴露我的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

主机OS

$ 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

会是什么问题呢?

ne5o7dgx

ne5o7dgx1#

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

webghufk

webghufk2#

当我在尝试同样的方法时,我遇到了一些与此相关的其他问题,我想分享这些问题,以便其他人可以保存时间:

问题一:容器中未安装lsusb

在我的例子中,lsusb没有安装,所以我用下面的命令安装了它:

apt-get update
apt-get install usbutils

问题二:即使安装了lsusb和ADB SDK,也无法看到设备

您需要使用-v选项重新启动您的容器,是的,不要忘记杀死ADB服务器,如其中一个答案所述。
在主机上:

adb-kill server
docker run -ti -d --privileged -v /dev/bus/usb:/dev/bus/usb   container_name

如果有人想从头开始,我写了一篇博客文章:
How to connect ADB devices to Linux container

vh0rcniy

vh0rcniy3#

这并没有回答你所问的确切问题,但确实解决了你试图完成的事情-从运行在docker容器内的adb客户端连接到连接到docker主机的android设备。我包括这对任何人试图完成同样的事情(像我一样)。
adb客户端支持-H选项,该选项告诉它在哪里找到要连接的adb服务器。Docker支持主机名“host.docker.internal”,它总是Map到Docker主机的IP地址。假设你的设备连接到了docker主机,你可以执行以下操作来让你的容器化adb客户端连接到docker主机上运行的adb服务器:
adb -H host.docker.internal devices
无需安装USB端口即可实现目标。
参考:https://developer.android.com/studio/command-line/adb
更新:我最近了解到,host.docker.internal仅在18.0及以上版本的Docker for Mac上受支持。

xxslljrj

xxslljrj4#

只运行--privileged -v /dev/bus/usb:/dev/bus/usb对我来说不起作用。我尝试使用-p 5037:5037转发adb守护进程的侦听端口,但也没有帮助。
只有在我添加了--net host之后才能工作。这意味着主机的网络接口会暴露给docker,所以如果你没问题的话,就使用它。可能除了5037之外还有更多的端口需要转发....

f0brbegy

f0brbegy5#

这对我很有效。

  • 将设备设置为PPT模式
  • (可选)检查设备是否在本地可用$ adb devices

我尝试了很多选择,只有一个可行。使用--network标志作为下一个示例

  • 运行容器

$ docker run -it --net host ubuntu bash
产出:

List of devices attached
464e128 device

使用this Dockerfile。是为Flutter项目

5us2dqdw

5us2dqdw6#

更新:

我最终使用--privileged和-v来Map整个/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来传输它,然后docker exec在容器的/tmp中解压缩,diff检测要删除的节点,mv -n移动新节点。
事实上,因为我们运行在Linux上,我们可能只需要按照 * Howto run a script when a USB device is pluged in * 设置udev脚本。

gxwragnw

gxwragnw7#

不好意思我太过分了。但是我不能回答这个问题,所以我把它写在这里。
我正在使用ubuntu:18.04并试图连接我的三星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

1.我下载了platform-tools(与ADB一起分发)。添加了其环境路径。并重新启动了bash
1.在Docker容器内重新启动ADB服务器并在主机上杀死ADB服务器后。我发现确认对话框出现在智能手机的屏幕上!
所以在主机上,我认为问题在.android目录中。把它移到.android-backup。下一个adb start-server命令将创建一个新的。另外,我将platform-tools文件夹替换为最新的

neekobn8

neekobn88#

添加--device=/dev/bus/usb:/dev/bus/usb -v /etc/udev:/etc/udev optiopn以通过Docker容器中的USB访问ADB设备

相关问题