夜雨聆风学习资料网

ARTICLE · 1185038

安卓源码一年只发两次:111万码点bug只能靠反汇编

安卓源码一年只发两次:111万码点bug只能靠反汇编

Android 17 的一个 libc 函数把 111 万个码点全判错,最先发现的不是谷歌,是读反汇编的开发者。设备 9 月 15 日就推送到 Pixel,源码却迟迟没有公开,因为谷歌从 2026 年起只在第 2、第 4 季度向 AOSP 发布源码。下游项目没法查源码,只能对着已编译的 libc.so 逐条读指令,再自己写补丁绕过。

源码发布时间表的变化

2025 年 3 月 27 日,Google 推送新的 android-latest-release 清单,建议贡献者用它而不是 aosp-main 分支 [2][3]。官方 2026 年页面进一步写明:为与 Trunk Stable(主干稳定)开发模型保持一致,源码将在第 2、第 4 季度发布到 AOSP,android-latest-release 指向 android17-release 分支 [2][8]。Android 17 本身在 2026 年 6 月发布 [2];第三方以二进制形式随 Android 分发的组件,走单独的“获取 Android 源代码”流程 [2]。

AOSP 是 Google 主导、以公开源码发布 Android 平台代码的项目,LineageOS、GrapheneOS、/e/OS 以及不预装 Google 服务的设备厂商都直接或间接建立在它之上。HN 用户 microtonal 给出的规模估计是 GrapheneOS 约 50 万活跃安装、LineageOS 约 140 万 [4],这是用户引用值,不是官方统计。aosp-devs.org 在 2025 年的分析给出另一种解读:下个版本的开发本来就长期在私有环境完成,只有 Bionic、Bluetooth、Cuttlefish、Virtualization 等少数项目曾是“AOSP 优先”,所以“对大多数人来说一切照旧”,主要变化是 AOSP 贡献流程“可能更不透明”[3]。

一个 bug,从反汇编里读出来

issue 里的复现很干净。一段包含 'a'、U+1F680、U+0100、'b'、'x'、'\n' 的宽字符串,用 wcscspn(s, L"x\n") 查询,在 Pixel 8a 的 CP3A.260905.009 上返回 1,正确结果是 4;wcspbrk() 同样在第 1 个位置误报命中;wcsspn() 则正确 [1]。报告者随后扫描 U+0001 到 U+10FFFF 的全部码点(跳过代理对与集合成员),得到 U+0001–U+00FF 正确、U+0100–U+10FFFF 全错的结论,错误码点计 1,111,808 个 [1]。

机制来自反汇编。wcscspn 里有三条路径:单字符集合走普通比较循环,正确;集合含 ≥0x100 的字符时退回逐字符 wcschr(),也正确;其余情况用一个 256 字节的栈上 bool 表查表,而循环在遇到 ≥0x100 的字符时直接跳到“命中”分支 [1]。报告列出关键指令 ldrb w8, [x9, x8]、tbnz、cmp w8, #0x100、b.lo,并给出实际触发场景:VBScript 解析器用 wcspbrk(src, L"*?><") 搜索通配符集合,脚本里只要出现非 Latin-1 字符就会被误判为通配符 [1]。

最刺眼的是测试。bionic 维护者(GitHub 账号 enh-google)当天回复“你说的都对,主干上仍然存在这个问题”,随后贴出仓库里既有的 wcscspn 测试:wcscspn(L"he\ufffelo", L"lo") 期望 2、实际返回 3——期望值本身就写错了 [1]。他同时说“我本来想说‘你直接看源码不就行了’,但 android-latest-release 似乎还停留在 4 月”,并承诺补测试、找其他“缺少非 ASCII 用例”的地方、尽量回移修复以缩小受影响设备范围 [1]。这条回复收到 21 个表情回应,其中 17 个是“困惑”[1]。

下游比上游更早动手。Visual Pinball(vpinball)仓库在 2026 年 10 月 11 日提交 deps: bump libwinevbs to fix broken wcspbrk on Android 17,用更新依赖把调用换成普通循环 [7],比上游 issue 早一天。

时间表跑在设备之后

反汇编成为必要手段,是因为“设备上已经有、AOSP 上还没有”这个窗口期在 2026 年被拉长到以月计。Android 17 QPR1 于 9 月 15 日上线 Pixel [6];issue 在 10 月 12 日提交、10 月 13 日仍有讨论时,QPR1 的源码仍未公开 [1]。

