AllianceProject Handbook
← Thuật ngữ

Hiệu năng và thiết bị

ANR

viết đầy đủ là Application Not Responding

còn gọi là app không phản hồi

Android kết luận app treo vì luồng giao diện bị chặn quá lâu, và mời người dùng tắt app. iOS không có ANR — chỗ đó gọi là hang, đo bằng thước khác.

ANR không phải crash — app vẫn sống, chỉ là không trả lời kịp. Android chờ khoảng năm giây cho một thao tác chạm, rồi hiện hộp thoại đề nghị đóng app.

Nguyên nhân gần như luôn giống nhau, và giống nhau trên cả hai nền tảng: một việc nặng chạy trên luồng giao diện. Đọc ghi file lớn, gọi mạng đồng bộ, truy vấn cơ sở dữ liệu, giải mã ảnh.

≤ 0,2%

ngưỡng nội bộ cho ANR rate

0,47%

mức Google Play coi là quá ngưỡng

5 giây

thời gian Android chờ trước khi kết luận

iOS không có ANR

Chữ ANR là của riêng Android: hộp thoại đó do Android dựng, mốc năm giây do Android đặt, con số ANR rate do Android vitals đếm. iOS không có cái nào trong ba thứ đó. Cùng một lỗi chặn luồng giao diện, trên iOS cho hai kết cục khác nhau tuỳ thời điểm bị chặn:

Đơ lúc app đang chạy — hang

  • Hệ điều hành không hiện hộp thoại, cũng không giết app
  • Màn hình đứng im tới khi việc nặng xong, hoặc tới khi người dùng tự vuốt tắt app
  • Apple tính là hang khi luồng giao diện bị chặn từ 250ms — chặt hơn Android hai mươi lần
  • Xcode Organizer báo hang rate: số giây đơ trên mỗi giờ dùng, kèm mức trung vị và mức P90

Đơ lúc chuyển trạng thái — watchdog

  • Lúc khởi động, lúc quay lại từ nền, lúc bị đưa xuống nền
  • Hệ điều hành giết thẳng app, không hỏi người dùng
  • Vào thẳng crash report với mã kết thúc 0x8badf00d
  • Hạn mức Apple không công bố; crash report thực tế cho thấy khoảng 20 giây cho lần khởi động, 10 giây cho một lần chuyển scene

Hai thước đo, không đọc lẫn nhau được

Android
iOS
Mốc bắt đầu tính
5 giây, tính từ thao tác chạm
250ms, tính từ lúc luồng giao diện kẹt
Hệ điều hành làm gì
Hiện hộp thoại đề nghị đóng app
Không làm gì — trừ lúc chuyển trạng thái thì giết app
Số đọc ở đâu
Android vitals trong Play Console
Xcode Organizer, MetricKit
Ngưỡng của cửa hàng
ANR rate từ 0,47% là quá ngưỡng
Apple không công bố ngưỡng nào

Dòng cuối là chỗ dễ mắc kẹt nhất. Android có một con số cứng để đối chiếu, iOS thì không — nên ngưỡng nội bộ cho iOS phải neo vào chính bản đang chạy: hang rate của bản mới cao hơn bản trước là tín hiệu chặn, dù không ai công bố bao nhiêu là nhiều. Cách đọc này nằm trong bảng giám sát production, ngân sách kèm theo nằm ở performance budget.

Với người dùng thì không nền tảng nào đỡ hơn: crash đóng nhanh rồi mở lại được, còn đơ bắt họ ngồi nhìn một màn hình chết mà không biết nên chờ hay nên tắt.

Bài dùng thuật ngữ này