Chuyển đến nội dung chính

Rejourney: session replay và báo cáo crash mã nguồn mở cho Flutter

Rejourney là nền tảng mã nguồn mở cho session replay, phân tích sản phẩm và báo cáo crash/ANR, với một SDK Flutter được làm kỹ hơn phần lớn sản phẩm cùng loại. 277★, cập nhật lần cuối 2026-08-28.

Rejourney là gì?

Phần lớn nhóm gỡ lỗi vấn đề chuyển đổi bằng ba công cụ rời rạc: một dashboard phân tích nói rằng phễu bị rớt, một trình báo crash nói rằng có gì đó văng lỗi, và một sản phẩm session replay cho xem một buổi chiều của một người dùng. Việc nối chúng lại với nhau là làm tay.

Tiền đề của Rejourney là giữ tất cả ở một chỗ. Bạn gắn vài sự kiện chuyển đổi trọng yếucheckout_started, purchase_completed — và nó ghi lại hành trình xung quanh, dữ liệu tương tác (chạm, cuộn, kéo, rage tap) và bằng chứng kỹ thuật (độ trễ và mã trạng thái API, lỗi, vết crash, ANR). Các phiên giống nhau được gom thành nhóm, và khi một nhóm diễn biến xấu quanh một sự kiện chuyển đổi, các bản replay cùng bằng chứng nổi lên thành một vấn đề đã xếp hạng.

Bên cạnh bàn làm việc replay là bản đồ hành trình, heatmap tương tác, khung nhìn theo endpoint, nhóm theo thiết bị và địa lý, cùng phân tích cấp dự án về mức độ áp dụng phiên bản, tỉ lệ giữ chân và — nếu có nối nguồn doanh thu — tác động doanh thu.

Vì sao SDK Flutter đáng xem

Nhiều sản phẩm phân tích chỉ gắn một lớp bọc Dart mỏng lên SDK native. Rejourney chia theo hướng ngược lại: phần thu thập chạy trong code native, còn API công khai, tích hợp điều hướng, lớp che dữ liệu, hook lỗi và HTTP client đều là Flutter đúng chất.

Điều đó thể hiện ở các chi tiết:

  • RejourneyNavigatorObserver cắm vào navigatorObservers và xử lý push, pop, replace, remove, đồng thời loại bỏ tên màn hình trùng lặp. Với Router khai báo, bạn gọi Rejourney.trackScreen('checkout') từ callback đổi route thay thế.
  • RejourneyMask che một nhánh widget do Flutter vẽ khỏi khung hình được ghi mà không đổi những gì người dùng thấy, đồng thời theo dõi thay đổi bố cục, cuộn và hủy widget.
  • RejourneyHttpClient bọc package:http để ghi phương thức, URL, trạng thái, thời gian, kiểu nội dung và kích thước byte — không ghi nội dung. Với Dio, gRPC hay GraphQL, bạn gọi Rejourney.logNetworkRequest(...) từ một interceptor.
  • RejourneyErrorCapture.install() đặt trước runApp.

Đường thu thập trên Android xứng đáng được nhắc riêng. Một số tổ hợp bộ kết xuất và thiết bị báo PixelCopy thành công nhưng trả về một ảnh bitmap đen hoàn toàn. Thay vì bảo bạn đổi chế độ kết xuất, SDK phát hiện cái “thành công giả” đó và chuyển sang ghi cây layer lưu giữ của Flutter ở độ phân giải thấp hơn, để yên FlutterSurfaceView đang chạy. getSdkMetrics().lastCaptureSource cho biết đường nào đang hoạt động. Đó là loại vấn đề chỉ sửa được sau khi đã phát hành lên máy thật.

Bắt đầu

flutter pub add rejourney

Yêu cầu tối thiểu: Flutter 3.22, Dart 3.3, iOS 15.1, Android API 24. Trên một app iOS có sẵn, bạn có thể cần cd ios && pod install.

import 'package:rejourney/rejourney.dart';

await Rejourney.init('pk_live_your_public_key');
await Rejourney.start();

init không bao giờ bắt đầu thu thập — sự tách biệt đó tồn tại để bạn chờ được sự đồng ý:

if (await consentStore.canRecord()) {
  final result = await Rejourney.start();
  debugPrint('session=${result.sessionId} replay=${!result.telemetryOnly}');
}

