加入收藏 | 设为首页 | 会员中心 | 我要投稿 站长网 (https://www.0577zz.com/)- 低代码、办公协同、物联平台、操作系统、5G!
当前位置: 首页 > 服务器 > 搭建环境 > Unix > 正文

Unix下Android调试卡壳?三步揪出90%环境配置问题

发布时间:2026-11-06 11:37:10 所属栏目:Unix 来源:DaWei
导读:  哎哟我昨天又连上那个破ADB了——就那种连上五秒自动断,logcat刷得比外卖小哥上楼还快,根本看不清哪行是Java堆栈哪行是SELinux拒绝日志……  谁在工位上打电话谈房租?哦对,老张,第三遍说“押一付三太贵”,声音大得我

  哎哟我昨天又连上那个破ADB了——就那种连上五秒自动断,logcat刷得比外卖小哥上楼还快,根本看不清哪行是Java堆栈哪行是SELinux拒绝日志……


  谁在工位上打电话谈房租?哦对,老张,第三遍说“押一付三太贵”,声音大得我怀疑他手机漏音。咖啡机坏了仨礼拜,现在全组用保温杯接热水泡速溶,上周三我还看见小陈拿茶包当滤纸塞进杯口——反正都一样苦。


  去年十月份,接口超时告警那一刻,我在adb devices里敲了第七遍sudo adb kill-server && sudo adb start-server,手抖把sudo打成sudu,终端回显bash: sudu: command not found,我盯着看了三秒才反应过来不是环境问题,是我脑子先挂了。我原以为是Android Studio的SDK路径配错了,结果翻了半小时local.properties,发现它压根没读这个文件——Studio自己在~/.android/avd下硬编码了platform-tools路径,而我的brew装的platform-tools版本和它内置校验规则对不上。你猜怎么着?它不报错,就静默降级成旧版adb,连设备都认不全,debug端口死活bind不上。这玩意儿连个WARN都不打,纯靠你盯着logcat最后一行发呆。


  监控大盘上那条绿色的线一直在抖,不是CPU,是USB枚举状态——亮两秒灭一秒,像ICU监护仪。运维小王来过两次,第一次说“你重启宿主”,第二次说“你重装udev规则”,第三次我没让他进门,直接把usbmuxd进程kill -9了,反而好了十分钟。真奇怪,它居然能活这么久。


  所以三步?第一步,adb version和which adb必须指向同一路径,别信$PATH里排第一的那个,去ls -l `which adb`,再ls -l ~/Library/Android/sdk/platform-tools/adb,两个md5sum不等?删掉sdk里的,只留brew装的——但别删错,我上次误删了sdk的adb,Android Studio弹窗说“platform-tools missing”,我点“Download”它又偷偷下回来一个带bug的旧版,卡在92%不动,后台curl -v一看,连的是https://dl.google.com/android/repository/platform-tools_r34.0.4-darwin.zip……名字都写死了,它不认新版本。


  第二步,看dmesg | tail -20,不看logcat。你调试连不上?先看内核有没有打印usb 1-1.2: new high-speed USB device,没有?物理层就断了。有?继续看有没有类似usbcore: registered new interface driver usbserial_generic这种,没有?那udev规则没生效,别碰Android Studio,去改/etc/udev/rules.d/51-android.rules——等等,Unix下哪来的udev?MacOS是launchd,Linux才是udev,我记混了,去年十月份那次是Linux虚拟机,对,当时我们搭的是Ubuntu 20.04 Docker Host,里面跑的Android模拟器……算了,反正你现在连不上,八成是host kernel没加载cdc_acm或者usbserial模块,modprobe cdc_acm && lsmod | grep cdc,没有就编译进内核——当然没人真干这个,我们都选第三步:换线。就换那个USB-C线,不是数据线,是带“充电+数据”标贴的那根,去年双十一蹲点抢的,抽屉第三格。另一根银色的细线,插上去dmesg显示usb 1-1.2: device descriptor read/64, error -71,-71就是protocol error,线废了,但它还能给手机充电,骗人。


  机箱嗡嗡响,我低头一看,主机侧面板没扣严,风扇直吹硬盘托架,震得SSD灯频闪。小陈路过顺手帮我按实了,嗡声小了,adb倒是更卡了——后来发现他按的时候压住了前置USB口的金属卡扣,导致供电不足,设备枚举失败。这事儿没法写进文档,文档里只写“请检查USB连接”,谁会想到要检查机箱面板的机械公差?


  优胜劣汰嘛。不是人淘汰人,是工具链自己咬自己。ADB、adb server、Android Studio、SDK Manager、udev、kernel module、USB协议栈、Type-C线缆的PD协商芯片……十五年下来,每轮升级都扔掉一批兼容组合,剩下来的不是因为好,是因为没被下一轮升级打死。我去年删掉的三个.sh脚本,每个都解决过某个安卓调试问题,现在全失效了——其中一个用expect自动输入密码,另一个绕过selinux用setenforce 0,第三个……忘了,只记得它会在/tmp下生成一堆带pid的临时符号链接,最后rm -rf /tmp/adb_的时候误删过一次Jenkins workspace的.git目录。


  外卖筷子掉在地上,我捡起来擦了擦继续用,反正面也吃了。隔壁前端问过我一次adb reverse的问题,我说你别reverse,你用ngrok。他说ngrok要公网IP。我说你让产品加个按钮,“手动触发调试代理”,他笑了,说这需求PM不敢提,怕测试当场拔网线。


文章配图,仅供参考

  历史代码与祖传逻辑……我电脑桌面有个叫legacy-adb-fix的文件夹,2017年建的,里面有七个子文件夹,按年份命名,最后一个停在2021。每个文件夹里都有同名的fix.sh,内容都不一样。2021那个最短,只有两行:#!/bin/bash && echo 'use AS 2021.3.1 or later'。底下没注释,没作者,没时间戳。我把它改成了README.md,写了一句:“此脚本已失效,但保留因恐惧。”


  我现在debug Android不开了,打开Terminal,就输adb shell ps | grep u0_a,再ps aux | grep -i android,对比PID是否一致。一致?说明ADB通信通;不一致?说明adb server和device中间隔了个代理或防火墙——但这种情况极少,绝大多数时候,就是线的问题。线换了还不行?那大概率是你手机开发者选项里,“USB调试”开关旁边那个“USB调试(安全设置)”的小勾没点,系统没弹窗让你授权,它就在后台哑着,连dmesg都安静如鸡。


  明天?我打算把USB线统一换成雷电4转USB-A的主动式转接头,听说能绕过一部分协议协商乱码。不过先得问采购,他们上月订的那批雷电线,外包装印着“Intel Certified”,拆开发现芯片型号是GL3523,国产的……算了,先用着吧,反正现在连得上。

(编辑:站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!