加入收藏 | 设为首页 | 会员中心 | 我要投稿 站长网 (https://www.0722zz.cn/)- 数据可视化、数据开发、智能机器人、智能内容、图像分析!
当前位置: 首页 > 服务器 > 搭建环境 > Unix > 正文

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

发布时间:2026-11-02 14:27:23 所属栏目:Unix 来源:DaWei
导读:  去年秋天,adb devices挂了十二小时,我蹲在MacBook Air的Touch Bar上搓热了三根手指——不是在敲命令,是在给USB-C口哈气。同事老陈打来电话说“你那边AOSP的init.rc是不是又改过preinit?”我回他“没动,但/dev/usb/1-1

  去年秋天,adb devices挂了十二小时,我蹲在MacBook Air的Touch Bar上搓热了三根手指——不是在敲命令,是在给USB-C口哈气。同事老陈打来电话说“你那边AOSP的init.rc是不是又改过preinit?”我回他“没动,但/dev/usb/1-1.2的权限昨晚自己变过”,他笑了一声挂了,我盯着终端里那个反复闪退的adb server进程,像看前任朋友圈三天可见。


  第一步:查udev规则?别扯了。Linux下你grep -r "android" /etc/udev/rules.d/,十条里九条是抄的2013年博客,剩下一条是你自己半年前加的,带注释“# 修xiaomi8的vid=0x2717 pid=0x0682”,可现在连三星S22都不认了。我原以为是rules文件顺序问题,结果把99-android.rules挪到00-android.rules前面,重启udev,adb devices依旧空——而就在同一秒,后台监控曲线里那个“adbd启动失败计数器”跳了十八秒才刷出新值。站长平台里存着张截图,是六月七号凌晨三点十七分截的,图上adb kill-server之后logcat没吐任何error,就一行“adbd: started”,然后静音。这图我存了半年,没删,也没用。


  第二步:杀adbd、删$HOME/.android/adbkey,再手动生成一对——这个我敢打包票,密钥长度非2048不行,OpenSSL生成时少敲一个-nopass会卡在readpassphrase,但更常踩的是你压根没清掉Android Studio底下那几个隐藏的adb实例,它们锁着5037端口死不撒手。我在~/.zshrc里加了个alias adb='lsof -i :5037 | grep LISTEN | awk "{print \\$2}" | xargs kill -9; command adb',跑了一周,结果周三早上发现Studio自带的Gradle Daemon又偷偷拉起了个adbd子进程,PID还比我的alias快0.3秒抢占端口。竞对站又改了标题,从《adb调试终极指南》改成《adb调试:别碰它》,点进去首页第一行写着:“请确认你手机没连充电宝”。


  第三步:检查SELinux?不,先摸USB线。别笑,真有人用Type-C线当数据线使了三年,中间接了七次雷电坞,插拔次数我数过——三百七十二。线芯氧化后电阻突变,手机进fastboot时电压跌到3.1V,adbd根本起不来,log里连ERROR都懒得打,就丢一句“waiting for device”,等你骂完祖宗八代再补个“offline”。上周五我换了根新的线,手机亮屏瞬间adb devices就列出来了,旁边工位的小林看见我拍桌狂笑,她正用同一台Mac调试Pixel 7,连着同款Hub,她那根线是上个月新拆封的,标着“支持480Mbps高速同步”,结果adb shell ls /proc/ > /dev/null 就timeout。我俩对着两台设备发呆,凉掉的茶还在她左手边杯垫上印着半个指纹。


  我说优胜劣汰站得住,是因为Unix生态里没有“兼容性声明”,只有“活下来的路径”。你写个udev规则能扛过三个内核升级、两次distro major bump、一次Android版本大跳,那规则就是对的;不是语法对,是运气够硬。有些规则在Debian测试源里跑通,在CentOS Stream里跪,在NixOS里连编译都过不去——但它活着,所以它有理。我信这个,不信文档里写的“推荐配置”。就像上周四我们组复盘,运维小吴甩出一段systemd unit文件,说“这个能自启adbd”,我没问原理,只试了三遍:插线→亮屏→adb shell,全过。他说“要不要加FallbackToLegacyUdev=yes”,我摇头,说“先上线,等它自己崩。”


  其实那天下午我本来要去趟医院,体检报告单在背包侧袋里折了三道,上面写着“中度脂肪肝”,但一进门就看到ADB日志里冒出个没见过的tag:[adbd][epoll] accept() failed: Invalid argument。搜不到这条,Gerrit里也没提过。我翻了十六页AOSP提交记录,最后停在platform/system/core commit d4e5e2a,作者署名是Google某位工程师,日期是前年十一月,描述栏写着“Fix epoll edge case on legacy kernel”。可我们线上机器用的是5.15。我就坐那儿,一边喝凉透的茶,一边把那行log复制进内部wiki页面,新建条目,标题是“epoll invalid arg — not our bug, but still blocks us”,然后点了保存。下面没人跟帖。


文章配图,仅供参考

  现在我桌上摆着四根线:白色一根(戴尔原装)、黑色一根(小米众筹款)、灰色一根(焊过接口)、还有一根透明硅胶的,买的时候包装盒上印着“支持PD3.0+USB3.1 Gen2”,实际测速只有42MB/s。每次adb devices卡住,我都先换线,而不是查kernel log。这个习惯是去年秋天养成的——不是因为科学,是因为老陈有次在机房角落指着墙角堆着的二十几根废弃线缆说:“它们都曾被认定为‘正常’。”


  下周一,我打算把所有macOS上的Android SDK目录全删了,重装Command Line Tools,然后只用adb和fastboot两个二进制,其他全扔。不为别的,就为看看有没有人会在群里问“build-tools里的aapt2怎么突然没了”,如果真有人问,我就截图发过去,附一行字:“你猜,它是被哪个进程删的?”

(编辑:站长网)

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