Ruffle - Trình giả lập Adobe Flash Player

Ruffle là trình giả lập Adobe Flash Player cần thiết để chạy nội dung Flash cũ (trò chơi, hoạt hình, ứng dụng và banner SWF). Nó hoạt động như một ứng dụng độc lập trên tất cả hệ điều hành (bao gồm Windows, macOS và Linux) và tích hợp vào trình duyệt thông qua WebAssembly.

Ruffle cung cấp các bản dựng riêng cho Windows, macOS và Linux hoạt động như chương trình thông thường: chỉ cần chạy tệp thực thi và mở tệp SWF mong muốn bên trong nó.

Ruffle tận dụng tính an toàn bộ nhớ của ngôn ngữ Rust và hộp cát (sandbox) của trình duyệt hiện đại. Điều này cho phép nội dung cũ có nguy cơ tiềm ẩn chạy mà không có rủi ro lây nhiễm hệ thống hay rò rỉ dữ liệu.

Trình giả lập kết hợp hỗ trợ cả AVM1 cũ (ActionScript 1 và 2, được sử dụng cho đến năm 2006) và AVM2 phức tạp hơn (ActionScript 3). Điều này cần thiết để hầu như mọi nội dung Flash hoạt động chính xác, từ các hoạt hình đầu những năm 2000 đến các trò chơi và ứng dụng phức tạp được phát hành ngay trước khi công nghệ này ngừng hoạt động.

Liên kết tải xuống:

Tất cả liên kết đều dẫn đến nguồn chính thức: bản dựng cho Windows (x86_64), macOS (phổ dụng cho Intel và Apple Silicon), Linux (x86_64 và ARM64 cho Raspberry Pi và thiết bị ARM) được phân phối qua kho lưu trữ GitHub của dự án Ruffle, trong khi phiên bản Linux ở định dạng Flatpak có sẵn qua danh mục Flathub chính thức với chữ ký số và khả năng cô lập ứng dụng.

Tính năng chính của Ruffle

Tích hợp qua WebAssembly. Để hoạt động trên trình duyệt, Ruffle biên dịch sang WebAssembly (Wasm) — mã bytecode cấp thấp được thực thi trong hộp cát biệt lập của trình duyệt với hiệu suất gần với mã gốc. Điều này cho phép trình giả lập tải và xử lý đồ họa Flash phức tạp cũng như logic mà không cần cài đặt plugin NPAPI/PPAPI lỗi thời và không an toàn.

Phát hiện tự động và Polyfill nội dung Flash. Phiên bản web của Ruffle bao gồm một bộ phát hiện JavaScript quét cấu trúc DOM của trang để tìm các phần tử object, embed và applet, cũng như các tệp có phần mở rộng .swf. Khi phát hiện nội dung như vậy, Ruffle tự động thay thế bằng trình phát của riêng mình, sửa chữa trang một cách minh bạch cho người dùng và khôi phục chức năng của các thành phần Flash.

Chế độ hoạt động kép (Ứng dụng máy tính để bàn và Tiện ích mở rộng trình duyệt). Ruffle mang đến sự linh hoạt cho người dùng: có thể được sử dụng như một ứng dụng máy tính để bàn độc lập để phát SWF cục bộ (đơn giản là liên kết tệp với tệp thực thi Ruffle) hoặc như một tiện ích mở rộng trình duyệt tích hợp vào môi trường duyệt web, cung cấp hỗ trợ Flash trên bất kỳ trang web nào.

Hỗ trợ ActionScript 1.0 và 2.0 (AVM1). Ruffle triển khai máy ảo AVM1, đảm bảo khả năng tương thích với khối lượng lớn nội dung được tạo trước năm 2006 và cho đến năm 2013. Mức độ tương thích hiện tại cho các cấu trúc ngôn ngữ AVM1 đạt 99%, và cho API — 81%, đảm bảo phần lớn các trò chơi và hoạt hình Flash thời kỳ đầu hoạt động chính xác.

Hỗ trợ ActionScript 3.0 (AVM2). Đối với nội dung được tạo sau năm 2006, Ruffle bao gồm một bản triển khai AVM2. Mặc dù công việc tương thích đang được tiến hành tích cực, trình giả lập đã cung cấp đủ mức hỗ trợ để chạy nhiều trò chơi và ứng dụng phức tạp được viết bằng ActionScript 3, liên tục mở rộng phạm vi API và khả năng ngôn ngữ.

