加入收藏 | 设为首页 | 会员中心 | 我要投稿 站长网 (https://www.0577zz.cn/)- 应用程序、AI行业应用、CDN、低代码、区块链!
当前位置: 首页 > 服务器 > 搭建环境 > Unix > 正文

Unix下Android调试卡壳?三步揪出90%环境顽疾

发布时间:2026-11-03 08:10:53 所属栏目:Unix 来源:DaWei
导读:  跟产品吵完第三轮灰度开关没推完,我盯着adb logcat那行“waiting for device”发了十八秒呆——不是卡在USB协议栈,是卡在我自己太阳穴里。2026年8月那个周四,PM说“这功能明天必须上线”,我点头点得比ADB重连还快,结

  跟产品吵完第三轮灰度开关没推完,我盯着adb logcat那行“waiting for device”发了十八秒呆——不是卡在USB协议栈,是卡在我自己太阳穴里。2026年8月那个周四,PM说“这功能明天必须上线”,我点头点得比ADB重连还快,结果设备列表里连个0123456789都飘不起来。真不是线程阻塞,是整个Unix层把Android调试当成了过期JDK路径。


  先扔结论:三步,udev规则没reload、adb server没杀干净、$ANDROID_HOME/bin不在PATH前半截——就这仨,九成五的“设备离线”直接跪着认爹。我敢打包票,udev那条SYMLINK+="android_adb"写对了但没sudo udevadm control --reload-rules?等于给USB口贴了张封条。上周三前端蹲我工位旁看我敲sudo udevadm trigger,他顺手倒了杯水,纸杯上印的logo是歪的,咖啡渍已经干成褐色环——他问我“这算修好了吗”,我说“不算,等它自己抖一下”。十秒后adb devices真出了一行serialno,他端着杯子走了,水晃出来两滴,没擦。


文章配图,仅供参考

  第二步是杀adb server。不是killall adb,是ps aux | grep adb | grep -v grep | awk '{print $2}' | xargs kill -9,再加sleep 0.3——少这三百毫秒,socket文件锁还在占着/dev/usb/。我原以为只要adb kill-server就完事,结果发现Mac上launchd会自动拉起/usr/local/bin/adb(Homebrew装的),而我$PATH里排第三的是sdk/platform-tools/adb——它根本不会被调用。测试那边发来截图,设备列表空着,底下小字写着“device unauthorized”,我回她:“你手机USB调试开了吗?”她说开了,“那你把‘始终允许’点一下。”她回了个“?”,三分钟后钉钉弹窗——“已授权”。监控大屏上右下角一个无关的GPU频率曲线忽然抖了一下,幅度不大,就是往下栽了四格,没人管它。


  第三步最贱:检查$ANDROID_HOME/bin是否在PATH最前面。不是检查有没有,是检查有没有被其他路径吞掉。比如某次CI流水线偷偷export PATH="/usr/local/maven/bin:$PATH",结果maven里有个叫adb的shell脚本——它不报错,只返回usage。这种坑我踩过两次,第二次是运维推了个新基线镜像,里面PATH里头多了/opt/xxx/,而/opt/xxx/底下那个adb二进制链接指向了三年前编译的旧版libusb.so.1。这个我说不准是不是他们故意留的,反正debug时strace -e trace=openat adb devices,看到它openat(AT_FDCWD, "/opt/xxx/libusb.so.1", O_RDONLY|O_CLOEXEC)失败,然后静默退出——不是崩溃,是礼貌性消失。PM后来问我“为啥开发机好使线上崩”,我没答,因为答案要扯到glibc版本和libusb的ABI兼容性,这已经超出我们该吵的范畴了。


  说到吵……昨天下午又跟DBA在钉钉群里互发日志片段,他甩给我一行show processlist里的State=Sending data,我回他adb logcat | grep SQLiteOpenHelper,他回我一句“你那是终端,不是数据库”,我回“你那是MySQL,不是/system/bin/sh”,最后他发了个“……”,我发了个“:)”,群里安静了十七分钟。没人提灰度没推完这事,但灰度开关图标在后台管理页还是灰的,像一块结痂的旧伤疤。我现在连oncall手机震了一下都不看——上周五夜里三点,它震了,我摸黑点开一看是“adb connection lost”,顺手关了静音,接着睡。醒来发现充电器没插稳,手机只剩百分之十二,桌面壁纸刚好是去年去苏州出差拍的拙政园池子,倒影糊成一片青灰。


  还有个细节懒得写了:某次adb push失败,提示“no space left on device”,df -h显示/data分区确实满了,但/data/data/包名下面全是logcat dump出来的十六进制残片,每个几兆,生成时间戳精确到毫秒,像是调试过程中某个断点触发了无限dump——但这事跟udev、server、PATH都没关系,属于另一套崩溃逻辑。我删了三次,它又长出来,最后改了app的BuildConfig.DEBUG为false才停。现在想想,可能早该关掉LogcatBuffer的RING_BUFFER模式,但它默认开着,就像默认开着USB调试一样,没人觉得需要关。KPI里这条没写进去,但上季度OKR里有一条“降低环境误报率”,当时我就想笑,误报?那都是真故障,只是没配对上正确的根因罢了。


  所以你现在遇到设备列不出来——别急着重装SDK,先敲三条命令:sudo udevadm control --reload-rules && sudo udevadm trigger;killall -9 adb && sleep 0.3 && adb start-server;echo $PATH | tr ':' '\
' | head -10 | grep -E "(android|platform-tools)"。要是还不行……要么换根线,要么换个人,要么换份工作。我不打算试第四步,第四步通常得查kernel dmesg里usbcore那堆unrecognized descriptor——那已经不是调试卡壳了,是USB协议栈在朝你挥手告别。我现在手里正拿着刚收到的树莓派Pico W,琢磨怎么用它模拟一个假adb daemon骗过ide。水杯还放在左边,logo朝上,但杯底有圈浅浅的指印,不知道是谁留的。

(编辑:站长网)

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