Unix下Android调试卡壳?三步定位90%环境顽疾
|
我越来越觉得“Unix下Android调试卡壳?三步定位90%环境顽疾”是错的。 不是步骤不对,是它压根没资格叫“定位”——去年十月份在西溪园区B3楼那个下午,我盯着adb devices输出空行看了四十七分钟,连热咖啡都凉透了,最后发现是udev规则里把0x18d1写成0x18d2,就差一位十六进制数。你猜那“三步”里哪一步教你看hexdump -C /sys/bus/usb/devices//idVendor?没有。它连/dev目录都懒得提。 我原以为装好sdk、配好JAVA_HOME、跑通adb devices就万事大吉,结果在Arch上搭NDK交叉编译链时,clang++ -target aarch64-linux-android21报错说找不到libstdc++.so.6,可ldconfig -p | grep stdc明明列了十七个站。查到第三天凌晨两点,同事李锐甩给我一行:echo $ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/lib64/clang//lib/linux/aarch64/libc++_shared.so —— 他手敲的路径里有三个星号,我复制粘贴时漏掉了中间那个。就这一个字符,卡了三天半。 主流说法总爱把问题切成“权限—路径—端口”三层蛋糕。可你试试在FreeBSD 13上用Android Studio跑emulator,它根本起不来,log里满屏ioctl: Invalid argument,但adb shell照连。这时候权限?路径?端口?全对。真正问题是QEMU_KVM不支持FreeBSD的bhyve宿主机抽象层——这事连Android官方文档都没提过,更别说“三步”了。我翻了二十八页GitHub issue,直到看到@kstevens在2021年7月14日留的那句:“Don’t use -accel kvm on BSD.” 才把-accel hvf硬塞进launch flags。 再说回那个udev规则。我把0x18d1改成0x18d2之后,adb devices立刻出了设备号,但logcat死活不吐日志。又折腾两小时,发现是systemd-udevd缓存了旧规则,得systemctl restart systemd-udevd,不是reload。这个restart命令,三步里第几步写的?它没写。它只说“重载规则”,还加粗了“sudo udevadm control --reload-rules”。呵。 还有一次更离谱:某次在OpenSUSE Tumbleweed上,AS提示“Waiting for target device…” 持续十三分钟,strace -e trace=connect,bind adb -s emulator-5554 logcat 显示反复connect(2)失败。tcpdump抓包发现它往127.0.0.1:5037连,但实际adb server监听的是::1:5037。IPv6优先级太高,而/etc/hosts里127.0.0.1 localhost那行被注释掉了——上周运维批量更新配置时加的#。谁的锅?谁都不是。可这破事,“三步”敢算进那90%里? 去年十月份那个下午,我蹲在机房空调出风口底下,拿手机拍了三次adb kill-server和start-server的终端窗口,照片现在还在微信收藏夹里:第一张里我手背上有蓝墨水,第二张右下角时间戳是16:03,第三张终端背景色从深灰变成了青灰——那是我终于想起改了TERM=xterm-256color后重新开的tab。这些细节跟定位有什么关系?没关系。但它们真实得硌牙。 王工那天路过,叼着半截烟问:“试过换USB口没?”我点点头,他接着说:“那换线。”我没吭声。二十分钟后他回来递了根新线,我插上,adb devices亮了。他捻灭烟头说:“华为Mate40Pro的C口协议太挑,你们测安卓12时用的Type-C转Micro-B那根线,里面没Vbus检测电阻。”——就为这事,我们后来在实验室锁了三台同型号手机专做USB枚举对比,拍了七百多帧USB描述符dump。三步里哪步让你dump descripter? 所以我说它站得住的地方只剩“优胜劣汰”。真能靠三步搞定的,早被筛出去了;剩下卡在第五步、第七步、凌晨三点对着dmesg里usb 1-1.2: new high-speed USB device number 47 using xhci_hcd发呆的,才是常态。这玩意儿本质是场耐力赛,不是解谜游戏。你指望三步?不如指望adb shell su -c 'setprop sys.usb.config adb,mtp'之后手机屏幕自动弹出授权对话框——它不弹。它就在那儿,黑着,像在嘲笑所有“标准化流程”。
文章配图,仅供参考 对了,上个月在RISC-V开发板上跑Android用户空间调试器,gdbserver启动正常,但target remote :5039连不上,netstat -tuln显示5039端口没监听。strace发现它open("/proc/self/status", O_RDONLY)后read()返回EACCES,但权限明明是644。最后发现是selinux policy模块里default_type android_shell_domain里的allow android_shell_domain self:process ptrace; 这条缺了——因为RISC-V版本没合入上游五月补丁。这事我也可能就运气好,没掉进同一个坑里第二次。所以别信什么三步。信你自己眼睛盯住dmesg输出的第一个usb字样;信你按住Ctrl+C再Ctrl+V那三遍的udev规则;信王工递来的那根带屏蔽层的USB线比文档管用。别的,都是幻觉。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


Linux老手也常踩的5个Unix环境搭建坑
嵌入式Linux开发者Unix环境搭建避坑指南
Unix调试总卡壳?5个分布式隐性陷阱
Unix包管理:创业者必学的高效技术运维技能