An toàn ở cấp độ ngôn ngữ Rust. Một trong những lợi thế kiến trúc chính của Ruffle là việc sử dụng ngôn ngữ Rust. Rust đảm bảo an toàn bộ nhớ tại thời điểm biên dịch, loại bỏ hoàn toàn các lớp lỗ hổng từng làm phiền Adobe Flash Player gốc, chẳng hạn như tràn bộ đệm, giải phóng bộ nhớ kép và lỗi sử dụng sau khi giải phóng (use-after-free).

Cô lập trong hộp cát của trình duyệt. Khi hoạt động trong môi trường web, Ruffle (thông qua WebAssembly) tuân thủ đầy đủ chính sách bảo mật của trình duyệt. Điều này bổ sung thêm một lớp cô lập: trình giả lập không có quyền truy cập trực tiếp vào hệ thống tệp của người dùng hoặc các tiến trình hệ thống khác, làm cho việc khai thác trở nên cực kỳ khó khăn so với plugin Flash cổ điển.

Quản lý bộ nhớ hiệu quả. Không giống như Flash Player gốc sử dụng bộ thu gom rác với các khoảng dừng không xác định, Ruffle kế thừa mô hình sở hữu nghiêm ngặt của Rust. Điều này cho phép sử dụng bộ nhớ dễ dự đoán hơn, giảm phân mảnh và loại bỏ rò rỉ bộ nhớ thường dẫn đến hành vi không ổn định của trình duyệt.

Hỗ trợ dòng lệnh. Phiên bản máy tính để bàn của Ruffle cung cấp giao diện dòng lệnh đầy đủ chức năng. Người dùng có thể chạy trình giả lập với các tham số, ví dụ: ruffle filename.swf cho tệp cục bộ, hoặc ruffle https://example.com/filename.swf để phát SWF từ URL. Lệnh ruffle --help hiển thị danh sách đầy đủ tất cả các đối số và cài đặt có sẵn.

Mã nguồn mở và tính minh bạch trong phát triển. Ruffle được phân phối theo giấy phép Apache 2.0 và MIT. Mã nguồn hoàn toàn mở có nghĩa là bất kỳ nhà phát triển nào cũng có thể kiểm tra tính bảo mật của trình giả lập, đóng góp các bản sửa lỗi và tham gia vào quá trình phát triển, loại bỏ khả năng có các tính năng ẩn hoặc lỗ hổng có thể được các nhà phát triển doanh nghiệp đưa vào.

Tương thích với nhiều loại trình duyệt. Nhờ công nghệ WebAssembly, Ruffle được hỗ trợ bởi tất cả các trình duyệt hiện đại, bao gồm Google Chrome, Mozilla Firefox, Microsoft Edge, Safari, Opera, Brave và Vivaldi. Điều này đảm bảo trải nghiệm nhất quán với nội dung Flash bất kể sở thích của người dùng về công cụ trình duyệt (Chromium, Gecko hoặc WebKit).

Hỗ trợ trình duyệt di động (iOS và Android). Không giống như Adobe Flash Player gốc không bao giờ được hỗ trợ chính thức trên iOS và có hỗ trợ hạn chế trên Android, Ruffle hoạt động trên nền tảng di động. Điều này cho phép các trò chơi và hoạt hình Flash chạy trên điện thoại thông minh và máy tính bảng trực tiếp qua trình duyệt di động, mở ra quyền truy cập vào nội dung lưu trữ cho đối tượng người dùng di động.

Không yêu cầu cấu hình. Ruffle được thiết kế theo nguyên tắc "cài đặt và quên". Sau khi cài đặt tiện ích mở rộng hoặc chạy ứng dụng máy tính để bàn, trình giả lập không yêu cầu cấu hình phức tạp. Nó tự động phát hiện các tham số phát lại như kích thước sân khấu, tốc độ khung hình và loại tương tác, áp dụng các cài đặt tối ưu mà không cần sự can thiệp của người dùng.

Bảo vệ chống lại lỗ hổng Zero-Day. Bởi vì Ruffle không phải là plugin, không sử dụng API lỗi thời và mã nguồn được viết bằng Rust với trọng tâm là bảo mật, nó miễn nhiễm với các cuộc tấn công vốn đặc trưng của Adobe Flash Player. Điều này làm cho nó trở thành giải pháp lý tưởng cho các tổ chức phải duy trì quyền truy cập vào nội dung cũ nhưng không thể mạo hiểm với nguy cơ xâm phạm hệ thống.

