Rolldown 团队刚刚合并了一个修复程序,解决了 Vite 在运行 Termux 的 Android ARM64 设备上因“Illegal instruction”(非法指令)错误而崩溃的问题。在开发者们经历了十个月的构建过程在代码运行前就崩溃之后,这个问题终于解决了,npm 上的下一个 Rolldown 版本将实现开箱即用。

为什么这次崩溃至关重要

Termux 让用户可以在 Android 手机上运行 Linux 风格的环境,越来越多的社区成员将其作为唯一的开发工作站。在孟加拉国、尼日利亚和印度尼西亚,许多程序员使用手机而不是笔记本电脑来编写和打包 Web 应用程序。Vite 是驱动无数现代网站的快速构建工具,也是该工作流的核心部分。当 Vite 尝试启动时,它会立即触发“Illegal instruction”故障,在任何 JavaScript 被解析之前就杀死了进程。由于错误发生在加载原生库期间,因此没有提供堆栈追踪或日志,导致开发者陷入僵局,找不到明确的解决方法。

技术上的不匹配

根本原因在于 Rolldown 的原生绑定中内置的一个底层假设。代码期望处理器支持 ARMv8.1 指令集——这一指令集存在于较新的芯片中,但许多广泛使用的 Android SoC(如 Cortex-A53)并不具备。当缺乏这些指令的设备尝试加载该库时,CPU 会抛出非法指令异常。

使问题复杂化的是,故障代码存在于一个名为 mimalloc 的依赖项中,这是一个内存分配器,其中包含一个旨在阻止使用不支持指令的安全标志。该标志仅在“标准 Linux”环境下触发。Android 虽然使用 Linux 内核,但其身份识别方式不同,因此该保护机制从未激活,导致崩溃得以发生。

修复是如何实现的

合并的更改扩展了 mimalloc 的安全检查,将其识别为需要相同保护的平台(包括 Android 和 FreeBSD)。通过修补库而不是强制开发者重新构建或替换包,该修复在无需用户进行额外操作的情况下恢复了兼容性。

开发者将获得什么

  • 无需自定义 Termux 包。 现在通过标准 npm 安装的 Rolldown 将拉取遵循新安全检查的二进制文件。
  • 可以立即进行测试。 附在开放的 pull request 中的预览构建版本让任何拥有 ARM64 Android 设备的人今天就能验证修复效果,同时下一个官方版本的 Rolldown 将在 npm 上发布。

剩余注意事项

解决过程取决于 Rolldown 维护者发布更新后的包;在此之前,用户必须依赖预览构建版本。

下一步关注点

  • npm 发布时间。 请密切关注 Rolldown 的更新日志;一旦新版本进入仓库,只需简单的 npm install rolldown 即可将修复应用到生产环境。

这次合并的补丁将长达数月的僵局转变为一次常规更新,展示了现实世界的用例数据和持续的社区报告如何将一个“不在计划内”的 bug 变成一个已解决的问题。对于任何在手机上构建 Web 应用的人来说,下一个 Rolldown 版本终于能让 Vite 在不导致处理器崩溃的情况下启动了。