加入收藏 | 设为首页 | 会员中心 | 我要投稿 站长网 (https://www.0313zz.cn/)- AI硬件、数据采集、AI开发硬件、建站、智能营销!
当前位置: 首页 > 服务器 > 搭建环境 > Unix > 正文

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

发布时间:2026-11-02 14:19:15 所属栏目:Unix 来源:DaWei
导读:  我原以为是 adb server 自己睡过去了,结果发现它压根没醒过——2025年5月12号凌晨三点十七分,连上那台 macOS Monterey 的 M1 Mac mini,执行 adb devices 闪退三次,第四次卡在 “ daemon not running. starting it no

  我原以为是 adb server 自己睡过去了,结果发现它压根没醒过——2025年5月12号凌晨三点十七分,连上那台 macOS Monterey 的 M1 Mac mini,执行 adb devices 闪退三次,第四次卡在 “ daemon not running. starting it now on port 5037 ”,然后静音。阳台衣服没收,雨丝斜着糊在玻璃上,隔壁装修的电钻声刚歇,群里“老陈”发了个捂脸哭表情包,说“兄弟你这设备列表里怎么还挂着三台已关机的 Pixel 4a?”


  查一下收录。打开 Chrome,输 site:example.com,回车;再输 site:example.com inurl:android,回车;再输 site:example.com intitle:debug,回车——三遍,空白。不是没结果,是根本没触发搜索框下方那个小箭头下拉菜单,连“搜索建议”都没弹出来。我手抖点错两次,第三次才意识到:不是 Google 没返回,是我本地 Chrome 的 omnibox 后端崩了,它把 adb logcat 输出的那段乱码当成了 URL scheme 解析失败日志塞进地址栏缓存,害得整个 history api 雪崩。这个我敢打包票。


  第一件事:杀掉所有 adb 进程,不带 -P 参数。你信不信?就这一行命令,我昨天重装 SDK、删 ~/.android、改 umask、降级 Java、重签名 platform-tools 到 33.0.3,全白搭。但 killall -9 adb 后,等五秒,不敲任何东西,让终端空着喘气——再 adb start-server。成。不是 server 起不来,是旧进程锁着 /tmp/adb 文件句柄,而 Unix 下 tmpfs 不走 sync,reboot 都不清,除非你亲手掐断。客户中午十二点发语音:“李工,安卓端抓不到埋点,百度快照回退到三月十六号了,你看看是不是新版本被当成采集器封了?”我没回,把烟点了,烟灰掉在键盘 F5 键缝里。


  第二件事:关掉所有 Android Studio 窗口,包括后台隐藏的 Terminal 标签页。别笑。去年帮人查友链失效,翻出三个月前的日志,就是 Android Studio 的“Run”按钮背后藏了个 gradle daemon,它悄悄开了个 adb server 绑在 5037 之外的随机端口(5038?5042?谁知道),而系统级 adb 默认只认 5037。结果你的页面在真机上看加载正常,但抓包工具里所有 WebView 请求都绕开 proxy——因为调试桥根本没走通。那会儿我和阿哲在 Slack 里对骂半小时,他说“你测的是壳,不是内核”,我说“你连 debuggable 都没打勾”。最后发现他电脑上同时开着 VS Code + Flutter 插件 + Expo CLI,三套调试通道互殴,端口抢得比竞价排名还狠。


  第三件事:查 $ANDROID_HOME/platform-tools 的软链接链。我敢说,九成 Unix 用户没动过这个。你用 brew install android-platform-tools?好。你用 sdkmanager "platform-tools"?也行。可你有没有试过 ls -la $ANDROID_HOME/platform-tools ——发现它指向 /opt/homebrew/Cellar/android-platform-tools/34.0.5/bin,而那个 bin 目录里,adb 实际是个 shell 脚本,脚本里又调用了 /opt/homebrew/Cellar/android-platform-tools/34.0.5/libexec/adb.real?而这个 .real 二进制文件……是 Intel 架构的。M1 Mac 上跑 Rosetta 二进制没问题,但一碰 SELinux 相关的 socket flag(没错,macOS 自己加的 fake selinux 兼容层)就哑火。我昨天就是卡在这。桌上那包烟只剩两根,雨停了,晾衣杆上的衬衫还在滴水。


  说到这儿想起2017年搞站群那会儿,批量刷安卓 WebView UA 抓 PC 站内容,用的就是一套 adb + curl + grep 的土法管道。那时还没现在这么多“环境变量优先级”“SDK Manager 坐标映射”“AGP Gradle 协同调试模式”。就一个原则:adb devices 出得来,logcat 打得开,剩下的交给 while true 循环和 grep -v “Failed to open”。“老张”当年蹲在深圳城中村出租屋写爬虫,连路由器都烧过两台,他说:“别管它叫调试,就当它是抽屉里的旧电筒——电池漏液了,拧开换俩,别修电路板。” 我当时觉得太糙,现在想,他早参透了Unix哲学:故障不可怕,可怕的是你给它起名字后开始敬畏它。


  到底是哪次更新的事我说不准。是 Android Studio Giraffe 补丁版?是 Xcode 15.4 的 CLT 重装?还是 Homebrew 改了 formula 编译选项?但我知道,今天下午三点,运维那边反馈“Android 端埋点上报恢复了”,而我正盯着 Chrome DevTools 里那堆红色的 “net::ERR_CONNECTION_REFUSED”,其实那不是服务挂了,是我忘了把 chrome://inspect 页面关掉,它一直在后台往 9222 端口发 websocket 探活包,挤占了 ADB 的 USB 数据通道缓冲区。这种事儿没法复现,就像你永远不知道哪次 git commit 触发了 Jenkins 的 JDK 版本检测 bug。


  “小王”上午十点给我发消息:“李哥,咱们测试服能连,生产服连不上,是不是证书 pinning?” 我回:“先把你们 build.gradle 里那行 signingConfigs { debug { } } 删了。” 他五分钟后截图回来,adb devices 多了一行 “0123456789ABCDEF device”。我就知道——不是证书问题,是 debug 变体没打 debuggable=true,系统直接屏蔽了 adb shell 权限链,连 /dev/socket/ashmem 都没让你摸到边。优胜劣汰,就这么冷。它不讲道理,只淘汰那些把“adb devices”当玄学咒语念的人。


文章配图,仅供参考

  明天先把手上那批页面删一半试试。

(编辑:站长网)

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