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

Tích hợp các dịch vụ báo cáo
Các dịch vụ báo cáo như Android vitals, Firebase Crashlytics và Backtrace (một đối tác được Unity 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 ở quy mô lớn. Tích hợp SDK dịch vụ báo cáo vào trò chơi của bạn ngay từ đầu trong 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 riêng để ghi lại lỗi ANR. Thêm dịch vụ báo cáo thứ hai để tăng khả năng thu thập dữ liệu hợp lệ nhằm hỗ trợ quyết định của bạn trong việc 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 biểu tượng
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.

libil2cpp.so
.Cách kiểm tra mã nhận dạng 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 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 chúng lên dịch vụ báo cáo. Nếu không, bạn cần có một bản dựng mới để tải tệp biểu tượng lên.
Trên Windows hoặc macOS:
- Chuyển đến thư mục biểu tượng dựa trên phần phụ trợ tập lệnh (xem phần Giải pháp):
- Sử dụng lệnh sau (trên Windows, hãy dùng Cygwin để chạy tiện ích
readelf
) - Bạn có thể sử dụng grep để lọc đầu ra văn bản
- Tìm mã bản dựng
- Sử dụng lệnh sau (trên Windows, hãy dùng Cygwin để chạy tiện ích
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 cho thấy 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ác trình bổ trợ và gói.
Tên tệp C++ tuân theo tên hợp ngữ đượ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 màu xanh dương), đây là tên được xác định trong tệp Assembly Definition. Logger
là tên lớp (được đánh dấu bằng màu đỏ) trong tập lệnh C#, theo sau là tên hàm (được đánh dấu 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 đánh dấu bằng màu cam).

Kiểm tra mã trò chơi bằng cách làm như 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# không gây ra lỗi ANR hoặc sự cố ứng dụng. Mặc dù vậy, 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 liệu bạn có mới cập nhật Unity hay không hoặc liệu lỗi chỉ xảy ra trên các 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 so với mã C# của bạn và việc chuyển đổi mã hiếm khi gặp vấn đề. Nếu bạn tìm thấy nội dung nào đó, 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 chạy trong các lệnh gọi lại OnApplicationFocus() và OnApplicationPause() đều được dọn dẹp đúng cách.
- Công cụ Unity có một thời gian chờ để tạm dừng quá trình thực thi; khối lượng công việc quá lớn 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 vào các phần của mã để nâng cao khả năng phân tích dữ liệu.
- Sử dụng Unity Profiler để kiểm tra hiệu suất của trò chơi. Việc lập hồ sơ ứng dụng cũng có thể là một cách hữu ích để xác định những nút thắt cổ chai có thể gây ra lỗi ANR.
- Một cách hiệu quả để xác định các thao tác I/O ké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ý của một dịch vụ báo cáo khác, đồng thời kiểm tra các phiên bản phát hành của trò chơi mà lỗi xảy ra nhiều nhất. Xem xét 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 giải pháp tiềm năng riêng lẻ.
- Kiểm tra nhật ký báo cáo lỗi ANR của Google Play đối với những thiết bị và phiên bản Android nhận được nhiều lỗi ANR nhất. Nếu các thiết bị hoặc phiên bản đã lỗi thời, thì có thể bạn không cần lo lắng về những thiết bị hoặc phiên bản đó nếu việc này không ảnh hưởng đến khả năng sinh lời của trò chơi. 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 Trang tổng quan về hoạt động phân phối.
- Xem xét mã nguồn của trò chơi để đảm bảo bạn không gọi bất kỳ mã nào có thể gây ra vấn đề, ví dụ: finish có thể gây ra lỗ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ề hoạt động phát triển trên Android.
- Sau khi xem xét 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++, nhờ đó, 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 Android và perfetto.
Mã công cụ Unity
Để biết liệu có lỗi ANR 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 những thông tin đó, hãy thực hiện các bước sau:
- Trước tiên, hãy tìm kiếm trên các kênh cộng đồng (Diễn đàn Unity, Unity Discussions, Stackoverflow).
- Nếu bạn không tìm thấy thông tin nào, hãy báo cáo lỗi để giải quyết vấn đề. Cung cấp dấu vết ngăn xếp được biểu thị bằng ký hiệu để các kỹ sư của công cụ có thể hiểu rõ hơn và giải quyết lỗi.
- Kiểm tra xem Unity LTS mới nhất có cải thiện được 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 đó. (Giải pháp này có thể 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 xét mã Java để đảm bảo hoạt động này không gây ra bất kỳ 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 bên thứ ba đều được cập nhật và không có báo cáo về sự cố hoặc lỗi ANR đối với phiên bản Android mới nhất.
- Truy cập vào Diễn đàn Unity để xem có lỗi nào đã được giải quyết trong phiên bản sau hay không hoặc Unity hoặc một thành viên cộng đồng có cung cấp giải pháp nào hay không.
- Xem báo cáo lỗi ANR của Google Play và đảm bảo rằng Google chưa xác định được lỗi này. Google đã biết về 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 chú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 phạm vi vấn đề, bạn khó có thể giải quyết được lỗi ANR của thư viện hệ thống.
Lý do thoát
ApplicationExitInfo
là một API Android để tìm hiểu 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 thêm thông tin phù hợp hơn.