Sử dụng Trình phân tích cấu hình R8

R8 Configuration Analyzer là một công cụ được thiết kế để giúp bạn tối đa hoá lợi ích về hiệu suất của R8 bằng cách cung cấp thông tin chi tiết về chất lượng cấu hình của ứng dụng. Công cụ này cho phép bạn theo dõi và cải thiện hoạt động tối ưu hoá R8 bằng cách giám sát các chỉ số chính (cụ thể là điểm rút gọn, tối ưu hoá và làm rối mã nguồn). Các chỉ số này cho biết tỷ lệ phần trăm cơ sở mã có thể tối ưu hoá. Bằng cách xác định các quy tắc giữ diện rộng hoặc không cần thiết, bao gồm cả những quy tắc do thư viện của bên thứ ba giới thiệu, trình phân tích giúp bạn tinh chỉnh cấu hình để đảm bảo R8 có thể tối ưu hoá hiệu quả nhiều lớp, trường và phương thức nhất có thể.

Tạo báo cáo

Kể từ AGP 9.3.0-alpha05 trở lên, báo cáo sẽ tự động được tạo trong build/outputs/mapping/release/configanalyzer.html khi chạy bản dựng R8. Để tắt tính năng tự động tạo đầu ra, hãy đặt thuộc tính Gradle sau:

android.experimental.r8.enableR8ConfigurationAnalyzer=false

Đối với AGP 9.2 trở xuống, hãy đặt thuộc tính hệ thống com.android.tools.r8.dumpkeepradiushtmltodirectory khi chạy một tác vụ Gradle có bản dựng được bật bằng R8.

./gradlew assembleRelease \
    -Dcom.android.tools.r8.dumpkeepradiushtmltodirectory=<output_directory>

Ví dụ: hãy dùng lệnh sau để tạo báo cáo HTML trong thư mục /tmp/r8analysis:

// To create the /tmp/r8analysis folder.
mkdir -p /tmp/r8analysis

// To generate the report in the /tmp/r8analysis folder.
./gradlew assembleRelease \
    -Dcom.android.tools.r8.dumpkeepradiushtmltodirectory=/tmp/r8analysis

Hiểu rõ báo cáo

Trình phân tích cấu hình R8 cung cấp thông tin chi tiết về cấu hình R8 của ứng dụng và mức tác động của từng quy tắc giữ lại đối với ứng dụng. Điều này giúp bạn đạt được mức tối ưu hoá tối đa từ R8, cải thiện hiệu suất của ứng dụng. Hãy sử dụng các điểm số sau đây để biết có bao nhiêu phần trong cơ sở mã của bạn có thể được R8 tối ưu hoá.

Ví dụ về phần tóm tắt báo cáo
Hình 1. Ví dụ về phần tóm tắt báo cáo.

Điểm số giảm dần

Khi R8 rút gọn ứng dụng, R8 sẽ giảm kích thước tổng thể của ứng dụng bằng cách xác định và loại bỏ mã cũng như tài nguyên không sử dụng, đảm bảo bản dựng cuối cùng của bạn có kích thước nhỏ nhất có thể. Điểm rút gọn theo dõi tỷ lệ phần trăm của các lớp, trường và phương thức chịu sự rút gọn. Ví dụ: điểm rút gọn là 66% có nghĩa là R8 có thể thực hiện rút gọn trong 66% cơ sở mã của bạn.

Điểm tối ưu hoá

R8 thực hiện các hoạt động tối ưu hoá như nội tuyến phương thức và hợp nhất lớp, giúp cải thiện thời gian khởi động và bộ nhớ cho ứng dụng của bạn. Điểm tối ưu hoá theo dõi tỷ lệ phần trăm các lớp, trường và phương thức chịu sự tối ưu hoá của R8. Ví dụ: nếu điểm tối ưu hoá là 66%, thì có nghĩa là R8 chỉ có thể thực hiện tối ưu hoá trong 66% cơ sở mã của bạn.

Điểm làm rối mã nguồn

Bằng cách làm rối các lớp, trường và phương thức thành tên ngắn hơn, R8 sẽ giảm dấu vết siêu dữ liệu của ứng dụng để tiết kiệm bộ nhớ. Điểm làm rối mã đo lường tỷ lệ phần trăm mã có thể làm rối trong cơ sở mã của bạn.

Tinh chỉnh quy tắc giữ lại

Để cải thiện điểm số và sử dụng tính năng tối ưu hoá R8 hiệu quả hơn, bạn nên tinh chỉnh các quy tắc giữ lại để các quy tắc này không ngăn R8 tối ưu hoá ứng dụng của bạn một cách không cần thiết. Bạn chỉ nên giữ lại những lớp, phương thức hoặc trường được truy cập bằng phương pháp phản chiếu.

