Debug ứng dụng Android từ xa khi không có cáp USB
“Máy em bị, máy anh không bị.” Câu nói quen thuộc này là nỗi ám ảnh của lập trình viên khi lỗi chỉ xuất hiện trên một thiết bị mà mình không cầm trong tay. Bài viết điểm qua các cách lấy thông tin debug từ thiết bị ở xa và khi nào nên dùng cách nào.
Vì sao debug từ xa lại khó?
Cách debug quen thuộc nhất trên Android là cắm cáp USB, bật gỡ lỗi USB rồi xem log bằng adb logcat hoặc Android Studio. Nhưng trong thực tế, rất nhiều tình huống không cho phép điều đó:
- Người kiểm thử làm việc ở văn phòng khác hoặc từ xa.
- Lỗi chỉ xảy ra trên thiết bị của khách hàng, ở mạng của khách hàng.
- Thiết bị chuyên dụng như TV box, máy POS, kiosk được lắp cố định, khó tiếp cận cổng USB.
- Lỗi phụ thuộc vào ngữ cảnh như đang di chuyển, mạng yếu, pin yếu, nên không thể tái hiện tại bàn làm việc.
Thêm vào đó, từ Android 4.1, một ứng dụng thông thường chỉ đọc được log do chính nó ghi ra. Bạn không thể đơn giản cài một ứng dụng để thu toàn bộ log hệ thống của người dùng. Đây là thay đổi bảo vệ quyền riêng tư, và các phương án dưới đây đều phải tuân theo giới hạn này.
Phương án 1: adb qua Wi-Fi
Từ Android 11, tính năng Gỡ lỗi không dây (Wireless debugging) cho phép kết nối adb mà không cần cáp:
- Bật Tùy chọn nhà phát triển, sau đó bật Gỡ lỗi không dây.
- Chọn “Ghép nối thiết bị bằng mã ghép nối” để lấy địa chỉ IP, cổng và mã.
- Trên máy tính chạy
adb pair <ip>:<cổng>và nhập mã, sau đóadb connect <ip>:<cổng>.
Với Android cũ hơn, bạn có thể cắm cáp một lần, chạy adb tcpip 5555, rồi rút cáp và kết nối bằng adb connect <ip>:5555.
Ưu điểm: có đầy đủ sức mạnh của adb, xem được log toàn hệ thống.
Nhược điểm: máy tính và thiết bị phải cùng mạng nội bộ; người giữ thiết bị phải bật tùy chọn nhà phát triển, điều khó yêu cầu ở khách hàng; không dùng được qua Internet nếu không thiết lập thêm hạ tầng.
Phương án 2: Công cụ báo cáo crash
Các dịch vụ như Firebase Crashlytics tự động thu thập stack trace khi ứng dụng bị crash, kèm thông tin thiết bị và một số log tùy chỉnh trước thời điểm crash.
Ưu điểm: hoạt động âm thầm trên hàng nghìn thiết bị, thống kê lỗi theo phiên bản và dòng máy.
Nhược điểm: tập trung vào crash; với lỗi logic, giao diện sai hay luồng nghiệp vụ không đúng thì gần như không có thông tin; dữ liệu đến sau, không theo thời gian thực.
Phương án 3: Ghi log ra file rồi gửi
Ứng dụng tự ghi log của mình vào một tệp trong bộ nhớ riêng, sau đó có nút “Gửi log” để chia sẻ qua email hay chat.
Ưu điểm: đơn giản, không phụ thuộc mạng lúc lỗi xảy ra.
Nhược điểm: vòng phản hồi chậm; thường thiếu đúng đoạn cần xem; phải quản lý dung lượng tệp; người dùng phải thao tác thêm.
Phương án 4: Truyền log theo thời gian thực
Ứng dụng gửi log của chính nó qua mạng tới một trang mà lập trình viên đang mở. Đây là cách HVTD-9803 LogCat hoạt động: thư viện tích hợp trong bản debug đọc log của ứng dụng, app Listener trên cùng thiết bị gửi log về máy chủ, máy chủ chuyển tiếp ngay tới trình duyệt của bạn. Cách tích hợp xem tại Tích hợp Android.
Ưu điểm: thấy log ngay khi người dùng thao tác, có thể hướng dẫn họ “bấm lại nút đó” trong lúc cùng theo dõi; hoạt động qua Internet, không cần chung mạng; không cần bật tùy chọn nhà phát triển.
Nhược điểm: chỉ có log của ứng dụng tích hợp; cần kết nối mạng trong lúc debug; phải chú ý bảo mật đường truyền vì log có thể chứa thông tin nội bộ.
Về mặt bảo mật, HVTD-9803 LogCat trao đổi khóa phiên bằng RSA và mã hóa từng gói log bằng AES-256-GCM. Bạn có thể đọc chi tiết trong bài Bảo vệ log khi truyền qua mạng.
Nên chọn phương án nào?
| Tình huống | Phương án phù hợp |
|---|---|
| Thiết bị ngay trong văn phòng, cùng mạng | adb qua Wi-Fi |
| Theo dõi crash trên toàn bộ người dùng thật | Công cụ báo cáo crash |
| Người dùng gặp lỗi lúc không có ai hỗ trợ | Ghi log ra file rồi gửi |
| QA hoặc khách hàng ở xa, cần tái hiện lỗi cùng nhau | Truyền log theo thời gian thực |
Trong thực tế, các phương án này bổ sung cho nhau. Một quy trình hiệu quả thường dùng công cụ báo cáo crash để phát hiện vấn đề, rồi dùng truyền log thời gian thực để tái hiện và tìm nguyên nhân cùng người kiểm thử.
Mẹo để buổi debug từ xa hiệu quả
- Chuẩn bị log trước. Đảm bảo các luồng quan trọng có log Info và Error rõ ràng; xem bài Các mức độ log trong Android.
- Xóa log trước khi tái hiện. Bắt đầu với bảng log trống để chỉ còn lại những dòng liên quan.
- Mô tả từng thao tác. Nhờ người kiểm thử nói to từng bước họ làm, bạn sẽ khớp được thao tác với log.
- Đánh dấu mốc thời gian. Ghi lại giờ phút khi lỗi xuất hiện để tìm nhanh trong log.
- Kết thúc phiên khi xong. Đừng để kết nối log mở khi không cần thiết.
Tóm tắt
Không có phương án debug từ xa nào phù hợp với mọi trường hợp. Hiểu rõ ưu nhược điểm của adb qua Wi-Fi, báo cáo crash, gửi file log và truyền log thời gian thực sẽ giúp bạn chọn đúng công cụ và rút ngắn thời gian từ lúc nhận báo lỗi đến lúc sửa xong.