Gỡ lỗi ứng dụng Android dựa trên thẻ ANR trong trang tổng quan Crashlytics

Lỗi Ứng dụng không phản hồi (ANR) được kích hoạt khi luồng giao diện người dùng của ứng dụng không phản hồi trong hơn 5 giây. Bạn có thể đọc thêm về lỗi ANR và cách chẩn đoán lỗi ANR trong tài liệu về Android.

Ngoài ra, Crashlytics có thể giúp xác định chính xác các luồng có vấn đề. Chúng ta phân tích các lỗi ANR, sau đó, trong trang tổng quan Crashlytics, chúng ta gắn thẻ các luồng có thể áp dụng để đưa ra gợi ý về cách gỡ lỗi ANR.

Các phần sau trên trang này giải thích ý nghĩa của từng thẻ ANR, hiển thị một lỗi ANR mẫu với thẻ đó và cung cấp giải pháp được đề xuất để gỡ lỗi ANR.

Triggered ANR

Một luồng đã bị chặn quá lâu và kích hoạt ANR sẽ được chú thích bằng thẻ Triggered ANR này.

Luồng có vấn đề có thể là luồng chính của ứng dụng, hoặc bất kỳ luồng nào được phát hiện là không phản hồi. Tuy nhiên, luồng được gắn thẻ là Triggered ANR có thể là hoặc không phải là nguyên nhân thực tế gây ra lỗi ANR. Để cung cấp thông tin chi tiết về cách gỡ lỗi và khắc phục những lỗi ANR này, Crashlytics cũng gắn thẻ mọi luồng khác có liên quan đến lỗi ANR. Trong các phần sau của trang này, hãy tìm hiểu về các thẻ khác có thể được áp dụng cho luồng.

Deadlocked

Mọi luồng được phát hiện có liên quan đến tình trạng tắc nghẽn dẫn đến ANR đều được chú thích bằng thẻ Deadlocked này.

Tình trạng tắc nghẽn sẽ xảy ra khi một luồng chuyển sang trạng thái chờ vì một tài nguyên cần thiết được giữ lại trong một luồng khác, đồng thời đang chờ tài nguyên do luồng đầu tiên lưu giữ. Nếu luồng chính của ứng dụng rơi vào trường hợp này, thì nhiều khả năng lỗi ANR sẽ xảy ra.

Đề xuất

Xem xét các luồng liên quan đến tình trạng tắc nghẽn và kiểm tra tài nguyên/khoá mà những luồng đó thu nạp được. Hãy tham khảo bài viết về Tắc nghẽnThuật toán ngăn chặn tắc nghẽn để biết các giải pháp khả thi.

IO Root blocking

Bất kỳ luồng nào đang thực thi các thao tác nhập/xuất (I/O) chậm và đã chặn luồng Triggered ANR đều được chú thích bằng thẻ IO Root blocking. Nếu luồng Triggered ANR không bị các luồng khác chặn, thì luồng IO Root blocking cũng là luồng Root blocking.

Đề xuất

Nhìn chung, ứng dụng của bạn không nên thực thi các thao tác I/O tốn kém trên luồng chính. Trong trường hợp luồng chính là IO Root blocking, bạn cũng có thể sử dụng Chế độ nghiêm ngặt để xác định mọi thao tác I/O ngoài ý muốn đang diễn ra trên luồng chính.

Root blocking

Bất kỳ luồng nào đã chặn luồng được gắn thẻ là Triggered ANR đều được chú thích bằng thẻ Root blocking. Nếu một luồng được gắn thẻ là cả Root blockingTriggered ANR, thì sẽ không có luồng nào khác chặn luồng đó.

Nếu bất kỳ luồng Triggered ANR nào đang chờ (có thể là gián tiếp) các luồng khác, thì các luồng đó là Root blocking. Có thể có nhiều lý do khiến một luồng là nguyên nhân gốc gây ra lỗi ANR.

Đề xuất

Giảm thiểu công việc nặng về CPU trong luồng chính. Sử dụng luồng worker hoặc luồng trong nền để thực hiện các tác vụ nặng về CPU.

Giảm thiểu công việc chuyên sâu về I/O, chẳng hạn như tải từ cơ sở dữ liệu, trên luồng chính.

Unknown root cause

Một luồng được gắn thẻ bằng thẻ Unknown root cause nếu đó là luồng đã kích hoạt ANR nhưng không hoạt động trong quá trình xảy ra lỗi ANR. Crashlytics không có đủ thông tin để xác định nguyên nhân gốc rễ. Không có bằng chứng về lý do khiến ANR này xảy ra.

Đề xuất

Hãy làm theo lời khuyên chung về cách ngăn chặn lỗi ANR. Ví dụ: xác định các vị trí trong mã của bạn nơi luồng chính của ứng dụng có thể bận trong hơn 5 giây.