Tương thích với nhiều phương pháp cài đặt khác nhau. Ruffle cung cấp một số phương pháp triển khai. Các nhà phát triển web có thể cài đặt nó như một tiện ích mở rộng tĩnh trong trình duyệt dựa trên Chromium (thông qua chế độ nhà phát triển) hoặc như một tiện ích tạm thời trong Firefox (thông qua about:debugging). Cũng có sẵn tích hợp thông qua việc chèn mã JavaScript đơn giản ở phía máy chủ.

Phát lại nội dung cả trực tuyến và ngoại tuyến. Phiên bản máy tính để bàn của Ruffle cho phép mở và phát các tệp SWF được lưu cục bộ trên máy tính. Điều này làm cho trình giả lập trở thành công cụ không thể thiếu cho các nhà sưu tập, nhà lưu trữ và nhà nghiên cứu làm việc với kho lưu trữ cục bộ của các trò chơi và hoạt hình Flash.

Hiệu suất kết xuất cao. Ruffle sử dụng API đồ họa hiện đại (như OpenGL, Vulkan, DirectX hoặc WebGL) thông qua các thư viện đa nền tảng. Điều này cung cấp khả năng tăng tốc phần cứng cho kết xuất đồ họa vector và raster, cho phép phát lại mượt mà ngay cả trên các thiết bị yếu hơn, nơi mà Flash Player gốc có thể bị giật lag.

Phát triển tích cực và cập nhật thường xuyên. Dự án đang trong giai đoạn phát triển tích cực. Các bản phát hành ra đều đặn và bao gồm cả bản sửa lỗi quan trọng cũng như mở rộng hỗ trợ API ActionScript. Ví dụ, các phiên bản gần đây đã sửa các trường hợp đặc biệt trong các phương thức String.indexOf và lastIndexOf, và xử lý chính xác chỉ số âm trong Array.indexOf.

Tích hợp với các kho lưu trữ và nền tảng lớn. Ruffle đã được chọn làm trình phát chính thức để phát nội dung Flash bởi những ông lớn như Internet Archive, Newgrounds, Coolmath Games và Armor Games. Điều này khẳng định mức độ tin cậy và khả năng tương thích cao của trình giả lập, cũng như khả năng hoạt động dưới tải lớn trong điều kiện thực tế.

Hỗ trợ lưu trò chơi và trạng thái. Giống như Flash Player gốc, Ruffle hỗ trợ Đối tượng chia sẻ cục bộ (LSO), được nhiều trò chơi sử dụng để lưu tiến trình. Trình giả lập mô phỏng chính xác các cơ chế đọc và ghi dữ liệu vào bộ nhớ này, đảm bảo tính toàn vẹn của việc lưu trong thời gian chạy của ứng dụng.

Mô phỏng chính xác thời gian và tốc độ khung hình. Ruffle mô phỏng chính xác bộ đếm thời gian nội bộ của Flash Player, điều này rất quan trọng đối với logic trò chơi và hoạt hình. Điều này đảm bảo đồng bộ hóa thích hợp các sự kiện, âm thanh và chuyển động của đối tượng, ngăn chặn các tình huống trò chơi chạy chậm hơn hoặc nhanh hơn bản gốc.

Hỗ trợ tương tác DOM và JavaScript (ExternalInterface). Đối với các ứng dụng web phức tạp sử dụng API ExternalInterface để trao đổi dữ liệu giữa ActionScript và JavaScript, Ruffle triển khai một cầu nối tương thích. Điều này cho phép trình giả lập xử lý chính xác các lệnh gọi hàm và truyền dữ liệu, bảo toàn tính tương tác của nội dung với trang web xung quanh.

Tự động co giãn và thích ứng độ phân giải. Khi phát nội dung Flash được tạo cho một độ phân giải cụ thể (ví dụ: 800x600), Ruffle tự động áp dụng các thuật toán co giãn để thích ứng với kích thước cửa sổ hiện tại của trình duyệt hoặc ứng dụng máy tính để bàn. Nó bảo toàn tỷ lệ và chất lượng hình ảnh, đồng thời xử lý chính xác các vùng tương tác của chuột.

Hỗ trợ nhiều định dạng đa phương tiện. Trình giả lập hỗ trợ giải mã nhiều định dạng đa phương tiện khác nhau có thể được nhúng trong tệp SWF, bao gồm MP3 cho âm thanh và nén video được sử dụng trong các phiên bản Flash sau này. Việc giải mã được thực hiện thông qua các thư viện hiệu suất cao được viết bằng Rust, giảm tải cho hệ thống.

