Sự cố và lỗi ANR trên Android tạo ra một dấu vết ngăn xếp. Đó là ảnh chụp nhanh về trình tự của những hàm được lồng và gọi trong chương trình của bạn cho tới thời điểm xảy ra sự cố. Những ảnh chụp nhanh này có thể giúp bạn xác định và khắc phục mọi vấn đề trong mã nguồn.
Nếu dùng Java để phát triển ứng dụng hoặc trò chơi, đồng thời sử dụng ProGuard để tối ưu hoá và làm rối mã nguồn của ứng dụng, thì bạn có thể tải một tệp ánh xạ ProGuard lên Play Console cho từng phiên bản của ứng dụng. Nếu dùng mã gốc như C++ để phát triển ứng dụng hoặc trò chơi, thì bạn có thể tải một tệp biểu tượng gỡ lỗi lên Play Console cho từng phiên bản của ứng dụng. Thao tác này giúp việc phân tích cũng như khắc phục sự cố và lỗi ANR của bạn trở nên dễ dàng hơn.
Quan trọng: Chỉ các tệp ánh xạ tương thích với ReTrace mới được hỗ trợ để gỡ rối mã nguồn các ứng dụng được biên dịch trong Java. Đây cũng là định dạng được ProGuard hoặc R8 sử dụng.
Bước 1: Tạo tệp gỡ rối mã nguồn hoặc tệp biểu tượng gỡ lỗi
Để gỡ rối mã nguồn hoặc thay thế các sự cố và lỗi ANR bằng biểu tượng cho một phiên bản của ứng dụng, trước tiên bạn cần tạo các tệp theo yêu cầu cho chính phiên bản này của ứng dụng. Bạn phải tạo và tải một tệp lên cho từng phiên bản mới của ứng dụng thì mới có thể gỡ rối mã nguồn hoặc thay thế bằng biểu tượng.
Java: Tạo tệp ánh xạ ProGuardĐể gỡ rối mã nguồn dấu vết ngăn xếp Java, trước tiên bạn cần tạo một tệp ánh xạ ProGuard. Để tìm hiểu cách thực hiện, hãy truy cập vào trang web của Google Developers.
Plugin Android cho Gradle phiên bản 4.1 trở lên
Nếu dự án của bạn xây dựng ứng dụng theo định dạng Android App Bundle thì bạn có thể tự động đưa tệp biểu tượng gỡ lỗi vào đó. Để đưa tệp này vào, hãy thêm nội dung sau đây vào tệp build.gradle
:
android.defaultConfig.ndk.debugSymbolLevel = 'FULL'
Lưu ý: Tệp biểu tượng gỡ lỗi bị giới hạn trong 800 MB. Nếu kích thước của biểu tượng gỡ lỗi quá lớn, hãy dùng SYMBOL_TABLE
thay vì FULL
để giảm kích thước tệp.
Nếu dự án của bạn xây dựng APK, hãy thiết lập cài đặt dựng build.gradle trên đây để tạo tệp biểu tượng gỡ lỗi riêng rẽ. Tải tệp biểu tượng gỡ lỗi lên Google Play Console theo cách thủ công như được mô tả dưới đây trong Bước 2: Tải tệp gỡ rối mã nguồn hoặc tệp thay thế bằng biểu tượng lên. Là một phần trong quy trình xây dựng, Plugin Android cho Gradle sẽ cho ra tệp này tại vị trí trong dự án như dưới đây:
app/build/outputs/native-debug-symbols/variant-name/native-debug-symbols.zip
Plugin Android cho Gradle phiên bản 4.0 trở về trước (và các hệ thống xây dựng khác)
Là một phần trong quy trình xây dựng cho gói ứng dụng hoặc tệp APK, Plugin Android cho Gradle lưu một bản sao của các thư viện chứa biểu tượng gỡ lỗi trong một thư mục của dự án. Thư mục này có cấu trúc tương tự với cấu trúc sau đây:
app/build/intermediates/cmake/universal/release/obj
├── armeabi-v7a/
│ ├── libgamenegine.so
│ ├── libothercode.so
│ └── libvideocodec.so
├── arm64-v8a/
│ ├── libgamenegine.so
│ ├── libothercode.so
│ └── libvideocodec.so
├── x86/
│ ├── libgamenegine.so
│ ├── libothercode.so
│ └── libvideocodec.so
└── x86_64/
├── libgameengine.so
├── libothercode.so
└── libvideocodec.so
Lưu ý: Nếu bạn sử dụng một hệ thống xây dựng khác thì bạn có thể sửa đổi để lưu trữ các thư viện chứa biểu tượng gỡ lỗi trong thư mục có cấu trúc bắt buộc như trên.
- Nén nội dung của thư mục này:
$ cd app/build/intermediates/cmake/universal/release/obj
$ zip -r symbols.zip .
- Tải tệp symbols.zip lên Play Console theo cách thủ công như mô tả dưới đây trong Bước 2: Tải tệp gỡ rối mã nguồn hoặc tệp thay thế bằng biểu tượng lên Play Console.
Tệp biểu tượng gỡ lỗi bị giới hạn trong 800 MB. Nếu tệp của bạn quá lớn, có thể là do các tệp .so chứa một bảng biểu tượng (tên hàm) và cũng có thể chứa thông tin gỡ lỗi DWARF (tên tệp và dòng mã). Các dữ liệu này không cần thiết trong quá trình thay thế mã của bạn bằng biểu tượng và có thể loại bỏ bằng cách chạy lệnh sau:
$OBJCOPY --strip-debug lib.so lib.so.sym
Lưu ý: $OBJCOPY
chỉ đích danh phiên bản cho ABI mà bạn đang loại bỏ, ví dụ:ndk-bundle/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-objcopy
Bước 2: Tải tệp gỡ rối mã nguồn hoặc tệp thay thế bằng biểu tượng lên
Để gỡ rối mã nguồn hoặc thay thế các sự cố và lỗi ANR bằng biểu tượng cho một phiên bản của ứng dụng, bạn phải tải các tệp gỡ rối mã nguồn hoặc tệp thay thế bằng biểu tượng lên cho từng phiên bản của ứng dụng.
Lưu ý quan trọng: Bước này chỉ bắt buộc đối với các nhà phát triển sử dụng tệp APK. Nếu đang sử dụng một gói ứng dụng và Plugin Android cho Gradle phiên bản 4.1 trở lên thì bạn không cần làm gì ở bước này. Chúng tôi sẽ tự động lấy tệp gỡ rối mã nguồn từ gói và bạn có thể bỏ qua và chuyển tới Bước 3: Xem dấu vết ngăn xếp sự cố đã được gỡ rối mã nguồn. Bạn có thể tìm hiểu thêm về gói ứng dụng trên trang web dành cho nhà phát triển Android.
Tải tệp lên bằng Play ConsoleĐể tải tệp gỡ rối mã nguồn hoặc tệp thay thế bằng biểu tượng lên:
- Mở Play Console.
- Chọn ứng dụng.
- Trên trình đơn bên trái, hãy chọn
Kiểm thử và phát hành
> Trình khám phá gói ứng dụng. - Sử dụng bộ chọn ở góc trên cùng bên phải để chọn cấu phần phần mềm có liên quan.
- Chọn thẻ Tải xuống rồi di chuyển xuống phần "Nội dung".
- Nhấp vào mũi tên tải lên cho tệp ánh xạ hoặc biểu tượng gỡ lỗi phù hợp để tải tệp gỡ rối mã nguồn hoặc tệp thay thế bằng biểu tượng lên Play Console cho phiên bản này của ứng dụng của bạn.
Để tải tệp lên bằng cách sử dụng API Nhà phát triển Google Play, hãy truy cập trang web của Google Developers.
Bước 3: Xem dấu vết ngăn xếp sự cố đã được gỡ rối mã nguồn
Sau khi bạn đã tải tệp ánh xạ ProGuard hoặc tệp biểu tượng gỡ lỗi lên cho một phiên bản của ứng dụng thì các sự cố và lỗi ANR xuất hiện sau đó sẽ được gỡ rối mã nguồn. Bạn có thể xem lại các dấu vết ngăn xếp đã được gỡ rối mã nguồn cho từng sự cố và lỗi ANR cụ thể tại trang Sự cố và lỗi ANR của ứng dụng.
- Mở Play Console.
- Chọn ứng dụng.
- Trên trình đơn bên trái, hãy chọn Theo dõi và cải thiện > Android vitals > Các sự cố và lỗi ứng dụng không phản hồi (ANR).
- Chọn một sự cố.
- Trong phần "Dấu vết ngăn xếp", bạn sẽ xem được các dấu vết ngăn xếp đã được gỡ rối mã nguồn và thay thế bằng biểu tượng.
Quan trọng: Một khi bạn đã tải tệp ánh xạ lên cho một phiên bản của ứng dụng, chỉ các sự cố và lỗi ANR gặp phải sau này trong phiên bản đó mới được gỡ rối mã nguồn. Các sự cố và lỗi ANR đã xảy ra trên một phiên bản của ứng dụng của bạn trước khi bạn tải tệp ánh xạ tương ứng lên sẽ không được gỡ rối mã nguồn.
Câu hỏi thường gặp
Tôi không muốn sử dụng tính năng gỡ rối mã nguồn/thay thế bằng biểu tượng trên Play Console. Tôi có thể thực hiện ngoại tuyến không?Play Console sử dụng ndk-stack để biểu tượng hoá dấu vết ngăn xếp cho các ứng dụng gốc, và ReTrace cho các sự cố Java. Nếu không muốn chia sẻ tệp gỡ rối mã nguồn của mình thì bạn có thể sao chép các ngăn xếp sự cố đã được làm rối mã nguồn từ Play Console và sử dụng công cụ ngoại tuyến phù hợp để thay thế các ngăn xếp này bằng biểu tượng. Tuy nhiên, do quy trình này yêu cầu phải thực hiện thủ công cho từng ngăn xếp sự cố nên sẽ chậm và tốn thời gian. Bạn chỉ cần cung cấp tệp gỡ rối mã nguồn, Play Console sẽ giải quyết vấn đề này cho bạn.
Sau khi bạn tải tệp ánh xạ ProGuard hoặc tệp biểu tượng gỡ lỗi lên cho một phiên bản của ứng dụng thì chỉ các sự cố và lỗi ANR xuất hiện sau đó mới được gỡ rối mã nguồn. Bạn sẽ cần dành thời gian để thiết bị của người dùng báo cáo các sự cố và lỗi ANR mới trước khi bạn có thể thấy được các sự cố và lỗi ANR đã được gỡ rối mã nguồn trên Play Console.
Việc này xảy ra khi tệp gỡ rối mã nguồn/tệp thay thế bằng biểu tượng chưa hoàn chỉnh được tải lên. Hãy đảm bảo bạn đã đưa các tệp thay thế bằng biểu tượng lên cho toàn bộ ứng dụng, đặc biệt khi bạn sử dụng một quy trình xây dựng phức tạp hoặc có nhiều giai đoạn. Một trong những lý do phổ biến nhất gây ra gỡ rối mã nguồn một phần là khi bạn sử dụng thư viện của bên thứ ba. Trong trường hợp này, bạn có thể có khả năng nhận tệp gỡ rối mã nguồn từ nhà cung cấp thư viện.
Khi không có tệp gỡ rối mã nguồn, cùng một sự cố hoặc lỗi ANR trên thiết bị 32-bit và 64-bit, hoặc thiết bị ARM và Intel sẽ được hiển thị riêng rẽ. Bằng cách cung cấp các tệp gỡ rối mã nguồn, chúng tôi có thể phân nhóm các sự cố này với nhau và cho bạn góc nhìn toàn diện hơn về các sự cố và lỗi ANR tác động mạnh nhất tới ứng dụng của bạn.
Nếu bạn quên tải tệp lên cho một phiên bản mới của ứng dụng thì các sự cố và lỗi ANR sẽ bị làm rối mã nguồn trở lại. Hãy làm theo hướng dẫn ở trên để tải lên ngay bây giờ. Sau khi bạn tải tệp ánh xạ ProGuard hoặc tệp biểu tượng gỡ lỗi lên cho một phiên bản của ứng dụng thì chỉ các sự cố và lỗi ANR xuất hiện sau đó mới được gỡ rối mã nguồn. Bạn sẽ cần dành thời gian để thiết bị của người dùng báo cáo các sự cố và lỗi ANR mới trước khi bạn có thể thấy được các sự cố và lỗi ANR đã được gỡ rối mã nguồn trên Play Console.
Để tránh nguy cơ quên tải tệp lên, hãy xem xét thay đổi quy trình xây dựng của bạn để sử dụng gói ứng dụng với Plugin Android cho Gradle phiên bản 4.1 trở lên. Trong trường hợp này, bạn có thể tự động đưa tệp biểu tượng gỡ lỗi vào gói ứng dụng bằng cách làm theo hướng dẫn trên trang web dành cho nhà phát triển Android.
Nếu bạn tải không đúng tệp lên cho một phiên bản của ứng dụng thì các sự cố và lỗi ANR sẽ bị làm rối mã nguồn trở lại. Để tải đúng phiên bản lên, hãy thực hiện như sau:
- Mở Play Console.
- Chọn ứng dụng.
- Trên trình đơn bên trái, hãy chọn
Kiểm thử và phát hành
> Trình khám phá gói ứng dụng - Sử dụng bộ chọn ở góc trên cùng bên phải để chọn cấu phần phần mềm có liên quan.
- Chọn thẻ Tải xuống rồi di chuyển xuống phần "Nội dung".
- Nhấp vào biểu tượng xoá bên cạnh tệp gỡ rối mã nguồn hoặc tệp thay thế bằng biểu tượng không đúng.
- Sau khi xóa phiên bản không đúng của tệp, hãy nhấp vào biểu tượng tải lên và tải tệp đúng lên cho phiên bản này của ứng dụng.
Sau khi bạn đã tải tệp ánh xạ ProGuard hoặc tệp biểu tượng gỡ lỗi chính xác lên cho một phiên bản của ứng dụng thì chỉ các sự cố và lỗi ANR xuất hiện sau đó mới được gỡ rối mã nguồn. Bạn sẽ cần dành thời gian để các sự cố và lỗi ANR mới được thiết bị của người dùng báo cáo trước khi bạn có thể thấy được các sự cố và lỗi ANR đã được gỡ rối mã nguồn trên Play Console.
Mẹo: Để tránh rủi ro tải phiên bản không đúng của tệp lên, hãy xem xét thay đổi quy trình xây dựng của bạn để sử dụng gói ứng dụng với Plugin Android cho Gradle phiên bản 4.1 trở lên. Trong trường hợp này, bạn có thể tự động đưa tệp biểu tượng gỡ lỗi vào gói ứng dụng bằng cách làm theo hướng dẫn trên trang web dành cho nhà phát triển Android.
Để bắt đầu, hãy truy cập vào trang web dành cho nhà phát triển Android.
Được.
Đôi khi, hệ thống gặp một lỗi ANR nhưng không thể thu thập dấu vết ngăn xếp của lỗi đó. Trong trường hợp này, lỗi ANR xuất hiện để giúp bạn nắm được góc nhìn toàn diện về độ ổn định của ứng dụng nhưng không có thông tin về dấu vết ngăn xếp tương ứng. Lỗi ANR không có dấu vết ngăn xếp sẽ được nhóm theo loại và hoạt động, nhờ vậy, việc xem xét và sửa các lỗi ANR tương tự có thể giúp giảm số lỗi ANR không có dấu vết ngăn xếp.