加入收藏 | 设为首页 | 会员中心 | 我要投稿 站长网 (https://www.0472zz.com/)- 云渲染、网络安全、终端安全、数据治理、智能机器人!
当前位置: 首页 > 服务器 > 搭建环境 > Unix > 正文

Unix下Android调试卡壳?三步定位环境配置顽疾

发布时间:2026-10-29 08:08:30 所属栏目:Unix 来源:DaWei
导读:  去年十二月份,我蹲在西楼B3机房第三排靠窗那个工位,雨刮器卡在四十五度角不动了,外面下的是冻雨,玻璃上挂的不是水是薄冰。陈默端着枸杞茶路过,把保温杯搁我键盘右边——杯底压住了一小片没撕干净的ADB调试日志贴纸。

  去年十二月份,我蹲在西楼B3机房第三排靠窗那个工位,雨刮器卡在四十五度角不动了,外面下的是冻雨,玻璃上挂的不是水是薄冰。陈默端着枸杞茶路过,把保温杯搁我键盘右边——杯底压住了一小片没撕干净的ADB调试日志贴纸。他接了个电话,听筒里传来“…adb devices 返回空…真就空…”然后他拇指摁着话筒说了句“你先别连WiFi调试”,转身时把桌上那盒冷掉的黄焖鸡外卖碰歪了,汤汁渗进USB-C线接口缝里。


  我原以为又是adb server崩了,kill -9 那套拳打完再 start-server,结果设备照样不冒泡。所以我就把 ~/.android/adbkey 删了重生成,手抖多按了一次回车,它自动生成了个带换行符的私钥——那个换行符卡在 key 的第十八秒,每次 adb connect 一到认证环节就卡住,但 adb devices 居然还显示在线,像个幽灵账户。这个我敢打包票:不是权限问题,不是udev规则,就是那根换行符在握手阶段把RSA签名塞歪了。后来查logcat里有一行 debug-level 的 crypto warning 被默认过滤掉了,得加 -v -v -v 才能翻出来,可谁会三级加v去查一个“连不上”的问题?


  但问题不在key。三天后李哲扛着她那台改装过的Mac Mini来串门,说她Ubuntu子系统跑Android模拟器稳如泰山——我让她现场连我宿主机的真机,她输完命令,屏幕闪了两下,设备名直接蹦出来了。我盯着她敲的那行命令看了十七秒:adb -H 127.0.0.1 -P 5037 devices。对,她加了-H和-P。我从来只认localhost,而我的/etc/hosts里,localhost那一行被上个月部署K8s时顺手注释了,后面还留着个# dev env only。没人动它,但它就在那儿,静默失效。这不算bug,是配置熵增——优胜劣汰嘛,留下的都是懒得查hostfile的人。


  说到优胜劣汰,上周五运维组推了个新镜像,base image切到Debian 12,顺手把systemd-resolved开了。我机器上刚好装着dnsmasq做本地DNS缓存,两个服务在53端口掐起来,谁也不让谁。adb connect 本来要走mdns找adbd的端口,结果查A记录查到一半被中断,返回超时——但adb logcat 还能通,因为logcat走的是socket直连,不走DNS。这就造成一种幻觉:设备“半在线”。张磊在隔壁喊我帮忙看他的CI流水线,我抬头看见他显示器右下角托盘里有个小图标在闪,是VS Code Remote-SSH插件的重连提示,他根本没注意到自己的adb也挂了。他点开终端时,手指习惯性先敲了三下Ctrl+C,键盘敲出嗒、嗒、嗒,很清脆。我没拦他。


  其实最坑的是SDK路径里的空格。我们组老王,永远在/home/wang/my\\ android\\ sdk/底下放东西。他改bashrc的时候用双引号包住PATH,但脚本里调用sdkmanager --list又没包,等真正执行find . -name "adb" 的时候,grep出来的路径断成两截,adb binary根本没进PATH生效范围。他自己试过二十遍,每次都手动cd进去再./adb,所以觉得“绝对路径能跑就没问题”。结果昨天CI跑gradle assembleDebug,里面嵌的build-tools调用adb install时直接抛FileNotFound——报错堆栈第二十三行才提到PATH,前面二十二行全是Kotlin编译器的警告。我扫了一眼就说:“删掉你的空格。”他愣了三秒,反问我:“…空格还能影响环境变量?”我说:“能,只要它在路径里,且你没用引号围住整个赋值语句,还能比‘找不到adb’更准地指向病因。”他低头改的时候,左手无名指在桌面轻轻敲了两下,像摩斯电码,但我没破译。


  那天晚上我关掉所有终端,重新起一个bash,source /etc/profile,然后只输入一行:which adb。返回空。我坐那儿盯着光标闪了三百七十二下,突然想起前年修一个ARM64交叉编译链,也是这种“which有但实际调不了”的鬼相——最后发现是/lib64/ld-linux-aarch64.so.1 权限被误设成600,root能跑,普通用户加载动态链接器失败,但报错全吞在execve底层,只扔个exit code 127。这种事没法靠文档预判,只能靠手抖重启进程时,瞥见strace -f bash -c 'adb version' 输出里一闪而过的openat(AT_FDCWD, "/lib64/ld-linux-aarch64.so.1", O_RDONLY|O_CLOEXEC) = -1 EACCES (Permission denied)。


文章配图,仅供参考

  我现在不急着修了。抽屉里还有半包没开封的降噪耳塞,戴一只,听机房空调低频嗡鸣声忽然变清晰。刚才李哲发来消息,说她那边CI新增了个pre-adb-check脚本,检查adb server状态、DNS解析能力、以及~/.android目录下key文件格式合法性。脚本本身写得挺糙,用grep -q "^-----BEGIN RSA PRIVATE KEY-----" 比对,连-----END那行都不校验。但她说:“至少跑起来不黑屏。”我想回她一句“那你试试把key末尾加个\
呢”,又算了。这事得自己踩过才算数。


  桌上的黄焖鸡外卖已经凝成一块琥珀色膏体,枸杞沉在底部,像几粒微型陨石。我把它推到左上角,给terminal腾出两行空白。接下来我要试一件事:把adb server启动时的日志等级临时改成DEBUG,不是靠adb kill-server && adb -d start-server那种,是改$ANDROID_HOME/platform-tools/adb源码里的adb_log_level宏,然后重编。不为解决问题——为确认那根换行符到底是不是从libcrypto.so进来的。这事明天干。今天先撤。

(编辑:站长网)

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