Gỡ lỗi ANR

Việc giải quyết lỗi ANR trong trò chơi Unity là một quy trình có hệ thống:

Hình 1. Các bước giải quyết lỗi ANR trong trò chơi Unity.

Tích hợp dịch vụ báo cáo

Các dịch vụ báo cáo như Android vitals, Firebase CrashlyticsBacktrace (một đối tác Unity được chứng nhận) cung cấp tính năng ghi nhật ký và phân tích lỗi cho trò chơi của bạn trên quy mô lớn. Tích hợp SDK dịch vụ báo cáo vào trò chơi ngay từ đầu chu kỳ phát triển. Phân tích xem dịch vụ báo cáo nào phù hợp nhất với nhu cầu và ngân sách của trò chơi.

Các dịch vụ báo cáo khác nhau có những cách khác nhau để ghi lại lỗi ANR. Thêm dịch vụ báo cáo thứ hai để tăng cơ hội lấy được dữ liệu hợp lệ nhằm hỗ trợ cho quyết định khắc phục lỗi ANR.

Việc tích hợp SDK báo cáo không ảnh hưởng đến hiệu suất trò chơi hoặc kích thước APK.

Phân tích ký hiệu

Phân tích các báo cáo từ dịch vụ báo cáo của bạn và kiểm tra xem dấu vết ngăn xếp có ở định dạng mà con người có thể đọc được hay không. Hãy xem bài viết Thay thế sự cố và lỗi ứng dụng không phản hồi (ANR) trên Android bằng biểu tượng cho trò chơi Unity để biết thêm thông tin.

Hình 2. Crashlytics cho thấy mã bản dựng và thiếu ký hiệu libil2cpp.so.

Cách kiểm tra mã bản dựng biểu tượng

Nếu hệ thống báo cáo cho thấy mã bản dựng bị thiếu nhưng các biểu tượng bản dựng vẫn tồn tại trong bộ nhớ của máy tạo bản dựng, thì bạn có thể kiểm tra mã bản dựng của các biểu tượng rồi tải các biểu tượng đó lên dịch vụ báo cáo. Nếu không, bạn cần phải tạo một bản dựng mới để tải các tệp biểu tượng lên.

Trên Windows hoặc macOS:

  1. Chuyển đến thư mục biểu tượng dựa trên phần phụ trợ tập lệnh (xem Giải pháp:)
    1. Sử dụng lệnh sau (trên Windows, hãy sử dụng Cygwin để chạy tiện ích readelf)
    2. Không bắt buộc sử dụng Grep để lọc đầu ra văn bản
    3. Tìm Build ID (Mã bản dựng)
readelf -n libil2cpp.so | grep 'Build ID'
Build ID: b42473fb7449e44e0182dd1f580c99bab0cd8a95

Kiểm tra mã trò chơi

Khi dấu vết ngăn xếp hiển thị một hàm trong thư viện libil2cpp.so, lỗi đã xảy ra trong mã C#, được chuyển đổi thành C++. Thư viện libil2cpp.so không chỉ có mã trò chơi mà còn có các trình bổ trợ và gói.

Tên tệp C++ tuân theo tên tập hợp được xác định trong dự án Unity. Nếu không, tên tệp sẽ có tên Assembly-C# mặc định. Ví dụ: Hình 3 cho thấy lỗi trên tệp Game.cpp (được đánh dấu bằng màu xanh dương), đây là tên được xác định trong tệp "assembly Definition" (Định nghĩa cấu hình). Logger là tên lớp (được làm nổi bật bằng màu đỏ) trong tập lệnh C#, theo sau là tên hàm (được làm nổi bật bằng màu xanh lục). Cuối cùng là tên đầy đủ mà trình chuyển đổi IL2CPP đã tạo (được làm nổi bật bằng màu cam).

Hình 3. Kiểm thử ngăn xếp lệnh gọi dự án từ tính năng Theo dõi ngược.