Gỡ lỗi và ghi nhật ký nâng cao. Dành cho nhà phát triển và người dùng nâng cao, Ruffle cung cấp khả năng bật nhật ký chi tiết về hoạt động của máy ảo AVM1/AVM2. Điều này cho phép chẩn đoán các vấn đề tương thích, theo dõi lỗi trong mã ActionScript và hiểu các quy trình nội bộ của trình giả lập để điều chỉnh chính xác hơn.

Mô phỏng con trỏ và thành phần tương tác. Ruffle xử lý chính xác các thay đổi kiểu con trỏ được chỉ định bởi nội dung Flash. Ví dụ, đối với các thành phần tương tác như LoaderDisplay, trình giả lập tự động thay đổi con trỏ tiêu chuẩn thành con trỏ chỉ tay, mô phỏng hành vi của trình phát Flash gốc và cung cấp điều hướng quen thuộc cho người dùng.

Hỗ trợ bản dựng Nightly để truy cập sớm. Ngoài các bản phát hành ổn định, nhóm Ruffle cung cấp quyền truy cập vào các bản dựng Nightly thử nghiệm hàng ngày. Các bản dựng này chứa các bản sửa lỗi và cải tiến mới nhất chưa được đưa vào phiên bản ổn định.

Bảo tồn di sản văn hóa số. Đây không chỉ là một chức năng kỹ thuật, mà là mục tiêu cốt lõi của dự án. Ruffle được tạo ra như một công cụ để bảo tồn nội dung internet lịch sử. Nhờ khả năng hoạt động trong trình duyệt hiện đại mà không ảnh hưởng đến bảo mật, hàng triệu trò chơi, hoạt hình và ứng dụng Flash đáng lẽ đã bị mất vĩnh viễn sau khi Adobe Flash Player ngừng hoạt động vẫn có thể tiếp cận được cho các thế hệ tương lai.

