Linux无障碍环境搭建:20年前端老兵实战指南
|
去年春节,我蹲在出租屋阳台上抽烟,脚边是那个二手ThinkPad T480,键盘F键塌了半截,按下去声音比别的键沉半拍——像踩进一滩没冻实的泥。旁边煮泡面的室友正把叉子插进面饼里转圈,蒸汽糊住他眼镜片。耳机戴久了右耳疼,得时不时往上提一提,结果充电线不够长,我只能歪着坐,左肩发僵。 那天早上七点,我切进无障碍环境测试流程,Alt+Shift+PrintScreen硬按了三遍,系统弹窗报错:at-spi-registryd not running。我原以为是dbus版本太老,结果翻journalctl -u at-spi-bus-launcher发现服务根本没注册进session bus——它压根儿没被systemd-session识别。我段位其实不高,这个我是听人说的,说是GNOME 42之后改用wayland默认会砍掉AT-SPI over D-Bus那条通路,但文档里只写“推荐启用pipewire”,没人告诉你得先关掉gnome-settings-daemon里的accessibility auto-start钩子。我删了~/.config/autostart/gnome-at-sw-applications.desktop,重载gdm3,再alt+shift+prtscr——这次弹窗闪了一下,黑了两秒,出来个语音反馈:“Orca started”。 有人在语音里一直咳嗽。不是我队友,是隔壁工位那个做嵌入式的,他总在凌晨三点连麦问Linux内核模块怎么挂载alsa驱动。我没理他。倒是张工——我们组前端重构时扛过React15到18迁移的张工,那天他微信甩来截图:Chrome DevTools里ARIA属性全标红,a11y tree崩成一棵死树,但屏幕阅读器念得挺流利。我问他Chrome用的什么GTK后端,他回:“gtk3.24,应该没动过。”我直接ssh进他机器,ps aux | grep at-spi,发现at-spi2-registryd跑在root session下,而Chrome起在user session里——两个bus隔离了。我让他export GTK_MODULES=gail:atk-bridge,再重开浏览器。他顿了五秒,说:“现在树回来了。” 外卖送到了去开门。塑料袋提手上全是油印,我单手拧门把手的时候,手机还在响——李哥打来的。他去年退坑了,现在搞社区养老系统适配,前天刚骂完一个国产UI库:“按钮没role=button,tabindex=-1还加在icon上,我读屏念‘未知元素’念了八百遍。”他退坑前最后一把用我号打排位,选了个中单发条,四级想WQEQ连招,结果E没捏稳,后摇卡在兵线里,被对面打野盲僧一脚踹飞。他扔了鼠标说:“这破框架,连focus管理都靠setTimeout模拟,还聊啥无障碍。”后来我查他commit记录,发现他last push里留了行注释:“@todo: focus trap for modal — if we ever get a11y audit.” 没人review,也没人merge。 有个关键操作必须啰嗦三步:当你想让Orca在终端里正确读取zsh补全选项,别碰/etc/profile,也别动oh-my-zsh的plugin目录——先sudo nano /usr/share/applications/org.gnome.Terminal.desktop,找到Exec=这一行,末尾加 --disable-gpu --force-device-scale-factor=1;再进~/.zshrc,删掉所有关于ZLE_WIDGET的东西;最后重启tmux session,不是reload,是killall tmux然后手动重进。缺一步,Orca就只能读出光标位置,读不出当前补全文本。我试了七次才对上节奏。中间第三次重试时李哥在微信问我:“你家路由器啥型号?”我顺手回了句“华三S5130”,说完才反应过来他在测无障碍网页的WiFi配置页面跳转路径…… 我原以为搞定Orca+Chrome+Terminal就完事了,结果客户验收那天,他们带的NVDA连不上Linux虚拟机——不是驱动问题,是VMware Workstation 17里USB重定向开关默认关着,NVDA的HID设备根本进不了guest OS。我把那个开关打了勾,又顺手关了主机上的Windows Defender实时防护(怕它误杀libatspi.so),结果客户工程师盯着屏幕突然笑出声:“你们前端,连USB协议栈都要管啊?”我没接茬。他左手边泡面桶还没收,叉子斜插在干结的汤底里。
文章配图,仅供参考 时间线倒回去三年,那会儿还在用X11的xfce,Orca一开,整个桌面帧数掉到12fps,我拿htop看,是orca-python进程把CPU占到98%,因为每次focus change它都去扫/usr/share/glib-2.0/schemas下的全部gschema文件——里面有一千多个键值对,其中73%和a11y根本没关系。后来我们硬写了个schema白名单脚本,放在cron里每天零点执行。现在没人提这事了。就像没人记得Firefox ESR 68之前,aria-live="polite"在Linux下根本不会触发speech dispatcher——得手动调atspi_generate_event(),而那个函数文档写在Atspi 2.10源码注释第3789行,小字体,没加粗。 优胜劣汰?对。不是谁更懂AT-SPI spec,是看谁先在CI里把axe-core跑进Docker+headless Chromium+Orca组合流程。上周王磊——就是那个写Vue指令封装accessibility hook的王磊,他push了个PR,自动检测SVG内联symbol是否含title/aria-label,没通过就block merge。没人给他提需求,是他自己写的。我看了眼他commit message:“防以后自己忘。” 耳机右耳又开始疼。我把音量调低了一格。泡面味混着烟味往鼻子里钻。T480风扇突然狂转,像台老式空调外机启动失败前的挣扎。我敲了句sudo systemctl restart at-spi-dbus-bus.target,回车键按下时,窗外一辆电动车刹停,喇叭短促地“嘀”了一声。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

