开发者想查一个系统库的Bug,翻开源码却发现跟设备上跑的不是一回事。最后只能把设备里的二进制文件反汇编,一行行看汇编指令定位问题。
这事发生在 Android 17 的部分 9 月版本构建上。问题出在系统 C 库 Bionic 里的两个宽字符处理函数:wcscspn() 和 wcspbrk()。
扫描为什么会提前停下
这两个函数的行为是扫描宽字符串。按正常逻辑,它们应该一直扫到匹配项或字符串结束。但在受影响版本上,遇到特定的非 ASCII 字符时,扫描可能提前停止。
触发条件比较具体:待扫描的字符串里含有 U+0100 及以上字符,同时用于匹配的字符集里至少有两个字符、且都低于 U+0100。满足这个组合,函数会把遇到的非 ASCII 字符误当成匹配项,直接提前返回。
实际后果是,程序想在宽字符串里找换行符或通配符,扫到 Emoji 表情符号、中文字符这类非 ASCII 字符时就停了,后面的实际分隔符被忽略掉。
这个问题已经在 Android NDK 问题跟踪器中得到维护者确认。
源码和设备对不上
发现问题的开发者在运行 Android 17 Build CP3A.260905.009 的 Pixel 7/8a 上复现了问题。但当他去对照公开源码时,发现复现不了。
2026 年 6 月公开的 Android 17 源代码采用的是另一种实现,按这份代码走,问题不会出现。而 9 月更新所带的 libc.so 里是另一套处理逻辑。两边对不上,公开源码没法用来定位。
开发者只能转向设备本身,检查设备上的二进制文件,通过反汇编来找出错的那段逻辑,再把反馈提交回去。
安卓维护者也确认了这一点:Android 17 的公开源代码位于 android17-release 分支,但该分支与受影响的 9 月设备构建在实现方式上并不相同。
延迟推送带来的连锁反应
问题的根源指向一个流程环节:谷歌向 AOSP 推送源代码变更存在延迟。公开分支落后于设备实际构建,两者实现不一致。
对社区开发者来说,这意味着排查问题的常规路径被堵住了。看源码定位本来是标准做法,现在这条路走不通,只能退回到反汇编这种更费力的手段。
一个宽字符处理的边界错误,因为源码与二进制不同步,排查成本被抬高了一截。
热门跟贴