12 Khả năng kỹ thuật ít được biết đến của Ruffle

  1. Sử dụng WGPU làm Backend kết xuất chính. Không giống như nhiều trình giả lập dựa vào OpenGL cũ, Ruffle sử dụng thư viện WGPU — một API đồ họa hiện đại, an toàn và đa nền tảng. Trên máy tính để bàn, WGPU tự động chọn backend cấp thấp tối ưu nhất: Vulkan, DirectX 12 hoặc Metal. Trong trình duyệt, nó có thể hoạt động qua WebGPU (nếu có) hoặc mô phỏng hoạt động thông qua WebGL với tổn thất hiệu suất tối thiểu.

  2. Hỗ trợ WebGPU trong trình duyệt để đạt hiệu suất tối đa. Đối với người dùng trình duyệt hiện đại (ví dụ: các phiên bản Chrome và Edge mới nhất), Ruffle có thể sử dụng API tiên tiến WebGPU. Điều này giảm đáng kể thời gian biên dịch shader và chi phí xử lý so với backend WebGL tiêu chuẩn, điều này rất quan trọng đối với đồ họa 3D phức tạp và ứng dụng Stage3D.

  3. Điều chỉnh Backend kết xuất chi tiết (canvas, webgl, wgpu-webgl). Ít người biết rằng hành vi kết xuất có thể được kiểm soát thủ công. Bên cạnh wgpu-webgl tiêu chuẩn, có tùy chọn để buộc bật:

    • webgl — backend cổ điển khởi tạo nhanh hơn và có thể hữu ích cho nội dung đơn giản không yêu cầu hiệu ứng bitmap phức tạp.

    • canvas — backend chậm nhất nhưng chính xác nhất. Đây là backend duy nhất co giãn chính xác các nét vẽ siêu mảnh (hairline) trong đồ họa vector, có thể xuất hiện quá dày khi sử dụng tăng tốc phần cứng.

  4. Mô phỏng Stage3D và biên dịch AGAL sang WGSL. Ruffle không chỉ hỗ trợ đồ họa 2D mà còn tăng tốc 3D thông qua API Stage3D (Context3D). Các shader được viết bằng AGAL (Adobe Graphics Assembly Language) được biên dịch "nhanh chóng" sang WGSL (WebGPU Shading Language) hoặc GLSL hiện đại. Điều này cho phép chạy các trò chơi và ứng dụng 3D phức tạp được tạo cho Flash Player 11 trở lên, sử dụng toàn bộ đường ống (pipeline) của shader có thể lập trình.

  5. Hỗ trợ fscommand để tương thích ngược. Ruffle đã giữ lại hỗ trợ cho cơ chế fscommand cũ nhưng quan trọng. Điều này cho phép các hoạt hình Flash cũ (được tạo trước ExternalInterface) tương tác với JavaScript trên trang, gửi lệnh và đối số tùy ý. Trong triển khai hiện đại của Ruffle, các lệnh này được xử lý thông qua onFSCommand, cho phép chức năng hoạt động ngay cả đối với nội dung web rất cũ.

  6. Bộ đệm kép (Double Buffering) cho Context3D. Khi làm việc với nội dung 3D, Ruffle sử dụng cơ chế bộ đệm kép phức tạp (back buffer / front buffer). Đây là một kỹ thuật hiệu suất tiêu chuẩn nhưng cực kỳ quan trọng, cho phép kết xuất khung hình tiếp theo trong bộ đệm nền trong khi khung hình hiện tại được hiển thị trên màn hình, loại bỏ hiện tượng xé hình (frame tearing) trong các trò chơi động.

  7. Công cụ đánh giá hiệu suất: ruffle_scannerexporter. Trong kho lưu trữ của Ruffle, có các công cụ tiện ích không được bao gồm trong bản dựng tiêu chuẩn nhưng có sẵn cho nhà phát triển:

    • ruffle_scanner — cho phép kiểm tra khả năng tương thích của trình giả lập với toàn bộ thư mục tệp SWF, tạo báo cáo CSV về mức độ phân tích cú pháp thành công.

    • exporter — công cụ để tạo hàng loạt ảnh chụp màn hình PNG từ các tệp SWF, có thể chạy ở chế độ không giao diện (headless), hữu ích cho kiểm thử tự động và tạo bản xem trước.

  8. Cô lập hoàn toàn thông qua Hộp cát Flatpak. Đối với người dùng Linux, có bản dựng Ruffle chính thức ở định dạng Flatpak. Đây không chỉ là một phương pháp cài đặt, mà còn là một lớp bảo mật bổ sung: ứng dụng chạy trong môi trường biệt lập, nơi tất cả các lưu trò chơi, cấu hình và nhật ký được lưu trữ nghiêm ngặt trong thư mục nhà của Flatpak (~/.var/app/rs.ruffle.Ruffle/), không có quyền truy cập vào phần còn lại của hệ thống.

  9. Hỗ trợ tích hợp qua Homebrew và Scoop. Đối với người dùng có kinh nghiệm, Ruffle cung cấp các phương pháp cài đặt nâng cao ngoài tải xuống thủ công. Trên macOS, nó có thể được cài đặt qua Homebrew (brew install --HEAD ruffle-rs/ruffle/ruffle), cho phép tự động cập nhật lên bản dựng nightly mới nhất. Trên Windows, trình quản lý gói Scoop phục vụ chức năng tương tự.

  10. Hệ thống lưu trữ dữ liệu minh bạch (SharedObjects). Ruffle mô phỏng chính xác hệ thống lưu trữ cục bộ của Flash (LSO — Đối tượng chia sẻ cục bộ). Tuy nhiên, không giống như trình phát độc quyền, vị trí của các tệp này được chuẩn hóa và minh bạch với người dùng. Trên Windows, chúng nằm trong %AppData%\Local\Ruffle\SharedObjects\, trên Linux — trong ~/.local/share/ruffle/SharedObjects/. Điều này cho phép sao lưu thủ công các lưu trò chơi từ các trò chơi cũ.

  11. Cấu hình qua API JavaScript và Cài đặt Toàn cục. Đối với nhà phát triển web, Ruffle cung cấp một API JavaScript mạnh mẽ, cho phép không chỉ nhúng trình phát mà còn điều khiển trạng thái của nó. Có sẵn các phương thức để tải SWF theo chương trình (load), điều khiển âm lượng (volume), tạm dừng (suspend/resume), và chặn đầu ra trace() từ ActionScript để gỡ lỗi thông qua traceObserver.

  12. Tự động ký số và chứng thực (notarization) cho bản dựng macOS. Trong quy trình CI/CD, tất cả các bản dựng nightly của Ruffle cho macOS đều trải qua ký mã và chứng thực bởi Apple. Điều này có nghĩa là ngay cả các phiên bản không ổn định của trình giả lập cũng sẽ không bị Gatekeeper chặn dưới dạng phần mềm không an toàn, đảm bảo hoạt động không gặp rắc rối trên các phiên bản macOS mới nhất, nơi các yêu cầu bảo mật rất nghiêm ngặt.