Google 侧的解释集中在分支命名。维护者 pirama-arumuga-nainar 指出 android-latest-release 是清单分支、android17-release 才是 git 分支,Android 17 的 bionic 源码在 android.googlesource.com/platform/bionic/+/refs/heads/android17-release [1]。这个澄清成立,但回答不了 HN 用户 zenczykowski 的追问——“那 Android 17 QPR1 的源码在哪?它才是真正跑在 Pixel 上、并且已经稳定了一个多月的版本”,该评论获 8 个赞同 [1]。报告者 francisdb 只回了一句“确实可惜,源码还(暂时)拿不到”,并追问“这些共性问题是不是该换个地方讨论”[1]。

讨论被推到 issue 之外。同一话题在 Hacker News 拿到 299 分、137 条评论 [4],在 r/Android 拿到 575 个 upvote、126 条评论 [5]。r/Android 的高赞评论依次是“真希望 Linux 手机当年拿到更多关注和资金”(181 upvote)、“根本没有问题,现状就是 Google 想要的样子”(82 upvote)、“Google 里没人认真看这些问题吗?我说的不是这个 bug,是 AOSP 近来的管理问题”(60 upvote)[5]。GitHub issue 里 joaquinvacas 写下类似担忧——“自从 Google 决定关闭 AOSP 源码,很多问题冒出来却没有修复,Google 那边也没有任何透明度”,收到 42 个赞同,是全部评论里最高的一条 [1]。

被卡住的下游

把“晚发源码”讲得最具体的是 GrapheneOS。它在 2026 年 9 月 16 日的帖子里称,Android 17 QPR1 是自 Android Honeycomb(3.x)以来第一个为应用开发者新增 API、却没有对应 AOSP 发布的版本,新增 API 只存在于 Pixel 系统,其他 Android OEM 拿不到;帖子直接链接了 API level 37 与 37.1 的差异页 [6][10]。同一串回复里,GrapheneOS 说明自己能跟进的是年度版本与 QPR2,“要在没有数月延迟的情况下推送补丁,需要预览权限”,而 9 月的 Pixel Update Bulletin 里含有针对“非 Pixel 设备也在使用”的标准平台组件补丁,这些补丁没有出现在 9 月的 Android 安全公告里 [6]。它给出的时间表是:其他 OEM 将在 2026 年 12 月通过 Android 17 QPR2 拿到这些补丁,“我们可以通过逆向工程更早发布”[6]。首帖获得 85 次转发、139 次收藏,时间表帖获得 38 次转发、120 次收藏 [6]。

这个说法在 HN 上被正面对抗。用户 izacus 指出 GrapheneOS 本身不是 OEM,不享有伙伴仓库访问权限;像 Motorola 这样的 OEM 有伙伴仓库、可以自选是否推送 QPR,问题在于“多数 OEM 不愿意推更新”,并称运营该账号的人“在被冒犯时有夸大和选择性陈述的倾向”[4]。双方都给出理由,没有第三方核实,而 GrapheneOS 自己承认的现实是:它已经把代码移植到 Android 17 QPR1,但“没有权限发布”[6]。

受影响面不限于手机 ROM。Visual Pinball 需要解析 VPX 表里的 VBScript,用 wcspbrk 找通配符 *?><,任何非 Latin-1 字符都会被误判成通配符命中,于是它用“换掉依赖、改回普通循环”绕过 [1][7]。这是典型的代价转移:上游函数错了,代价由每个调用它的下游项目各自承担,而下游没有源码可查,只能读 ARM64 反汇编。

争议与风险

“平台稳定”还是“事实闭源”,双方口径直接对撞。官方文档把 Q2/Q4 发布表述为服务 Trunk Stable 模型、保障生态平台稳定 [2];aosp-devs.org 认为下个版本的开发长期就是私有的,AOSP 仍是开源项目,“对大多数人来说影响有限”[3]。社区的回答更直接:r/Android 第二高赞评论是“根本没有问题,现状就是 Google 想要的样子”(82 upvote),HN 上“是时候分叉了”(It’s time to fork it)是热门跟帖之一 [4][5]。这不是技术分歧,是对动机的判断分歧,双方都没有可验证证据。

“欧盟法规逼 Google 私发安全更新”的说法已被当场反驳。HN 用户 aboringusername 引用欧盟 2023/1670 号法规中关于操作系统更新的条款,认为“若源码未公开,则从 OS 提供方发布更新起算”的写法解释了 Google 的行为,并称“这 100% 就是 Google 关闭源码、改为私下做安全发布的原因”[9]。用户 yorwba 立即指出该条款把二进制发布与源码发布等同对待,恰恰不区分开源闭源,“它能解释 Google 为什么同时发源码和二进制,却解释不了源码为什么比二进制还晚”[4]。这条因果链目前只有社区推测,没有 Google 的确认。

