被系统说"不支持"之后:Termux浏览器自动化的翻车与翻正
系统日志原文写得明明白白:”Termux不支持浏览器自动化”。我盯着这行字看了三秒,然后说:你试试呢?
后来真跑通了。代价是--no-zygote这个参数,和一整个通宵。
TL;DR
“系统说不行”和”真的不行”之间,隔着一个 --no-zygote。本文记录8月底Termux升级后浏览器自动化被block的全过程:cryptography锁死48.0.1、--no-zygote救活Chromium headless、以及”系统说”和”实测说”哪个可信。结论:日志是参考,不是判词。
一、起因:升级只需5分钟,修环境要5小时
8月底,Termux推送了自动升级。我在床上刷到通知,顺手点了确认,心想”好事,新版本”。
升级完成用了5分钟。
然后我打开Hermes,浏览器自动化直接罢工。日志里一行字,我记得特别清楚:
browser command blocked on Termux
“不支持”。系统替我把话说了,说得斩钉截铁。
当时我的第一反应是:”行吧,等下个版本。”——这是打工人本能,被系统告知”不支持”,最省事的应对就是接受。
但那天晚上我躺在床上睡不着。不是因为多需要浏览器自动化,是那句话扎得慌:我花两个月搭起来的东西,别人一行日志就给我判了死刑,连个申诉渠道都没有。
骨子里还是那个扛11个城市业绩的人。系统说”不行”,我第一反应永远是”你试试呢”。
于是第二天,开修。
二、第一关:cryptography,Rust把我卡死
修浏览器之前,先过环境关。Termux升级把Python从3.11跳到3.13,我的venv全废了,所有依赖要重装。
重装到一半,cryptography 50.0.0在Android aarch64上编译直接崩溃——它的Rust原生依赖在手机上编译不过。微信插件跟着报错:
No module named ‘cryptography.hazmat.backends’
我对着崩溃日志看了二十分钟,没看出个所以然。当时我的原话(后来翻记录看到的):”Rust这玩意儿,我连它长什么样都没见过,怎么知道我错在哪?”
最终解法很土:锁版本。
1 | export ANDROID_API_LEVEL=33 |
48.0.1在Android aarch64上能过。50.0.0过不了。两个数字,差了一整个通宵。
这一关的教训是:开源工具的代价,是永远在修环境。 但修好了,就是你的壁垒——别人不愿意修的坑,你修过了,以后都是平的。
三、第二关:–no-zygote,那个救命的参数
环境修好了,正式上浏览器自动化。Selenium + Chromium 149,按网上的教程配:
1 | opts = Options() |
跑起来,Chromium直接启动失败。
翻了无数英文论坛,发现Android上跑Chromium还少了一个关键参数——--no-zygote。Linux桌面教程里从来没有人提它,因为桌面Linux不需要。但Android是例外:zygote进程模型和Termux的沙箱冲突,不加这个参数,Chromium在手机上就是起不来。
加上之后:
1 | opts.add_argument('--no-zygote') # Android必须,不加启动失败 |
验证环境:chromium 149.0.7827.155 + ChromeDriver 149 + Selenium 4.47.0。写个最小用例,打开example.com,打印title。
跑通了。
那个瞬间我截图留档了。不是炫耀,是给自己一个证据:系统日志说”不支持”,实测说”支持,差一个参数”。 两句话,只隔一个 --no-zygote。
四、”系统说”和”实测说”
这一篇真正想写的,不是参数,是这两个词。
“系统说”是日志、是报错、是文档、是”Termux不支持浏览器自动化”。它权威、简洁、看起来无懈可击。它的危险在于:它让你不用想了。 一旦接受”不支持”这个结论,你省下的不只是时间,还有可能性。
“实测说”是 driver.get('https://example.com') 跑通那一下。它不权威,甚至看起来很不严谨——“你才跑了一个example.com,算什么证据?”。但它有一个”系统说”给不了的东西:它是我自己验证的。
我这些年养成的习惯,一句话能总结:日志是参考,不是判词。
当年在阿里,客户说”这个功能我们用不上”,我不会直接写进结案报告。我会先问一句”你试试呢”——不是怼人,是确认。AI折腾这条路上,系统日志和参数文档就是”客户”,我照样不直接信。
被block之后,我多花了一个通宵。但那个通宵换来的,是一条自己验证过的路径,而不是一个转述的结论。这两者的价值,差着一个数量级。
五、翻车记录:不止一个通宵
--no-zygote 之后,还有两个坑没提,补上,都翻过车。
坑一:Google搜索会超时。 浏览器自动化能跑,但访问Google在手机上会卡死。我用example.com验证通过之后,第一反应是”完了,能用但不好用”。后来想明白了:验证环境用简单网站,真实抓取走CF代理出口。各干各的,不混。
坑二:inotify权限受限。 我想让Hermes的浏览器工具监听文件变化,改 /proc/sys/fs/inotify/max_user_watches,被拒。没root,改不了。这个坑我至今没绕过去,只能接受”浏览器自动化是手动触发,不是常驻服务”。
翻车不可怕,翻车不记录才可怕。这两条我现在写进了自己的skill里,下次再遇到,不用再花那个通宵。
六、结语:修好了,是你的壁垒
8月底那晚躺在床上睡不着,是因为”不支持”三个字扎人。
现在回头看,那三个字是系统日志,不是事实。事实是:Android上Chromium headless需要 --no-zygote,加上就通。 一个参数,一个通宵,一条自己验证过的路径。
开源工具永远在修环境,这是它的代价。但代价的另一面是壁垒:别人不愿意修的坑,你修过了,以后都是平的。 我这套”Termux + Selenium + –no-zygote + CF代理出口”的组合,市面上没有现成的教程——因为大多数人看到”不支持”就停了。
我多花了一个通宵。但我多了一条别人没有的路。
作者:小道 · 环境:Termux on Android 13,chromium 149 + Selenium 4.47 · 2026-09-29
关联阅读:《升级只需5分钟,修环境要5小时》 · 系列:AI Agent实战笔记(技术线)