Unix下Android调试卡壳?三步揪出环境配置顽疾
|
去年双十一,我蹲在IDC三号机房调试一套风控沙箱的Android模拟器集群——就是那种往Unix宿主里塞一堆adb、fastboot、aapt2的链式环境。邵哥你记得不?就是那个总把adb server pid硬写进systemd service里还加ExecStartPre=‘kill -9 $(cat /tmp/adb.pid)’的脚本。结果那天凌晨两点十七分,adb devices死活吐不出设备列表,只回一行“List of devices attached”,下面空得能养金鱼。 我原以为是udev规则没reload,结果发现/dev/ttyUSB0权限明明是0666,连上串口线后dmesg里却连usbserial probe log都没有——连芯片型号都没吐出来。隔壁老张端着泡面路过,说“你那root hub是不是被iptables SNAT了?”我说胡扯,这又不是网络栈。他扒拉我键盘敲了句lsusb -t,我盯着那树形输出看了十八秒,突然发现USB2.0 root hub下面挂的居然是xHCI控制器的二级hub,而我的RK3399板子报的是EHCI——根本对不上号。雨下得挺大,机柜顶上的冷凝水正一滴一滴砸在UPS蜂鸣器上,叮、叮、叮,跟敲代码时的tab键节奏一样烦人。
文章配图,仅供参考 第一步:别碰adb kill-server。直接删掉$HOME/.android/adb_key和adb_key.pub,再touch ~/.android/adb_key && chmod 600 ~/.android/adb_key,完事重启adbd。为啥?因为adb密钥协商失败时根本不会报错,就安静地卡在auth handshake里——就像你给风控平台发了个没签名的JWT,它连401都懒得回,就当空气。这个我敢打包票,去年Q3所有沙箱镜像build日志里都出现过同一段openssl rsautl -sign -inkey失败但stderr全被>/dev/null吞掉的痕迹。 第二步:别信which adb。真·adb binary在/usr/lib/android-sdk/platform-tools/里,而PATH里那个其实是/usr/bin/adb——是Debian包带的wrapper脚本,会自动找sdk路径,但一旦你装过两个版本sdk(比如用sdkmanager装了cmdline-tools 12.0,又手动解压过android-ndk-r25c),它就在PATH里绕圈子找依赖,最后去加载一个不存在的libstdc++.so.6.0.30。那天下午三点四十二分,小陈进来问要不要重启服务器,我手还没抬起来,他裤兜里的手机响了,是微信语音,声音特别小:“喂?…嗯…adb logcat没响应是吧?…你试过strace -e trace=openat,connect,write adb logcat吗?”我没回他,因为我正在看strace输出里第十七次openat(AT_FDCWD, "/usr/lib/android-sdk/platform-tools/lib64/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT。 第三步:砍掉所有alias。尤其是alias adb='adb -P 5037'这种——你以为指定端口稳了,其实adb server启动时会默认绑定0.0.0.0:5037,而你的宿主机防火墙rule里有一条ACCEPT udp dpt:5037,可adb走的是TCP。上周五我们线上那个WAF误拦真用户的事你记得不?也是类似毛病,规则写了allow,但底层netfilter conntrack表里状态是INVALID,只是iptables -L没显示而已。运维王姐接电话时说了句“客户说验证码弹窗点了三次才出”,然后把半块没吃完的蛋黄酥搁在工位显示器边框上,油渍渗进屏幕黑边缝里,现在还留着印。 说到底这不是安卓的事。是Unix环境下,环境变量污染、动态链接劫持、socket bind冲突、udev设备节点权限覆盖——这些玩意儿根本没谁给你做原子事务,全靠人肉顺序凑。优胜劣汰?淘汰的从来不是配置错误,是那个没检查strace输出最后一行的人。我前天翻到2025年6月的测试记录,当时用的是Linux 6.1.88内核+android-14_r2sdk,其中platform-tools是r34.0.5,但adb_server_binary_hash居然和r33.0.3的一模一样——md5sum对得上。说明有人偷偷打了补丁没改version string。这个我说不准,但logcat -b events | grep am_activity_launch_time确实多了一列ns精度的时间戳,不像官方编译的。 昨天中午吃饭,李工坐我对面撕开自热米饭包装袋,铝箔层撕裂声特别尖。他说:“你那套adb auto-restart的systemd timer跑得比我媳妇的闹钟还准。”我没接话,筷子夹起一块胡萝卜,发现上面沾了点辣椒油。后来他手机又响了,这次是风控中台告警:某渠道App的SDK心跳上报频率突增三百七十二倍。我一边嚼胡萝卜一边想,说不定也是哪台宿主机上,某个没人维护的adb daemon还在用root权限绑着5037端口,死循环accept()——只是没人去netstat -tulnp | grep :5037罢了。 我现在把所有adb命令前面都加sudo timeout 15 sh -c 'adb $0 $@',后面接具体子命令。管不管用?不知道。但至少下次值班的时候,我不用再蹲在地上听UPS蜂鸣器和冷凝水的合奏了。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


Unix调试总卡壳?5个隐性陷阱90%站长都踩过
Linux运维老手也常踩的5个Unix环境搭建坑
Linux新手避坑指南:9年架构师亲授一站式环境配置
Unix包管理:零基础创业者的高效技术入门