Gọi Rejourney.stop() nếu người dùng rút lại sự đồng ý. Sau đó thêm navigator observer, bọc các ô nhập nhạy cảm trong RejourneyMask, và ghi các sự kiện chuyển đổi của bạn:

await Rejourney.logEvent('purchase_completed', <String, Object?>{
  'transactionId': order.id,
  'amount': order.total,
  'currency': 'USD',
});

Khi nào nên dùng Rejourney?

  • bạn muốn replay, phân tích và báo cáo crash được liên hệ với nhau thay vì nằm ở ba tab
  • ANR và crash native quan trọng với bạn không kém gì ngoại lệ ở tầng Dart
  • quy định về nơi lưu dữ liệu hoặc chi phí khiến bạn không dùng được dịch vụ phân tích thuê ngoài
  • bạn cần che dữ liệu theo từng widget chứ không phải một công tắc “ẩn hết chữ” toàn cục

Điểm còn hạn chế

Giấy phép là kép, và ranh giới đó quan trọng. SDK client, ví dụ và tài liệu theo Apache 2.0 — an toàn để phát hành. Backend và dashboard theo SSPL 1.0: dùng nội bộ thì ổn, nhưng nếu bạn cung cấp Rejourney như một dịch vụ thì phải công bố mã nguồn dịch vụ của mình. Ai đang hiểu “mã nguồn mở” đồng nghĩa với “không ràng buộc gì” thì nên đọc file LICENSE trước khi xây sản phẩm trên nó.

Tự host một backend replay cũng không phải việc làm trong một cuối tuần. Bạn đang vận hành khâu nạp dữ liệu, lưu trữ và một dashboard cho loại dữ liệu gần như video, và hóa đơn lưu trữ tăng theo lưu lượng chứ không theo quy mô nhóm.

Dự án cũng thành thật rằng các báo cáo vấn đề của nó mang tính suy đoán — một mẫu hình được báo là “điểm khởi đầu để điều tra, không phải bằng chứng nhân quả”. Hãy xem trọng điều đó. Một tương quan theo nhóm cộng một gợi ý sửa chỉ là giả thuyết, và triển khai nó mà không đối chiếu với trạng thái sản phẩm hay thanh toán có thẩm quyền chính là cách người ta tự tin sửa nhầm chỗ.

Cuối cùng: session replay trên một sản phẩm thật là quyết định về quyền riêng tư trước khi là quyết định kỹ thuật. Sự đồng ý, việc che dữ liệu và kiểm thử replay trên đúng các luồng đăng nhập, thanh toán và sức khỏe mà bạn phát hành không phải phần tùy chọn.

Các lựa chọn đáng so sánh

Câu hỏi thường gặp

Thêm Rejourney vào ứng dụng Flutter thế nào?

flutter pub add rejourney, rồi await Rejourney.init('pk_live_...') lúc khởi động và await Rejourney.start() chỉ sau khi bạn đã có quyết định về sự đồng ý. init cố tình không bao giờ bắt đầu thu thập. Yêu cầu tối thiểu là Flutter 3.22, Dart 3.3, iOS 15.1 và Android API 24.

Rejourney có thật sự là mã nguồn mở không?

Một phần, và họ nói thẳng điều đó. API Flutter, cầu nối nền tảng, lõi native, ví dụ và tài liệu theo Apache 2.0. Backend và dashboard theo SSPL 1.0 — tự chạy nội bộ thì miễn phí, nhưng nếu cung cấp nó như một dịch vụ thì bạn buộc phải công bố mã nguồn dịch vụ của mình.

Nó xử lý các trường dữ liệu nhạy cảm ra sao?

Bọc nhánh widget trong RejourneyMask, nó che một vùng trong khung hình được ghi mà không thay đổi những gì người dùng nhìn thấy. Lớp này nằm trên cơ chế nhận diện trường bảo mật ở tầng native và các quy tắc riêng tư về văn bản, media ở cấp dự án; chính sách từ xa chỉ có thể làm việc thu thập chặt hơn, không bao giờ lỏng hơn.

Session replay có chạy ổn định trên Android không?

Phần lớn là có. Một số tổ hợp bộ kết xuất và thiết bị báo PixelCopy thành công nhưng trả về ảnh đen; từ 0.2.1 SDK phát hiện được điều đó và chuyển sang ghi lại cây layer lưu giữ của Flutter ở độ phân giải thấp hơn. Hãy kiểm tra getSdkMetrics().lastCaptureSource khi kiểm chứng trên một thiết bị.