Để thực hiện việc này, hãy sử dụng Phân tích quy tắc giữ lại.

Ví dụ về phân tích quy tắc giữ lại
Hình 2. Ví dụ về phân tích quy tắc giữ lại.

Để xem thông tin phân tích chi tiết về một quy tắc, hãy nhấp vào quy tắc đó để mở màn hình chi tiết.

Ví dụ về phân tích quy tắc giữ lại
Hình 3. Ví dụ về phân tích quy tắc giữ lại.

Cách tinh chỉnh quy tắc giữ lại

Để tinh chỉnh các quy tắc giữ lại và khai thác tối đa tiềm năng của các hoạt động tối ưu hoá R8 cho ứng dụng của bạn, hãy làm như sau:

  1. Đối với mỗi quy tắc giữ lại, hãy xem tỷ lệ phần trăm của các lớp, trường và phương thức mà R8 không thể tối ưu hoá trong Trình phân tích cấu hình. Sử dụng tuỳ chọn này để xác định các quy tắc giữ lại ngăn chặn việc tối ưu hoá trong một số lượng lớn các lớp, trường hoặc phương thức. Các thuộc tính tối ưu hoá bị ngăn chặn bởi mỗi quy tắc giữ lại cũng được liệt kê.
  2. Nếu thấy một quy tắc giữ lại đang ngăn việc tối ưu hoá một số lượng lớn các lớp, bạn nên kiểm tra xem quy tắc giữ lại đang ngăn những lớp, trường và phương thức nào được tối ưu hoá để xem quy tắc này có giữ lại những mục không được gọi một cách linh động bằng phương pháp phản chiếu hay không.
  3. Giảm mức tối ưu hoá bị chặn theo các quy tắc giữ lại bằng cách chỉ nhắm đến các lớp, trường hoặc phương thức cần thiết bằng cách chọn lựa chọn giữ lại phù hợptuân theo các phương pháp hay nhất.
  4. Điều tra và chạy các kiểm thử bao gồm các lớp, trường và phương thức bị ảnh hưởng của quy tắc giữ lại, đồng thời tinh chỉnh các quy tắc giữ lại.

Kiểm tra việc tối ưu hoá thư viện

Khi bạn tích hợp các thư viện bên thứ ba, các thư viện này thường có các quy tắc giữ lại người dùng riêng để hoạt động với R8. Vì tác giả thư viện không thể dự đoán việc triển khai cụ thể của bạn, nên đôi khi họ viết các quy tắc thận trọng, có phạm vi rộng, ngăn chặn việc tối ưu hoá trong nhiều lớp, trường và phương thức hơn mức cần thiết. Điều này có thể khiến R8 không tối ưu hoá được những phần trong ứng dụng của bạn không liên quan đến quá trình thực thi thời gian chạy thực tế của thư viện. Bạn có thể sử dụng Trình phân tích cấu hình R8 để xác định các thư viện giới thiệu những quy tắc ảnh hưởng tiêu cực đến quá trình tối ưu hoá ứng dụng của bạn.

Sử dụng trình phân tích cấu hình để kiểm tra hiệu ứng kết hợp của tất cả các quy tắc giữ lại người dùng đã hợp nhất. Bằng cách phân tích tác động của từng quy tắc giữ lại đến từ một thư viện bên thứ ba, bạn có thể xác định và theo dõi các thư viện bên thứ ba cụ thể ngăn chặn việc tối ưu hoá ở mức cao trong ứng dụng của mình.

Cách tối ưu hoá thư viện

  • Nếu một thư viện có quy tắc quá rộng, bạn nên liên hệ với người duy trì thư viện đó và cung cấp dữ liệu trong báo cáo của bạn để minh hoạ cách các quy tắc hiện tại của họ ảnh hưởng đến điểm tối ưu hoá của ứng dụng. Nếu đó là một thư viện bên ngoài, hãy tìm các lỗi hiện có trong thư viện trước khi báo cáo vấn đề.
  • Nếu cần, bạn có thể kiểm tra những điểm cải tiến tiềm năng bằng cách lọc ra các quy tắc từ một thư viện cụ thể. Bạn có thể nhập các quy tắc của thư viện vào dự án, loại trừ các quy tắc chung và chạy lại trình phân tích cấu hình để đo lường mức tăng tiềm năng về kích thước và hiệu suất.

Quy tắc được bao hàm

