Đội ngũ Rolldown vừa hợp nhất một bản sửa lỗi giúp ngăn Vite bị lỗi “Illegal instruction” (lệnh không hợp lệ) trên các thiết bị Android ARM64 chạy dưới Termux. Sau mười tháng các nhà phát triển phải chứng kiến các bản build bị lỗi ngay trước khi mã nguồn kịp chạy, vấn đề này cuối cùng đã được giải quyết, và bản phát hành Rolldown tiếp theo trên npm sẽ hoạt động ngay lập tức mà không cần cấu hình thêm.

Tại sao lỗi crash này lại quan trọng

Termux cho phép người dùng chạy một môi trường kiểu Linux trên điện thoại Android, và một cộng đồng đang ngày càng lớn mạnh dựa vào nó như một trạm làm việc phát triển duy nhất của họ. Tại Bangladesh, Nigeria và Indonesia, nhiều lập trình viên sử dụng điện thoại thay vì laptop để viết và đóng gói (bundle) các ứng dụng web. Vite, một công cụ build nhanh chóng hỗ trợ vô số trang web hiện đại, là một phần cốt lõi trong quy trình làm việc đó. Khi Vite cố gắng khởi động, nó ngay lập tức gặp lỗi “Illegal instruction”, làm dừng tiến trình trước khi bất kỳ mã JavaScript nào kịp được phân tích (parse). Lỗi này không cung cấp stack trace hay nhật ký (log) nào vì nó xảy ra trong quá trình tải một thư viện native, khiến các nhà phát triển rơi vào bế tắc mà không có hướng giải quyết rõ ràng.

Sự không tương thích về mặt kỹ thuật

Nguyên nhân gốc rễ nằm ở một giả định cấp thấp được tích hợp sẵn trong native binding của Rolldown. Mã nguồn kỳ vọng bộ vi xử lý hỗ trợ các tập lệnh ARMv8.1—một tập lệnh có mặt trên các chip mới hơn nhưng lại thiếu vắng trên nhiều SoC Android đang được sử dụng rộng rãi, chẳng hạn như Cortex-A53. Khi một thiết bị thiếu các tập lệnh đó cố gắng tải thư viện, CPU sẽ đưa ra ngoại lệ "illegal-instruction".

Vấn đề trở nên phức tạp hơn khi đoạn mã gây lỗi nằm trong một dependency có tên là mimalloc, một bộ cấp phát bộ nhớ (memory allocator) có bao gồm một cờ an toàn (safety flag) được thiết kế để chặn việc sử dụng các tập lệnh không được hỗ trợ. Cờ đó chỉ được kích hoạt trên các môi trường “Linux tiêu chuẩn”. Android, mặc dù sử dụng nhân Linux, nhưng lại định danh bản thân theo cách khác, vì vậy cơ chế bảo vệ không bao giờ được kích hoạt và lỗi crash đã lọt qua.

Cách bản sửa lỗi được xây dựng

Thay đổi vừa được hợp nhất sẽ mở rộng quy trình kiểm tra an toàn của mimalloc để nhận diện Android (và FreeBSD) là các nền tảng cần sự bảo vệ tương tự. Bằng cách vá lỗi thư viện thay vì buộc các nhà phát triển phải xây dựng lại hoặc thay thế các gói (packages), bản sửa lỗi này khôi phục khả năng tương thích mà không cần thêm bất kỳ bước nào cho người dùng cuối.

Những gì nhà phát triển nhận được

  • Không cần gói Termux tùy chỉnh. Việc cài đặt Rolldown qua npm tiêu chuẩn giờ đây sẽ tải về một bản binary tuân thủ kiểm tra an toàn mới.
  • Có thể kiểm tra ngay lập tức. Một bản build xem trước (preview build) đính kèm trong pull request đang mở cho phép bất kỳ ai có thiết bị Android ARM64 xác minh bản sửa lỗi ngay hôm nay, trong khi chờ phiên bản Rolldown chính thức tiếp theo được phát hành trên npm.

Các lưu ý còn lại

Việc giải quyết triệt để phụ thuộc vào việc những người duy trì Rolldown phát hành gói đã được cập nhật; cho đến khi điều đó xảy ra, người dùng phải dựa vào bản build xem trước.

Những gì cần theo dõi tiếp theo

  • Thời điểm phát hành trên npm. Hãy theo dõi nhật ký thay đổi (changelog) của Rolldown; ngay khi phiên bản mới xuất hiện trên registry, chỉ cần một lệnh npm install rolldown đơn giản là có thể đưa bản sửa lỗi vào môi trường production.

Bản vá vừa được hợp nhất đã biến một tình trạng bế tắc kéo dài nhiều tháng thành một bản cập nhật thông thường, cho thấy dữ liệu sử dụng thực tế và các báo cáo kiên trì từ cộng đồng có thể biến một lỗi “không nằm trong kế hoạch” thành một vấn đề đã được giải quyết. Đối với bất kỳ ai đang xây dựng ứng dụng web trên điện thoại, bản phát hành Rolldown tiếp theo cuối cùng sẽ cho phép Vite khởi động mà không làm treo bộ vi xử lý.