最实的风险是安全补丁时间差,但它只有单方证据。GrapheneOS 声称非 Google 设备要到 12 月才能拿到 9 月已进 Pixel 公告的平台补丁 [6];izacus 则认为 OEM 有伙伴仓库、问题在 OEM 的推送意愿 [4]。如果 GrapheneOS 的说法成立,影响的是数亿台非 Pixel 设备;如果 izacus 的说法成立,问题就退回到“OEM 本来就不爱推更新”的老故事。这个分歧需要第三方(例如 CDD/CTS 审计或独立研究者核对公告条目)才能解决,本次研究中没有找到。

下游审计能力的技术性风险已经显现。当唯一可用信息是已编译的 libc.so,bug 报告的形态会从“补丁+测试”退化成“指令序列+码点扫描”——issue 2260 正是如此:报告者只能提出“完整反汇编与探针源码可按需提供”[1],修复、测试和回移全部由 Google 内部完成。HN 评论里还有人把这条路径归因于 AI:senfiaj 认为 AI 已经开始成功反编译二进制,“只要没被刻意混淆,差不多就等于开源”;userbinator 则注意到报告文本本身“有 Claudism 的痕迹”[4]。这两条都是社区印象,不是可核验结论,但指向同一个趋势判断:反汇编门槛正在下降,“读二进制报 bug”会变得更常见,而不是更罕见。

接下来看什么

短期看两个时间点。按官方 Q2/Q4 节奏,下一次 AOSP 源码发布窗口落在 2026 年第四季度,届时 Android 17 QPR1 的源码(含 android17-release 之外的 QPR1 分支)是否公开,是这次事件唯一可验证的结果 [1][2]。另一个是 12 月:GrapheneOS 说其他 OEM 会在 Android 17 QPR2 中拿到 9 月的平台补丁 [6],如果届时补丁确实到达,它的“被卡住”叙事会加强;如果更早到达,izacus 的反驳会更站得住。

中期看两个方向。Google 的发布节奏在 API 层面继续分化——Android 17 QPR1 新增了应用 API 却没有 AOSP 对应发布,这类“只在 Pixel 上存在的新 API”如果继续累积,非 Pixel 生态能跟进的版本号会从“年度版本 + QPR2”进一步收窄 [6]。社区的自救能力也在变:GrapheneOS 明确说它会“逆向工程”补丁以便提前发布 [6],Visual Pinball 用一行依赖版本绕过了 libc 的 bug [7],HN 上已在讨论 AI 反编译让二进制接近“准开源”[4]。

来源

  1. [BUG] bionic: wcscspn()/wcspbrk() treat every wchar_t >= 0x100 as a match (Android 17, CP3A.260905.009) - https://github.com/android/ndk/issues/2260
  2. 网站更新(AOSP 变更:自 2026 年起于第 2、第 4 季度发布源代码)- https://source.android.google.cn/docs/whatsnew/site-updates?year=2026
  3. What Recent Android Changes Mean for AOSP and Open Source - https://aosp-devs.org/blog-aosp-latest-release.html
  4. Hacker News: AOSP Source Releases Are So Late Developers Disassemble Libraries to Report Bugs - https://news.ycombinator.com/item?id=50083130
  5. Reddit r/Android: AOSP Source Releases Are So Delayed That Developers Have to Disassemble Libraries Just to Report Bugs - https://www.reddit.com/r/Android/comments/1x4r9kp/aosp_source_releases_are_so_delayed_that/
  6. GrapheneOS: Android 17 QPR1 is the first release since Android Honeycomb (3.x) adding new APIs without a release to AOSP - https://grapheneos.social/@GrapheneOS/117282080803799576(后续回复:117282123437636721、117282138409008682、117282153215695312、117282177699479853)
  7. vpinball: deps: bump libwinevbs to fix broken wcspbrk on Android 17 - https://github.com/vpinball/vpinball/commit/e7837322f4114f0d26f1b5e8a8e9d50c547f1a6b
  8. Android Authority: Google will now only release Android source code twice a year - https://www.androidauthority.com/aosp-source-code-schedule-3630018/
  9. Hacker News 评论:援引欧盟法规 (EU) 2023/1670 关于操作系统更新的条款 - https://news.ycombinator.com/item?id=50083961
  10. Android Developers: API Differences between 37 and 37.1 - https://developer.android.com/sdk/api_diff/37.1/changes

相关学习资料