Unix下Android调试卡壳?三步揪出90%环境顽疾
|
跟产品吵完第三轮灰度开关没推完,我盯着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 ':' '\ (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


嵌入式Linux开发者Unix环境搭建避坑指南
Linux运维老手也常踩的5个Unix环境搭建陷阱
Unix调试总卡壳?5个隐性陷阱90% DBA都踩过
Unix高效包管理:DBA眼中的创业者技术刚需