Hãy kiểm tra mã trò chơi của bạn bằng cách thực hiện các bước sau:

  • Kiểm tra dự án C# để tìm mã đáng ngờ. Thông thường, các ngoại lệ chưa được xử lý của C# không gây ra lỗi ANR hoặc sự cố ứng dụng. Tuy nhiên, hãy đảm bảo mã chạy đúng cách trong nhiều tình huống. Kiểm tra xem mã có sử dụng mô-đun công cụ của bên thứ ba hay không và phân tích xem bản phát hành gần đây có gây ra lỗi hay không. Ngoài ra, hãy xem xét xem gần đây bạn có cập nhật Unity hay không hoặc lỗi này chỉ xảy ra trên một số thiết bị cụ thể hay không.
  • Xuất trò chơi dưới dạng một dự án Android Studio. Với quyền truy cập đầy đủ vào mã nguồn C# đã chuyển đổi của trò chơi, bạn có thể tìm thấy hàm gây ra lỗi ANR. Mã C++ trông rất khác với mã C# và việc chuyển đổi mã hiếm khi gặp vấn đề. Nếu bạn tìm thấy vấn đề, hãy gửi phiếu yêu cầu hỗ trợ cho Unity.
  • Xem xét mã nguồn trò chơi và đảm bảo rằng mọi logic đang chạy trong lệnh gọi lại OnApplicationFocus()OnApplicationPause() đều được dọn dẹp đúng cách.
    • Công cụ Unity có thời gian chờ để tạm dừng quá trình thực thi; khối lượng công việc quá tải trên các lệnh gọi lại này có thể gây ra lỗi ANR.
    • Thêm nhật ký hoặc đường dẫn cố định vào các phần của mã để cải thiện khả năng phân tích dữ liệu.
  • Sử dụng Trình phân tích tài nguyên Unity để điều tra hiệu suất của trò chơi. Việc phân tích tài nguyên ứng dụng cũng có thể là một cách hay để xác định những nút thắt cổ chai có thể gây ra lỗi ANR.
  • Một cách hay để xác định các thao tác I/O dài trên luồng chính là sử dụng chế độ nghiêm ngặt.
  • Phân tích Android Vitals hoặc nhật ký dịch vụ báo cáo khác và kiểm tra các phiên bản phát hành của trò chơi thường xảy ra lỗi nhất. Xem lại mã nguồn trong nhật ký kiểm soát phiên bản và so sánh các thay đổi về mã giữa các bản phát hành. Nếu bạn phát hiện thấy điều gì đó đáng ngờ, hãy thử nghiệm từng thay đổi hoặc cách khắc phục tiềm năng.
  • Kiểm tra nhật ký báo cáo lỗi ANR của Google Play cho các thiết bị và phiên bản Android nhận được nhiều lỗi ANR nhất. Nếu thiết bị hoặc phiên bản đã lỗi thời, bạn có thể bỏ qua chúng một cách an toàn nếu việc này không ảnh hưởng đến khả năng sinh lời của trò chơi. Hãy nghiên cứu kỹ dữ liệu vì một nhóm người dùng cụ thể sẽ không thể chơi trò chơi của bạn nữa. Để biết thêm thông tin, hãy xem bài viết Trang tổng quan về hoạt động phân phối.
  • Xem lại mã nguồn trò chơi để đảm bảo bạn không gọi bất kỳ mã nào có thể gây ra sự cố, ví dụ: finish có thể gây hại nếu không được sử dụng đúng cách. Hãy xem hướng dẫn dành cho nhà phát triển Android để tìm hiểu thêm về cách phát triển Android.
  • Sau khi xem lại dữ liệu và xuất bản dựng trò chơi sang Android Studio, bạn sẽ xử lý mã C và C++. Vì vậy, bạn có thể tận dụng tối đa các công cụ ngoài các giải pháp tiêu chuẩn của Unity, chẳng hạn như Trình phân tích bộ nhớ Android, Trình phân tích CPU Androidperfetto.

Mã công cụ Unity

Để biết liệu sự cố ANR có đang xảy ra ở phía công cụ Unity hay không, hãy kiểm tra libUnity.so hoặc libMain.so trong dấu vết ngăn xếp. Nếu bạn tìm thấy các tệp đó, hãy làm theo các bước sau:

  • Trước tiên, hãy tìm kiếm trên các kênh cộng đồng (Unity Forums (Diễn đàn Unity), Unity Discussions (Cuộc thảo luận về Unity), Stackoverflow).
  • Nếu bạn không tìm thấy lỗi nào, hãy gửi lỗi để giải quyết vấn đề. Cung cấp dấu vết ngăn xếp thay thế bằng biểu tượng để các kỹ sư của công cụ có thể hiểu rõ hơn và giải quyết lỗi tốt hơn.
  • Kiểm tra xem Unity LTS mới nhất có cải thiện vấn đề của bạn hay không. Nếu có, hãy nâng cấp trò chơi của bạn để sử dụng phiên bản đó. (Có thể giải pháp này chỉ dành cho một số nhà phát triển.)
  • Nếu mã của bạn sử dụng Activity tuỳ chỉnh thay vì mặc định, hãy xem lại mã Java để đảm bảo hoạt động không gây ra vấn đề nào.

SDK của bên thứ ba

  • Kiểm tra để đảm bảo rằng tất cả thư viện của bên thứ ba đều là phiên bản mới nhất và không có báo cáo về sự cố hoặc lỗi ANR cho phiên bản Android mới nhất.
  • Hãy truy cập Diễn đàn Unity để xem liệu có lỗi nào đã được giải quyết trong phiên bản sau này hay chưa, hoặc đã có giải pháp nào được Unity hoặc một thành viên cộng đồng đưa ra hay chưa.
  • Xem lại báo cáo lỗi ANR trên Google Play và đảm bảo rằng Google chưa xác định được lỗi này. Google đã biết một số lỗi ANR và đang tích cực tìm cách khắc phục.

Thư viện hệ thống

Thư viện hệ thống thường nằm ngoài tầm kiểm soát của nhà phát triển, nhưng không chiếm tỷ lệ đáng kể trong số các lỗi ANR. Ngoài việc liên hệ với nhà phát triển thư viện hoặc thêm nhật ký để thu hẹp vấn đề, còn khó có thể giải quyết lỗi ANR trong thư viện hệ thống.

Lý do thoát

ApplicationExitInfo là một API Android để hiểu rõ nguyên nhân gây ra lỗi ANR. Nếu trò chơi của bạn đang sử dụng Unity 6 trở lên, bạn có thể gọi trực tiếp ApplicationExitInfo. Đối với các phiên bản Unity cũ, bạn cần triển khai trình bổ trợ của riêng mình để bật các lệnh gọi ApplicationExitInfo từ Unity.

Crashlytics cũng sử dụng ApplicationExitInfo; tuy nhiên, việc triển khai của riêng bạn sẽ giúp bạn kiểm soát tốt hơn và cho phép bạn đưa vào thông tin phù hợp hơn.