Thử nghiệm và khắc phục sự cố về tính năng tối ưu hoá
Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang
Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.
Sau khi bạn bật tính năng tối ưu hoá ứng dụng, hãy kiểm tra để đảm bảo ứng dụng của bạn đang hoạt động như dự kiến và cấu hình R8 đang hoạt động như mong đợi. Sau đây là các bước chung:
Kiểm thử hành trình trọng yếu của người dùng (CUJ) trong ứng dụng: Ví dụ: đảm bảo người dùng có thể đăng nhập và thực hiện các nhiệm vụ quan trọng khác.
Đo lường mức tăng hiệu suất bằng điểm chuẩn:Đo điểm chuẩn cho ứng dụng trước và sau khi bật tính năng tối ưu hoá ứng dụng.
Nếu bạn phát hiện vấn đề, R8 sẽ cung cấp các công cụ để giúp bạn khắc phục sự cố. Nếu bạn không thể giải quyết vấn đề với R8, hãy gửi lỗi.
Mẹo chung
Các vấn đề với R8 thường chỉ xảy ra với ứng dụng của bạn, nhưng sau đây là một số mẹo chung để giúp bạn gỡ lỗi dễ dàng hơn:
Tạm thời tắt tính năng làm rối mã: R8 làm rối mã trong quá trình tối ưu hoá. Việc làm rối mã nguồn thường không phải là nguyên nhân gây ra lỗi, nhưng việc làm rối mã nguồn khiến việc gỡ lỗi trở nên khó khăn hơn. Thêm cờ ‑dontobfuscate và ‑dontoptimize vào tệp quy tắc giữ lại để giúp bạn xác định chính xác mã có vấn đề.
Kiểm tra tính năng phản chiếu: Nếu bạn gặp phải trường hợp ngoại lệ không có phần tử như vậy, chẳng hạn như
Caused by: java.util.NoSuchElementException: Collection contains no element
matching the predicate in the stack trace ,
trường hợp ngoại lệ thường có nghĩa là trường có liên quan đang được sử dụng thông qua phản chiếu và bạn phải thêm một quy tắc giữ lại.
Kiểm tra mã byte: Hầu hết các vấn đề về R8 đều yêu cầu kiểm tra mã byte. Bạn có thể thực hiện việc này bằng các công cụ như Công cụ phân tích APK.
Kiểm tra xem quy tắc nào được áp dụng
Để xuất ra báo cáo đầy đủ về tất cả quy tắc mà R8 đang áp dụng khi xây dựng dự án, hãy đưa nội dung sau vào tệp proguard‑rules.pro của mô-đun ứng dụng:
Bạn có thể chỉ định bất kỳ đường dẫn và tên tệp nào. Nếu bạn không chỉ định đường dẫn hoặc tên tệp, R8 sẽ xuất báo cáo quy tắc tại <module-name>/build/outputs/mapping/<build-type>/configuration.txt.
Tìm hiểu lý do giữ lại mã
Nếu bạn thấy mã được giữ lại mà bạn dự kiến sẽ bị xoá, hãy sử dụng tuỳ chọn cấu hình ‑whyareyoukeeping để tìm hiểu lý do mã được giữ lại. R8 sẽ xuất một đường dẫn từ mã được giữ lại đến một trong các điểm truy cập của ứng dụng. Để biết thêm thông tin, hãy xem tài liệu về ‑whyareyoukeeping trong hướng dẫn Proguard.
Khôi phục dấu vết ngăn xếp ban đầu
Mã do R8 xử lý sẽ thay đổi theo nhiều cách để dấu vết ngăn xếp không còn tham chiếu đến mã gốc. Ví dụ: số dòng và tên của các lớp và phương thức có thể thay đổi. Để khôi phục dấu vết ngăn xếp ban đầu, R8 cung cấp công cụ dòng lệnh retrace, được đóng gói kèm với gói công cụ dòng lệnh.
Để sử dụng tính năng truy xuất lại, hãy cung cấp cho tính năng này một tệp ánh xạ và một tệp dấu vết ngăn xếp. Tệp ánh xạ, có tên là mapping.txt, được tự động đóng gói với Android App Bundle (AAB). Để biết thêm thông tin chi tiết, hãy xem tài liệu về tính năng theo dõi lại và bài viết trên Trung tâm trợ giúp của Play Console về cách gỡ rối mã nguồn cho các dấu vết ngăn xếp sự cố.
Nội dung và mã mẫu trên trang này phải tuân thủ các giấy phép như mô tả trong phần Giấy phép nội dung. Java và OpenJDK là nhãn hiệu hoặc nhãn hiệu đã đăng ký của Oracle và/hoặc đơn vị liên kết của Oracle.
Cập nhật lần gần đây nhất: 2025-07-27 UTC.
[[["Dễ hiểu","easyToUnderstand","thumb-up"],["Giúp tôi giải quyết được vấn đề","solvedMyProblem","thumb-up"],["Khác","otherUp","thumb-up"]],[["Thiếu thông tin tôi cần","missingTheInformationINeed","thumb-down"],["Quá phức tạp/quá nhiều bước","tooComplicatedTooManySteps","thumb-down"],["Đã lỗi thời","outOfDate","thumb-down"],["Vấn đề về bản dịch","translationIssue","thumb-down"],["Vấn đề về mẫu/mã","samplesCodeIssue","thumb-down"],["Khác","otherDown","thumb-down"]],["Cập nhật lần gần đây nhất: 2025-07-27 UTC."],[],[],null,["# Test and troubleshoot the optimization\n\nAfter you enable app optimization, check that your app is working as intended\nand that the R8 configuration is doing what you expect. The general steps are as\nfollows:\n\n1. **Test your app's critical user journeys (CUJs):** For example, make sure that users can sign in and do other important tasks.\n2. **Measure performance gains using benchmarks:** [Benchmark your app](/topic/performance/benchmarking/benchmarking-overview) before and after enabling app optimization.\n\nIf you find issues, R8 provides tools to help you troubleshoot. If you're unable\nto solve an issue with R8, [file a bug](https://b.corp.google.com/issues/new?component=326788&template=1025938&pli=1).\n\nGeneral tips\n------------\n\nIssues with R8 are often unique to your app, but here are some general tips to\nmake debugging easier:\n\n- **Temporarily turn off obfuscation:** R8 obfuscates code as part of its optimization process. Obfuscation usually isn't the cause of errors, but obfuscation makes errors more difficult to debug. Add the `‑dontobfuscate` and `‑dontoptimize` flags to the keep rules file to help you pinpoint problematic code.\n- **Check for reflection:** If you run into a *no such element* exception such\n as\n\n `Caused by: java.util.NoSuchElementException: Collection contains no element\n matching the predicate in the stack trace` ,\n\n the exception usually means the field in question is being used through\n reflection and you have to add a keep rule.\n- **Inspect bytecode:** Most R8 issues require bytecode inspection, which you\n can do with tools such as the [APK Analyzer](/studio/debug/apk-analyzer).\n\nCheck which rules are applied\n-----------------------------\n\nTo output a full report of all the rules that R8 applies when building your\nproject, include the following in your app's module\n`proguard‑rules.pro` file: \n\n -printconfiguration \u003coutput-dir\u003e/\u003creport-name\u003e.txt\n\nYou can specify any path and filename. If you don't specify a path or filename,\nR8 outputs the rules report at `\u003cmodule-name\u003e/build/outputs/mapping/\u003cbuild-type\u003e/configuration.txt`.\n\nUnderstand why code was kept\n----------------------------\n\nIf you see kept code that you expected to be removed, use the configuration\noption `‑whyareyoukeeping` to help understand why the code was\nkept. R8 outputs a path from the kept code to one of your app's [entry\npoints](/topic/performance/app-optimization/add-keep-rules#how-write). For more information, see the\n[`‑whyareyoukeeping`](https://www.guardsquare.com/manual/configuration/usage)\ndocumentation in the Proguard manual.\n\nRecover the original stack trace\n--------------------------------\n\nCode processed by R8 is changed in various ways so that the stack trace no\nlonger refers to the original code. For example, line numbers and the names of\nclasses and methods can change. To recover the original stack trace, R8 provides\nthe retrace command-line tool, which is bundled with the command-line tools\npackage.\n\nTo use retrace, give it a *mapping file* and a stack trace file. The mapping\nfile, called `mapping.txt`, is automatically bundled with your Android App\nBundle (AAB). For more details, see the [retrace](/studio/command-line/retrace) documentation and the Play\nConsole Help Center article about how to [de‑obfuscate crash stack\ntraces](https://support.google.com/googleplay/android-developer/answer/9848633).\n| **Warning:** If you're shipping APKs, the `mapping.txt` file isn't automatically bundled with your APK. Android Studio saves the mapping file in the `/build/outputs/mapping/` directory. The mapping file is overwritten every time you build your project, so you must save a copy each time you publish a new release."]]