Có thể có trường hợp nhiều quy tắc giữ trùng lặp và một trong các quy tắc có thể ngăn chặn việc tối ưu hoá nhiều hơn mức cần thiết. Nếu có 2 quy tắc giữ lại trong cơ sở mã của bạn.

# Prevents optimization in the entire package
# Remove this to improve optimization
-keep class com.example.package.** { *; }

# Prevents optimization to the class inside the package
-keep class com.example.package.Myclass

Quy tắc giữ đầu tiên ngăn chặn việc tối ưu hoá trong toàn bộ gói đang bao hàm quy tắc giữ thứ hai nhắm đến một lớp bên trong gói được giữ lại theo quy tắc giữ đầu tiên. Khi các quy tắc giữ trùng lặp, một quy tắc có thể chặn nhiều hoạt động tối ưu hoá hơn mức cần thiết. Bằng cách tinh chỉnh các quy tắc trùng lặp này, bạn có thể tối đa hoá việc tối ưu hoá R8 và loại bỏ nợ kỹ thuật. Quy trình này bao gồm việc tinh giản cấu hình để đảm bảo chỉ giữ lại mã cần thiết trong khi khai thác toàn bộ tiềm năng của các chức năng tối ưu hoá của R8.

Ví dụ về phần tóm tắt báo cáo
Hình 4. Ví dụ về các quy tắc được bao hàm trong báo cáo.

Tối ưu hoá các quy tắc được bao hàm

  1. Tìm các quy tắc giữ lại bao hàm bằng Trình phân tích cấu hình R8.
  2. Xác định chính xác các lớp, trường hoặc phương thức trong cơ sở mã thực sự dựa vào tính năng phản chiếu, cần được giữ lại bằng quy tắc lưu giữ. Việc nắm rõ thông tin này sẽ giúp bạn tinh chỉnh các quy tắc giữ lại.
  3. Sử dụng trình phân tích cấu hình, hãy so sánh mức tác động của từng quy tắc nhắm đến cùng một lớp, trường hoặc phương thức. Bạn có thể sử dụng tỷ lệ phần trăm tối ưu hoá bị ngăn chặn bởi mỗi quy tắc giữ lại để xác định quy tắc nào rộng hơn và quy tắc nào là quy tắc giữ lại hẹp.
    1. Nếu quy tắc thu hẹp được viết chính xác – chỉ giữ lại các thành viên hoặc lớp chính xác được truy cập một cách phản chiếu – thì hãy xoá quy tắc giữ lại rộng hơn. Điều này sẽ mở khoá an toàn các hoạt động tối ưu hoá R8 cho phần còn lại của gói.
    2. Nếu quy tắc rộng đang nhắm đến đúng các lớp, hãy giữ lại quy tắc rộng và xoá quy tắc hẹp. Quy tắc hẹp chỉ là mớ hỗn độn thừa thãi. Đảm bảo bạn tinh chỉnh quy tắc chung để chỉ nhắm đến các lớp, trường hoặc phương thức mà bạn đã xác định.

Xác minh và kiểm thử các thay đổi: Chạy lại trình phân tích cấu hình để đảm bảo xung đột đã được khắc phục. Sau đó, hãy biên dịch một bản phát hành và kiểm thử các thay đổi để đảm bảo cơ sở mã hoạt động như dự kiến.

Xoá các quy tắc không cần thiết

Khi sử dụng trình phân tích cấu hình, bạn có thể kiểm tra cơ sở mã một cách có hệ thống để xác định và cắt tỉa các quy tắc giữ lại lỗi thời làm lộn xộn cấu hình của bạn. Trình phân tích cấu hình R8 đặc biệt làm nổi bật 2 nguồn chính của các quy tắc không cần thiết:

  • Quy tắc không dùng đến: Quy tắc khớp với 0 lớp, phương thức hoặc trường trong bản dựng hiện tại của bạn. Chúng thường tồn tại sau khi tái cấu trúc mã, xoá phần phụ thuộc hoặc từ các cấu hình sao chép và dán không còn liên quan, làm tăng độ phức tạp không cần thiết của cấu hình.
  • Các quy tắc giống hệt nhau: Các quy tắc lưu giữ giống hệt nhau là những quy tắc nhắm đến cùng một lớp, trường và phương thức hoặc các khai báo trùng lặp của quy tắc lưu giữ trong cùng một hoặc trên các tệp quy tắc lưu giữ.

Cả hai loại quy tắc này đều làm lộn xộn cấu hình của bạn, khiến bạn khó duy trì và gỡ lỗi hơn. Bằng cách xác định những thành phần này, bạn có thể dọn dẹp cấu hình của mình.