Tài nguyên & liên kết


Thuộc FlutterCook — hướng dẫn thực hành về các thư viện, UI kit và ứng dụng Flutter mã nguồn mở tốt nhất. Xem xu hướng GitHub hoặc hướng dẫn YouTube.


Bài viết gốc đăng tại FlutterCook. Bản trên đó là bản được cập nhật mới nhất.

Nhận xét

Bài đăng phổ biến từ blog này

5 concepts every Flutter dev should know

  Phụ lục: State management architecture Testing IDE Shortcuts Platform channel Maintaining a project Tôi đã làm việc với Flagship trong một thời gian dài, và đây là những điều mà tôi phát hiện ra là điều cần phải có đối với bất kỳ nhà phát triển Flagship nào, về tổng thể nó sẽ khiến bạn trở thành một nhà phát triển Flagship giỏi trong thời gian dài. 1. State management architecture Đây là một trong những chủ đề quan trọng nhất trong cộng đồng thiết bị rung, nó khá quan trọng nếu bạn muốn duy trì một dự án rung kích thước trung bình hoặc lớn. Nó sẽ giúp tạo một dự án suôn sẻ và thêm các tính năng mới một cách hoàn hảo.  2. Testing Đây là một chủ đề duy nhất mà tôi không hiểu tại sao nó lại quan trọng trước đó trong sự nghiệp của tôi, nhưng khi tôi tiến lên trong sự nghiệp của mình và có kinh nghiệm với nhiều dự án và vấn đề xảy ra trong môi trường sản xuất. Tôi đã nhận ra một cách khó khăn, tại sao điều này lại quan trọng như vậy. Nếu bạn vẫn muốn có thêm lý do để cân nhắc thử...

Thiết kế giao diện với DotNetBar (Phần 1)

Đây là phiên bản DotNetBar hỗ trợ C# và Visual Basic https://www.dropbox.com/s/wx80jpvgnlrmtux/DotNetBar.rar  , phiên bản này hỗ trợ giao diện Metro cực kỳ “dễ thương” Các bạn load về và cài đặt, khi cài đặt xong sẽ có source code mẫu của tất cả các control. Để sử dụng được các control của DotNetBar các bạn nhớ add item vào controls box. Thiết kế giao diện với DotNetBar, giao diện sẽ rất đẹp. Link các video hướng dẫn chi tiết cách sử dụng và coding: http://www.devcomponents.com/dotnetbar/movies.aspx Hiện tại DotNetBar có rất nhiều công cụ cực mạnh, trong đó có 3 công cụ dưới đây: DotNetBar for Windows Forms Requires with Visual Studio 2003, 2005, 2008, 2010 or 2012.   DotNetBar for WPF Requires with Visual Studio 2010 or 2012 and Windows Presentation Foundation.   DotNetBar for Silverlight Requires with Visual Studio 2010 or 2012 and Silverlight. Dưới đây là một số hình ảnh về các control trong DotnetBar.   Metro User Interface  controls with Metro Tiles, toolba...

Announcing Flutter 2

  Phụ lục: Flutter on the web Flutter 2 on desktops, foldables, and embedded devices The growing Flutter ecosystem Dart: The secret sauce behind Flutter Flutter 2: Available now Hôm nay, chúng tôi sẽ công bố Flutter 2: một bản nâng cấp lớn cho Flutter cho phép các nhà phát triển tạo các ứng dụng đẹp, nhanh chóng và di động cho bất kỳ nền tảng nào. Với Flutter 2, bạn có thể sử dụng cùng một cơ sở mã để gửi các ứng dụng gốc cho năm hệ điều hành: IOS, Android, Windows, macOS và Linux; cũng như trải nghiệm web nhắm mục tiêu các trình duyệt như Chrome, Firefox, Safari hoặc Edge. Flutter thậm chí có thể được nhúng vào ô tô, TV và thiết bị gia dụng thông minh, mang đến trải nghiệm di động và lan tỏa nhất cho thế giới điện toán xung quanh. Mục tiêu của chúng tôi là thay đổi cơ bản cách các nhà phát triển nghĩ về việc xây dựng ứng dụng, bắt đầu không phải với nền tảng bạn đang nhắm mục tiêu mà là với trải nghiệm bạn muốn tạo. Flutter cho phép bạn tạo ra những trải nghiệm tuyệt đẹp trong đó ...