Unix下Android调试卡壳?三步揪出环境配置顽疾
|
凌晨告警,adb devices 返回空行——我盯着终端里那个空荡荡的回车,像盯着老板上周拒掉的调休申请。DBA老陈端着搪瓷缸路过,缸沿磕在机柜边沿,“铛”一声,我手抖了一下,把刚输到一半的 export ANDROID_HOME=/usr/local/share/android-sdk 删掉了。冷气从地板缝往上钻,后颈那块儿全是汗,空调嗡的一声压过所有念头。 第一步,看 udev 规则:/etc/udev/rules.d/51-android.rules 这个文件我敢打包票它存在、权限对、group 也加了,去年夏天我们改过三遍,第三遍是我亲手把 MODE="0664" 改成 MODE="0666" ——结果发现是 vendor id 写反了。不是写错,是把 0x18d1(Google)抄成了 0x18d2,多了一个2。这玩意儿查日志不报错,只在 dmesg 里埋一句 "usb 1-2: Product: Android" 后面跟着十六进制的乱码。我原以为是 adb server 没起来,结果杀掉再起,它连 USB 设备都“看不见”,纯粹是内核层就拒收。后端小王凑过来瞄了一眼,顺手把拖鞋换成了蓝色的,鞋帮上还沾着半片茶叶渣。 第二步,查 adb server 端口。netstat -tuln | grep :5037 必须跑出来,但你猜怎么着?它跑出来了,PID 是 1289,ps aux | grep 1289 却找不到进程——因为那是 systemd 的 fork 僵尸残留,真进程早被 kill -9 过三次了。我重新 start adb server,没报错,adb devices 依然空。这时候对面工位的手机响了一声,没人接,铃声是《卡农》钢琴版前四秒,戛然而止。我把 ~/.android/adbkey 删除重生成,又清了 ~/.android/adbkey.pub,adb kill-server;adb start-server;adb devices ——还是空。直到我翻出 /tmp/adb.log(这个 log 默认不生成,得自己设 ANDROID_LOG_TAGS=:S adb:S),看见一行:failed to read boot_id, errno: No such file or directory。boot_id?Linux kernel 4.18+ 才有这个接口,我们测试机是 4.15。我原以为是 SDK 版本问题,结果是 kernel 太老,adb server 自己跪了,还跪得悄无声息。 优胜劣汰——这个词我去年夏天在复盘会上说漏嘴了,老板当时抬眼看了我两秒,没接。后来我明白,不是他没听懂,是他听懂了才没接。Unix 下调试 Android 卡壳,根本不是技术问题,是生态筛选器:它用零反馈、伪成功、文档缺失和随机时序,在两周内自然淘汰掉不敢翻 dmesg、不习惯查 /proc/sys/kernel/ 目录结构、不会手动 patch adb 源码的人。留下来的,要么把 adb 调试链路刻进肌肉记忆,要么已经退守 Flutter Web 了。我不算前者,但我见过前者——DBA老陈去年在机房用一台装 Slackware 的旧 ThinkPad X220 接 Nexus 5X,硬是把 udev 规则拆成七段,每段单独 test,最后一行是 SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0666", GROUP="plugdev", SYMLINK+="android%n"。SYMLINK 那个部分,他加了三周才确定要不要。我问他图啥,他灌了一口茶,没答,只听见空调嗡的一声。 第三步,最糙:拔线重插,但插之前,先 touch /sys/bus/usb/devices//authorized,全设成 0 再设回 1。这不是正经解法,是急诊室切气管——快、野、见效。某次我们三台设备一起连不上,adb devices 显示两台 online 一台 unauthorized,unauthorized 那台在 adb logcat 里狂刷 “connection closed” ,却连 ADB_AUTH_TOKEN 都没吐出来。后来发现,它 USB 接口供电不足,Type-C 口松动,拔插十三次之后,第十一次插到底,手机亮屏弹出“允许 USB 调试吗”,我才反应过来:它一直没触发授权 UI,因为 D+ D- 电平跳变被干扰了十七毫秒,刚好卡在 ADB auth handshake 第二帧。这事我没写进报告,只记在便签纸上,现在还粘在显示器右下角,边缘卷起来了。 值班表下周起换三班倒,我排到周三晚八点到周四早八点,中间四小时自由活动时间。前天申请调休补昨天夜班,HR 系统驳回理由写着“连续夜班超限”,可我翻日历,上个夜班是十八天前。咖啡洒在工牌上了,褐色圆斑盖住了姓名栏左边那个“程”字,只剩“工号:CD-047”,底下还有一道指甲刮痕,是上次撕旧贴纸留下的。我懒得重领,反正门禁刷得到。
文章配图,仅供参考 所以现在?别碰 sdkmanager update。别信官网下载页写的“即装即用”。别信你自己记得的 PATH。先把 /usr/bin/adb 和 $ANDROID_HOME/platform-tools/adb md5sum 对一遍——去年夏天我干过这个,两个哈希值差三位,是公司内网镜像源同步断了一次,漏传了 patch。这件事我说不准是不是普遍,但至少在我手上的三台 macOS 机器、五台 Ubuntu 20.04 和一台 Arch Linux 上,它都发生过。你要做的是,此刻,马上,拔掉设备,sudo udevadm control --reload-rules && sudo udevadm trigger,然后一边等它跑完,一边把刚才那段 dmesg 截图发给 DBA老陈——别问为什么,他正在修数据库慢查询,手机静音,但他看到截图会回你一个表情:????。(编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


Unix调试总卡壳?19年老司机揭秘5大隐性陷阱
Linux运维老手也常踩的5个Unix环境搭建坑
嵌入式Linux开发者Unix环境搭建避坑指南
Unix高效包管理:创业者必备的云时代技术基石