You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

主机与Docker容器并行执行adb devices的设备可见性异常问题

解决主机与Docker容器同时识别Android设备的问题

这个问题我之前也碰到过,核心原因就是ADB的单服务器限制——同一台机器上只能跑一个ADB服务器实例。当你在主机启动ADB服务器时,容器里的ADB客户端因为套接字访问或者权限问题连不上主机的服务器,自然看不到设备;而主机杀掉服务器后,容器里的ADB会自己启动服务器,这时候它能拿到设备权限,所以又能识别了。

下面是我亲测有效的解决步骤:

  • 共享ADB套接字与密钥目录
    ADB通过/tmp/adb.sock这个套接字文件实现客户端和服务器的通信,同时~/.android目录里存着设备授权的密钥。我们只需要把这两个路径挂载到容器里,让容器直接复用主机的ADB环境就行。启动容器的时候加上这两个挂载参数:
docker run -v /tmp/adb.sock:/tmp/adb.sock -v ~/.android:/root/.android [你的容器镜像名称]

解释一下:

  • /tmp/adb.sock挂载后,容器内的ADB客户端直接连接主机的ADB服务器,不用自己启动新的;

  • ~/.android挂载是为了共享设备授权信息,避免容器每次启动都要重新授权设备。

  • 调整套接字权限(关键)
    主机上的ADB套接字默认可能只有启动它的用户能访问,容器内的用户(通常是root或者其他非主机用户)没有权限读取这个套接字,所以会连接失败。可以临时修改套接字权限来测试:

sudo chmod 777 /tmp/adb.sock

如果是生产环境,你可以更严谨一点——找出主机ADB进程的用户组,然后把容器内的用户加入这个组,但777是最快验证的方式。

  • 确保ADB版本兼容
    容器内的ADB版本必须和主机的ADB版本匹配,否则会出现"version mismatch"的错误。分别在主机和容器内执行adb version检查版本号,要是不一致,就在容器里安装和主机相同版本的ADB工具。

  • 验证效果
    在主机上执行adb kill-server && adb start-server重启ADB服务器,然后进入容器内执行adb devices,这时候应该就能看到两台设备的列表了,主机上也能正常识别设备,不会再出现冲突。

这样设置后,主机和容器就共享同一个ADB服务器,再也不会出现"主机启动服务器容器就看不到设备"的问题了。

内容的提问来源于stack exchange,提问作者gad_gadskiy

火山引擎 最新活动