我创建了一个包含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
可能是什么问题?
答案 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容器内发生?答案是“不!”。
在Docker容器中,我使用以下命令调用了它:(这是此主题的答案:))
docker run --name android-adb -it -d --privileged -v /dev/bus/usb:/dev/bus/usb ubuntu:16.04 bash
我下载了platform-tools(通过ADB发行)。添加了其通往环境的路径。并重新启动bash
在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/xxx
,docker cp
的主机上进行shell循环传输,然后docker exec
在容器/tmp
内解压,diff检测要删除的节点,mv -n
移动新节点。
事实上,由于我们在Linux上运行,我们可能只需按 Howto run a script when a USB device is pluged in 设置udev脚本。