Rolldownチームは、Termux上で動作するAndroid ARM64デバイスにおいて、Viteが「Illegal instruction」エラーでクラッシュする問題を修正するプルリクエストをマージしました。開発者がコードを実行する前にビルドが失敗するのを10ヶ月間も見守り続けてきましたが、ついに問題は解決し、npmにおける次回のRolldownリリースでは、そのまま(out-of-the-box)動作するようになります。
なぜこのクラッシュが重要だったのか
Termuxを使用すると、Androidスマートフォン上でLinuxスタイルの環境を実行できます。成長を続けるコミュニティの中には、これを唯一の開発ワークステーションとして利用している人々もいます。バングラデシュ、ナイジェリア、インドネシアでは、多くのプログラマーがノートパソコンの代わりにスマートフォンを使用して、Webアプリケーションの記述やバンドルを行っています。数え切れないほどのモダンなサイトを支える高速なビルドツールであるViteは、そのワークフローの核心部分です。Viteを起動しようとすると、JavaScriptがパースされる前に「Illegal instruction」フォルトが発生し、プロセスが即座に終了してしまいます。このエラーはネイティブライブラリのロード中に発生するため、スタックトレースやログも出力されず、開発者は回避策も見出せないまま行き詰まっていました。
技術的な不一致
根本的な原因は、Rolldownのネイティブバインディングに組み込まれていた低レベルの前提にありました。コードは、プロセッサがARMv8.1命令をサポートしていることを想定していました。この命令セットは新しいチップには搭載されていますが、Cortex-A53など、広く使用されている多くのAndroid SoCには搭載されていません。これらの命令を持たないデバイスがライブラリをロードしようとすると、CPUは不正命令例外(illegal-instruction exception)を発生させます。
問題を複雑にしていたのは、原因となったコードが mimalloc という依存関係の中にあったことです。これはメモリ割り当て器(memory allocator)であり、サポートされていない命令の使用をブロックするためのセーフティフラグを備えています。しかし、そのフラグは「標準的なLinux」環境でのみ機能するように設計されていました。AndroidはLinuxカーネルを使用しているものの、自身を異なるものとして識別するため、この保護機能が作動せず、クラッシュを許してしまったのです。
修正方法
マージされた変更では、mimallocのセーフティチェックを拡張し、Android(およびFreeBSD)を同様の保護が必要なプラットフォームとして認識するようにしました。開発者にパッケージの再ビルドや置換を強いるのではなく、ライブラリ自体にパッチを当てることで、エンドユーザーに追加の手間をかけることなく互換性を回復させています。
開発者が得られるメリット
- カスタムのTermuxパッケージは不要。 Rolldownの標準的なnpmインストールにより、新しいセーフティチェックを遵守したバイナリが取得できるようになります。
- 即時のテストが可能。 オープンされているプルリクエストに添付されたプレビュービルドを使用すれば、ARM64のAndroidデバイスを持つ人は誰でも、次回の公式Rolldownバージョンがnpmでリリースされるのを待たずに、今日から修正を確認できます。
今後の留意事項
解決には、Rolldownのメンテナが更新されたパッケージを公開する必要があります。それまでは、ユーザーはプレビュービルドに頼ることになります。
次に注目すべき点
- npmリリースのタイミング。 Rolldownのチェンジログを注視してください。新しいバージョンがレジストリに公開され次第、単純な
npm install rolldownで本番環境に修正を適用できます。
マージされたパッチは、数ヶ月にわたる行き詰まりを日常的なアップデートへと変えました。これは、実際の利用データやコミュニティからの粘り強い報告がいかにして「計画外」のバグを解決済みの問題へと導くかを示しています。スマートフォンでWebアプリを構築しているすべての人にとって、次回のRolldownリリースによって、Viteがプロセッサをクラッシュさせることなく起動できるようになります。
