设备插上数据线,PC端软件的设备列表一片空白。没有报错,没有提示,就像什么都没发生过。这种"静默失败"是我在PC控制Android设备这件事上遇到最多、也最消耗耐心的一类问题。相比之下,那些能弹出错误码的故障反而好处理——至少有线索。我手上这套FreeControl用了两年多,从最初一个人折腾三台测试机,到现在需要同时盯住十几台设备做批量验证,中间踩的坑基本覆盖了从USB物理层到画面渲染层的每一个环节。这篇内容就是把这些年反复出现的故障按"症状"重新归类,讲清楚每一类问题该从哪儿下手、怎么验证自己的判断、以及哪些看起来像软件问题的东西其实是硬件在拖后腿。不管你是刚接触PC控制Android设备的新手,还是已经能跑通但总被偶发卡顿和掉线折磨的老手,下面这些排查链路应该都能省你几个晚上的时间。
1. 把PC控制Android拆成六段链路,先定位断在哪
很多人排查问题的习惯是"看到现象就直接改参数",结果改了半天发现方向完全错了。我见过最常见的场景是:画面卡顿,于是拼命下调码率和分辨率,最后画质糊成一团,卡顿一点没改善——因为真正的瓶颈是那根只能跑USB 2.0的充电线。要避免这种瞎忙,第一步得先建立一张链路图,知道数据从设备屏幕到你PC显示器中间到底经过了多少道关口。
1.1 六个环节与各自的失效表现
一套完整的PC控制Android设备方案,本质上做的是两件事:把设备屏幕的画面"搬"到PC上,把PC的键鼠操作"送"回设备里。这两条数据流方向相反,经过的环节也不完全一样,但都依赖同一套底层的调试桥接服务。
我习惯把它拆成下面六段:
- 物理连接层:USB线、USB口、Hub,或者Wi-Fi/TCP链路。这一段断了,后面全都免谈。
- 调试桥接层:设备端的调试服务是否开启、PC端的桥接进程是否正常运行、设备是否已授权。
- 采集编码层:设备端把屏幕画面用硬件或软件编码器压成视频流。
- 传输层:视频流通过USB转发通道或TCP socket送到PC。
- 解码渲染层:PC端把视频流解出来,画到窗口里。
- 输入注入层:PC端把鼠标键盘事件反向写进设备。
关键点在于:这六段中任何一段出问题,用户看到的现象可能极其相似,但处理方式完全不同。比如"设备列表空白"和"列表里有设备但连不上",前者是第1、2段的事,后者大概率是第2段后半截或第3段的事。再比如"画面动但鼠标点了没反应",几乎可以确定问题在第6段,跟前五段无关。
我整理了一张对照表,实际排查时对着看,能快速缩小范围:
| 断在哪一段 | 典型症状 | 第一手验证手段 |
|---|---|---|
| 物理连接层 | 设备管理器里完全看不到新设备,插拔无任何反应 | 换线、换口、换机器交叉验证 |
| 调试桥接层 | 系统能识别到设备,但工具列表为空或状态异常 | 直接执行adb devices -l看状态字段 |
| 采集编码层 | 连接建立成功,但画面始终黑屏或只有一帧静止 | 看设备端日志里编码器初始化相关记录 |
| 传输层 | 画面能出但周期性冻结,或者帧率远低于预期 | 对比USB模式与网络模式下的表现差异 |
| 解码渲染层 | 画面出现绿边、花屏、颜色错乱,但操作正常 | 切换软解/硬解做对比 |
| 输入注入层 | 画面流畅、鼠标移动有反馈,但点击无效或坐标偏移 | 用设备本身的触摸屏操作做对照 |
1.2 为什么必须自下而上排查
链路排查有一条铁律:永远从最底层往上走,不要跳。原因很实际——上层的问题往往会被下层的问题掩盖,你在上层做的所有调整都可能是在给一个根本不存在的故障打补丁。
举个我自己的教训。有段时间我发现某台设备投屏时帧率始终上不去,稳定在15帧左右。我当时的思路是"帧率低就是编码性能不够",于是把分辨率从1080p降到720p,帧率从30降到15,码率一路砍到2Mbps。结果帧率纹丝不动,还是15。折腾了大半天,最后顺手换了根线,直接跑到60帧。回头看,那根线是随设备附赠的,只有两根电源线芯加两根很细的数据线芯,走USB 2.0勉强能枚举设备,但带宽根本撑不住视频流。编码器根本没被喂满,它在等传输通道。
这件事之后我形成了一个习惯:任何"性能类"的抱怨,先花三十秒做一次物理层交叉验证——换线、换口、换机器。三十秒的成本,能挡掉至少三成的误判。
1.3 建立你自己的基线记录
排查效率高不高,很大程度上取决于你有没有"正常状态"的参照。我的做法是给每一套稳定的设备组合记一份基线:设备型号、系统版本、连接方式、工具版本、实际跑出来的分辨率和帧率、设备端CPU占用、PC端CPU占用。这些数字不用很精确,但要有。
有了基线之后,判断"是不是变慢了"就变得非常直接。比如某台设备平时跑1080p60时PC端解码占用在8%左右,某天突然变成35%且画面开始抖,那基本可以断定是解码路径从硬解掉到了软解,去查显卡驱动或者工具的解码器配置就行,完全不需要从物理层开始重走一遍。
提示:基线记录里一定要写清楚"当时用的是哪根线、插在哪个口"。我吃过亏,同一台设备换到机箱前面板的USB口就掉帧,查了两小时才发现前面板是内部Hub分出来的,供电和带宽都打了折扣。
2. 设备列表空白或状态异常:桥接层的四种典型态
这是新手最容易卡住的一关。工具装好了,设备也插上了,开发者选项里的调试开关也打开了,但列表就是空的。或者更迷惑人的情况——列表里有东西,但显示的状态是一串看不懂的词。
2.1 先用命令行把真相挖出来
图形界面的工具往往会吞掉底层信息,只给你一个"未检测到设备"。这时候别在界面里反复点刷新,直接开一个终端,敲:
adb devices -l这条命令会列出所有被桥接服务识别到的设备,-l参数还会带上型号、传输方式等附加信息。输出通常长这样:
List of devices attached R58M12ABCDE device usb:1-2 product:xxx model:xxx device:xxx transport_id:1重点看第二列那个状态字段。它基本上只有四种可能,每一种对应完全不同的处理路径:
| 状态字段 | 含义 | 排查方向 |
|---|---|---|
device | 正常,已授权且可用 | 桥接层没问题,往上层找 |
unauthorized | 设备已识别,但授权未确认 | 看设备屏幕是否有授权弹窗 |
offline | 连接存在但会话异常 | 重启桥接服务、换线重连 |
| 完全无输出 | 底层根本没识别到 | 物理层、驱动层 |
如果连表头下面的内容都是空的,那说明桥接服务压根没看到设备,问题在第1段。如果出现了no permissions之类的字样,那是PC侧权限或驱动的事,跟设备无关。
2.2unauthorized:那个被你忽略的弹窗
unauthorized是我见过最高频的状态。原因朴素得可笑:设备屏幕上弹了一个"是否允许USB调试"的对话框,而设备当时锁着屏,或者被放在包里没看。
这个弹窗有个特点:它只在首次连接某台PC时出现。点过"始终允许"之后就不会再弹。但如果点了"取消",或者一直没点,状态就会一直卡在unauthorized。更麻烦的是有些定制系统会把这个弹窗做成一个不起眼的通知,很容易被后续消息顶掉。
处理办法很直接:
# 先在设备端撤销所有调试授权,让弹窗重新出现 adb shell pm clear com.android.settings # 不推荐,太重上面这条不推荐,副作用太大。正确做法是进设备的开发者选项,找到"撤销USB调试授权",点一下,然后重新插拔线缆,同时保证设备处于解锁亮屏状态,盯着屏幕等弹窗。
注意:有些定制系统在"开发者选项"里还有一层"USB调试(安全设置)"之类的开关,用来允许通过调试通道模拟输入和修改权限。这个开关不开,设备能连上、画面能出,但鼠标点击会完全失效——表现出来就是本文后面第5节要讲的输入注入问题。第一次配置设备时一定要把它一起打开。
2.3offline:会话僵死与端口占用
offline状态的含义是:设备物理上在,桥接服务也知道它在,但两边握手没完成或者中途断了。常见诱因有三个。
第一个是桥接服务进程僵死。这个服务在后台跑久了偶尔会卡住,尤其是反复插拔设备、或者同时操作多台设备之后。处理方式是重启服务:
adb kill-server adb start-server adb devices第二个是端口冲突。桥接服务的默认监听端口是5037,如果这个端口被别的进程占了,服务起不来但界面不会告诉你。Windows下可以这样查:
netstat -ano | findstr :5037macOS 或 Linux 下用lsof -i :5037。如果发现有别的进程占着,把它结束掉再重启服务。我自己遇到过一次是某个手机助手类软件在后台常驻,偷偷占着这个端口,卸了它之后世界清净了。
第三个是线材或接口的间歇性接触不良。这类问题最阴险,因为它时好时坏,adb devices刷几次才出现一次。判断方法是把设备固定住别动,连续执行十次adb devices,如果状态在device和offline之间来回跳,那基本就是物理接触问题。
2.4 驱动:Windows下的黄色感叹号
Linux和macOS基本不用操心驱动,插上就能用。Windows就麻烦一些,尤其是新装的系统或者用了精简版系统。
判断方法很简单:插上设备,打开设备管理器,看"其他设备"或者"通用串行总线设备"下面有没有带黄色感叹号的条目。有的话就是驱动没装好。
这里有个容易被误导的点:很多人会去装厂商的手机助手软件,指望它顺手把驱动带上。这种做法风险不小,因为这类软件往往会同时安装一个常驻服务,跟你手上的工具抢5037端口。更干净的做法是手动指定驱动:
- 在设备管理器里右键那个带感叹号的设备,选择"更新驱动程序"。
- 选择"浏览我的电脑以查找驱动程序"。
- 选择"让我从计算机上的可用驱动程序列表中选取"。
- 在列表里找到"Android Device"或"Android Composite ADB Interface"这类通用条目。
如果列表里没有,可以从工具自带的驱动目录里手动指定。指定完成后,设备管理器里应该出现一个正常的ADB接口设备,adb devices也能正常列出了。
3. 无线连接:连上了又掉,比连不上更折磨人
有线稳定之后,很多人会转向无线连接,因为拖着线操作实在不方便,尤其是需要同时看多台设备的时候。无线方案在协议上并不复杂,但实际操作中的坑比有线多一个数量级,而且大多集中在"网络"这个非技术性的层面。
3.1 两条完全不同的无线路径
这里有件事必须先说清楚,因为混淆会导致大量无效排查:无线连接并不是一种方式,而是两种机制,它们的工作流程和端口规则完全不同。
第一种是老式的"先有线后切无线"。流程是:先用USB连上,执行一条命令让设备在网络上监听调试端口,然后拔掉线,用IP加端口连过去。
# 设备已通过USB连接的前提下 adb tcpip 5555 # 拔线,然后 adb connect 192.168.1.50:5555这种方式的好处是简单直接,端口固定是5555。缺点是每次设备重启之后监听就失效了,得重新插线来一遍。
第二种是较新系统版本提供的"无线调试"配对机制。它在设备的开发者选项里有一个独立入口,开启之后会显示一个配对码和两个端口:一个用于配对,一个用于连接。这两个端口都是随机生成的,每次开启都不一样。配对需要在PC端执行:
adb pair 192.168.1.50:37123 # 按提示输入设备上显示的六位配对码 adb connect 192.168.1.50:40001这里最容易踩的坑是:把配对端口当成连接端口用。配对端口只在配对那一次有效,配对完成后必须用另一个端口去连接。我见过不止一个人对着配对端口反复adb connect,然后纳闷为什么一直拒绝连接。
3.2 网络层的三个隐形杀手
假设命令和端口都对,但就是连不上,或者连上了几秒就掉线。这时候问题基本不在工具,而在网络环境。我按遇到频率从高到低排三个:
第一个,客户端隔离。公司网络、酒店网络、部分家用路由的访客网络,默认会开启AP隔离,同一个Wi-Fi下的设备之间互相不可见。表现是:设备能上网,PC也能上网,但adb connect一直超时。验证方法很土但很有效——在PC上ping一下设备的IP,ping不通就是这类问题。解决办法只有换网络,或者关掉路由器的隔离选项。
第二个,PC侧防火墙。无线连接是PC主动去连设备,看起来不需要入站规则,但桥接服务本身会在本地监听端口,某些安全软件会拦截这类行为。表现是命令执行后没有任何输出,也没有报错,就是卡住。临时关掉防火墙试一次,如果立刻就好了,那就是它。
第三个,DHCP续租导致的IP漂移。这个最隐蔽,因为它不是"连不上",而是"昨天还好好的,今天IP变了"。表现是工具里保存的旧IP连不上,但设备本身一切正常。解决办法是在路由器里给设备做静态地址绑定,或者在设备Wi-Fi设置里把IP配置从DHCP改成静态。
3.3 断线重连该怎么做才不烦人
即使网络环境干净,无线连接也会偶发掉线,尤其是设备进入省电状态或者Wi-Fi信号波动的时候。这时候如果你的工作流是"手动重连",一天下来会被打断几十次。
我的做法是准备一个很短的守护脚本,逻辑就是定时探测、断了就重连:
#!/bin/bash DEVICE_IP="192.168.1.50" PORT="40001" while true; do state=$(adb devices | grep "${DEVICE_IP}:${PORT}" | awk '{print $2}') if [ "$state" != "device" ]; then echo "$(date) 连接异常,状态: ${state:-无},尝试重连" adb disconnect "${DEVICE_IP}:${PORT}" >/dev/null 2>&1 adb connect "${DEVICE_IP}:${PORT}" fi sleep 10 done配套还要做两件事:一是把设备的休眠策略改成"永不"(至少在调试期间),二是关掉系统的Wi-Fi省电优化。这两项不改,脚本会一直忙着重连,因为设备每隔几分钟就把网卡挂起一次。
4. 画面出来了但卡成幻灯片:三段定位法
连接到这一步基本就通了,接下来的问题集中在画质和流畅度。这也是最容易陷入"无脑调参数"陷阱的地方。
4.1 先分清是"编码慢"还是"传输窄"还是"解码累"
我的三段定位法很土,但很准——看两端的资源占用。
在PC上开任务管理器看工具的CPU和GPU占用,同时在设备端用一条命令看编码器相关进程的占用:
adb shell top -n 1 | head -20然后对照下面三种情况:
- 设备端编码进程占用很高(超过单核满载),PC端很低:瓶颈在采集编码层。这时候降分辨率、降帧率是有效的。
- 两端占用都不高,但画面就是卡:瓶颈在传输层。带宽不够,视频流被挤住了。这时候降码率有效,降分辨率也有效,但换线或者换USB口可能直接解决问题。
- PC端解码进程占用很高,设备端很低:瓶颈在解码渲染层。这时候要检查是不是从硬解掉到了软解。
这个判断顺序很重要。我见过太多人在第三类情况下去降设备端的分辨率,纯属南辕北辙——设备端轻松得很,累死的是PC的CPU。
4.2 分辨率、帧率、码率三者的实际关系
这三个参数经常被当成三个独立的旋钮随便拧,其实它们互相牵制。给个粗略的换算思路:视频流的带宽需求大致跟"像素总数 × 帧率 × 每像素比特数"成正比。1080p 比 720p 的像素数多约2.25倍,所以同样的帧率和码率设置下,1080p的画面质量会明显更差——码率被摊薄了。
我在实际使用中的经验值,可以当起点用:
| 分辨率 | 帧率 | 建议码率 | 适用场景 |
|---|---|---|---|
| 1920×1080 | 60 | 12–16 Mbps | 需要看清细微动作的测试 |
| 1920×1080 | 30 | 6–8 Mbps | 日常操作、文档类工作 |
| 1280×720 | 60 | 6–8 Mbps | 流畅度优先,能接受画面略糊 |
| 1280×720 | 30 | 3–4 Mbps | 多设备同屏、只看状态变化 |
| 960×540 | 30 | 1.5–2 Mbps | 极低带宽环境、USB 2.0 |
提示:码率不是越高越好。超过某个阈值之后画质提升肉眼已经看不出来,但传输和解码的压力线性增长。我在1080p30的情况下试过从8Mbps一路加到30Mbps,画面质量几乎没有区别,因为源就是手机屏幕,本身细节有限。
4.3 编码器选择:硬编不稳就退回软编
设备端的编码器分硬件编码和软件编码两类。默认肯定是硬件编码,因为它省电、延迟低、不占CPU。但硬件编码有个老问题:不同厂商的硬件编码器实现质量参差不齐,某些设备上会出现花屏、绿边、色彩偏移、甚至编码器初始化失败直接黑屏。
判断方法很直接:如果画面上有规律地出现绿色或紫色的块状区域,或者画面边缘有一圈亮绿色,那十有八九是硬件编码器的问题。处理方式是换用软件编码试试:
# 指定使用软件编码器 adb shell screenrecord --verbose /sdcard/test.mp4上面这条只是用来单独验证编码器是否正常,不参与投屏链路。如果这条命令录出来的视频也花,那就是设备端编码器的锅,实锤。
切到软编的代价是设备CPU占用会明显上升,帧率上限也会降低,所以这是个取舍:要稳定就用软编,要性能就留着硬编但接受偶发花屏。多设备场景下我倾向软编,因为一台设备花屏会让人怀疑整个系统有问题。
4.4 别忽略USB代际差异
这条纯粹是硬件常识,但栽在这上面的人 surprisingly 多。USB 2.0 的理论带宽是480Mbps,实际可用大概在280–320Mbps;USB 3.0 起步就是5Gbps。听起来2.0也够用,但别忘了这条通道是共享的,而且有大量协议开销。
单台设备跑1080p60、12Mbps的视频流,走USB 2.0 完全没问题。但同时挂四台,每台都要传视频流和注入指令,USB 2.0 就开始吃力了,表现为几台设备的画面交替卡顿。我做过一次实测,同一台PC同一个Hub:
| 连接方式 | 1台1080p60 | 4台1080p60 | 现象 |
|---|---|---|---|
| USB 2.0 直连 | 流畅 | 严重卡顿 | 画面交替冻结,约每2秒一次 |
| USB 3.0 直连 | 流畅 | 流畅 | 无明显异常 |
| USB 3.0 Hub | 流畅 | 基本流畅 | 偶发单台掉帧,可接受 |
结论很清楚:多设备场景下,USB 3.0 和独立供电的Hub是硬性条件,不是可选项。
5. 画面在动但鼠标点了没反应:输入注入的三道关
这一类问题的迷惑性最强,因为"连接正常、画面流畅、延迟也低",唯独操作没反应。用户很容易怀疑是工具本身有bug,实际上原因通常落在这三个地方之一。
5.1 第一关:坐标映射错位
症状是"能点,但点错地方"。你点屏幕左上角,设备上却在右下角响应;或者窗口里点某个按钮,实际触发的是旁边的元素。这种偏移几乎总是因为窗口显示的尺寸和设备的真实分辨率不一致。
工具为了适应窗口大小,通常会把画面等比缩放显示,但点击事件的坐标需要换算回设备原始分辨率。如果这一步换算出了问题——比如设备有刘海、有虚拟导航栏、或者设置了非标准的显示密度——就会出现偏移。
验证方法:
adb shell wm size adb shell wm density把输出的分辨率和你工具窗口里显示的尺寸对比一下。如果工具窗口是1280×720,但设备实际是2400×1080,那缩放比例就不止一个维度,某些工具在这里会算错。
还有一个隐蔽情况:设备开了"显示尺寸"缩放。有些系统允许把界面元素整体放大,这会让逻辑分辨率和物理分辨率产生差异,投屏工具按物理分辨率处理就会偏。
5.2 第二关:注入权限被系统限制
症状是"完全没反应",连错误的点击都没有。这时候要看前面提到的那个开关:开发者选项里的"USB调试(安全设置)"或者类似条目。这个开关的作用是允许通过调试通道模拟输入事件。不开它,注入指令发过去会被静默丢弃。
值得注意的是,不同定制系统对这个开关的处理差异很大。有些系统默认开启,有些默认关闭且藏得很深,还有些系统会在开启后弹二次确认。更麻烦的是部分系统的安全策略会在设备锁屏或者息屏一段时间后自动收回这个权限,导致"刚才还好好的,放了一会儿就不行了"。
排查时先确认设备处于解锁状态,然后进开发者选项检查该开关的状态。如果它显示开启但仍然无效,关掉再开一次。
5.3 第三关:特殊按键与文本输入的映射
鼠标点击和滑动通常问题不大,真正容易失效的是三类操作:
导航键。返回、主页、最近任务、电源、音量,这些不是触摸事件,而是按键事件。工具需要有对应的映射。如果工具界面上的按钮点了没反应,可以直接用命令验证按键通道是否正常:
adb shell input keyevent KEYCODE_HOME adb shell input keyevent KEYCODE_BACK adb shell input keyevent KEYCODE_APP_SWITCH这三条命令如果都有效,说明按键通道是好的,问题在工具的映射配置上;如果都无效,那还是权限问题。
中文输入。这是个大坑。通过调试通道注入文本,默认只对ASCII字符友好,中文、日文、emoji这类字符经常丢或者变成问号。行业里常见的做法是装一个专门的输入法,让工具把文本通过这个输入法提交进去,而不是逐字符注入。另一条路是走剪贴板中转:把文本写到设备剪贴板,再模拟一次粘贴操作。后者配置更简单,但依赖设备端剪贴板服务的稳定性。
手势与多指。双指缩放、长按拖拽这类操作,依赖工具的触摸事件构造能力。如果单指点击正常但双指缩放无效,那不是权限问题,是工具没有实现多指事件的构造,属于能力边界。
注意:涉及支付、银行、企业办公类的应用,通常会有额外的输入保护机制,会主动屏蔽来自调试通道的事件注入。这不是故障,属于设计如此。这类场景老老实实用设备本身的屏幕操作。
6. 多设备同屏时的资源争抢与稳定性
单台设备跑通之后,很多人会自然而然地想扩大规模。三台、五台、十台,问题就开始成片出现,而且症状五花八门,很难归因。
6.1 每台设备必须有独立的实例和端口
最基础的错误是:所有操作都发给"默认设备"。在只有一台设备时这没问题,多台设备时所有命令会随机落到某一台上,或者直接报more than one device。
正确做法是始终用序列号指定目标设备:
adb devices -l # 先拿到每台设备的序列号 adb -s R58M12ABCDE shell wm size同样地,每个投屏实例需要独立的本地端口来转发视频流和接收输入事件,否则会互相抢占。我一般的端口规划是:视频流端口从27183开始,每台加10;控制端口从27184开始,每台加10。这样在配置文件和脚本里都能一眼算出某台设备用的是哪个端口。
| 设备序号 | 序列号 | 视频端口 | 控制端口 |
|---|---|---|---|
| 1 | 设备A的序列号 | 27183 | 27184 |
| 2 | 设备B的序列号 | 27193 | 27194 |
| 3 | 设备C的序列号 | 27203 | 27204 |
这套编号规则看起来啰嗦,但能避免后期"端口冲突了不知道是谁占了谁"的混乱。我吃过一次亏,两个实例撞了同一个端口,表现是其中一台的画面时不时闪一下别人的内容,排查了整整一下午。
6.2 供电和散热是最容易被低估的变量
十几台设备同时在线,两个物理问题会立刻浮出水面。
供电。每台设备在投屏状态下都在持续充电,同时还要跑编码。一个不带独立电源的Hub,标称能提供多少电流,分摊到四五个口上往往就不够用了。表现是设备电量不升反降,或者运行一段时间后自动断开重连。解决方式只有一条——用带独立电源适配器的Hub,并且给整个系统留足功率余量。
散热。设备长时间满负荷编码,温度会很快起来。触发了温控之后,系统会降频,编码能力下降,帧率跟着掉,严重时直接断开投屏。这个问题的表现特别有欺骗性,因为"刚开机时好好的,跑一小时就卡",看着像软件的内存泄漏。实测下来的规律是:连续跑两小时以上,几乎必然出现性能下滑。所以我的做法是给设备加主动散热,同时在长时间任务里加入周期性检查,一旦发现帧率跌到基线的70%以下就主动重连一次。
6.3 批量操作的正确姿势
多设备场景下,最耗时的不是操作本身,而是"逐台做一遍"的机械重复。这里给个批量执行的小模板,逻辑是把命令对设备列表做循环:
#!/bin/bash SERIALS=$(adb devices | awk 'NR>1 && $2=="device" {print $1}') for s in $SERIALS; do echo "===== 处理设备: $s =====" adb -s "$s" shell input keyevent KEYCODE_WAKEUP adb -s "$s" shell wm size adb -s "$s" shell dumpsys battery | grep level done这个模板有三个细节值得注意:
NR>1跳过表头行,$2=="device"只挑选真正可用的设备,避免把offline的设备也带进来。- 每台设备之间不要不加延迟地连续执行,尤其是涉及启动投屏实例的操作,同时发起十几个连接很容易把PC侧的桥接服务打懵。加个一两秒的间隔,稳定性会好很多。
- 输出里带上设备序列号,日志才看得懂是谁出的问题。
6.4 版本匹配:工具与系统之间的隐形墙
这条单独拎出来说,因为它造成的故障最难联想。某些系统版本调整了调试协议的细节或者权限模型,旧版本的工具在新系统上就会表现出各种奇怪的行为——能连上但画面黑、画面正常但输入失效、跑一会儿就断。
我的一般原则是:新设备先用最新版本的工具试,跑通了再考虑是否统一到旧版本。反过来做(用旧工具去适配新系统)失败率很高。同时,多个工具版本共存时要注意,它们背后的桥接服务版本可能不一致,同时运行会互相踢下线。表现是一启动第二个工具,第一个的连