Khi bạn bật tính năng tối ưu hoá ứng dụng bằng các chế độ cài đặt mặc định, R8 sẽ thực hiện các hoạt động tối ưu hoá trên diện rộng để tối đa hoá lợi ích về hiệu suất. R8 sửa đổi đáng kể mã, bao gồm cả việc đổi tên, di chuyển và xoá các lớp, trường và phương thức. Nếu nhận thấy những nội dung sửa đổi này gây ra lỗi, bạn cần chỉ định những phần mã mà R8 không nên sửa đổi bằng cách khai báo những phần đó trong quy tắc lưu giữ.
Các trường hợp phổ biến cần có quy tắc giữ lại
R8 xác định và giữ lại tất cả các lệnh gọi trực tiếp trong mã của bạn. Tuy nhiên, R8 không thể nhận thấy các cách sử dụng mã gián tiếp, điều này có thể khiến R8 xoá mã mà ứng dụng của bạn cần, dẫn đến lỗi. Sử dụng quy tắc giữ lại để yêu cầu R8 giữ lại mã được dùng gián tiếp như vậy. Sau đây là một số trường hợp phổ biến mà bạn có thể cần đến quy tắc giữ lại:
- Mã được truy cập bằng tính năng phản chiếu: R8 không thể xác định thời điểm các lớp, trường hoặc phương thức được truy cập bằng tính năng phản chiếu. Ví dụ: R8 không thể xác định một phương thức được tra cứu theo tên bằng cách sử dụng
Class.getDeclaredMethod()
hoặc một chú thích được truy xuất bằngClass.getAnnotation()
. Trong những trường hợp này, R8 có thể đổi tên các phương thức và chú thích này hoặc xoá hoàn toàn chúng, dẫn đếnClassNotFoundException
hoặcNoSuchMethodException
trong thời gian chạy. - Mã được gọi từ Giao diện gốc Java (JNI): Khi mã gốc (C hoặc C++) gọi một phương thức Java hoặc Kotlin, hoặc mã Java hoặc Kotlin gọi mã C++ bằng JNI, lệnh gọi sẽ dựa trên một hoạt động tra cứu chuỗi động về tên của phương thức. R8 không thể thấy lệnh gọi phương thức dựa trên chuỗi động, do đó, các hoạt động tối ưu hoá của R8 có thể làm hỏng mã của bạn.
Đây không phải là danh sách đầy đủ các trường hợp cần có quy tắc giữ lại, nhưng những trường hợp này bao gồm hầu hết các trường hợp mà bạn có thể cần đến quy tắc giữ lại.
Cách thêm quy tắc giữ lại vào ứng dụng
Bạn nên thêm các quy tắc vào tệp proguard-rules.pro
nằm trong thư mục gốc của mô-đun ứng dụng. Tệp này có thể đã có sẵn, nhưng nếu chưa có, hãy tạo tệp này. Để áp dụng các quy tắc trong tệp, bạn phải khai báo tệp trong tệp build.gradle.kts
(hoặc build.gradle
) ở cấp mô-đun như minh hoạ trong mã sau:
Kotlin
android { buildTypes { release { isMinifyEnabled = true isShrinkResources = true proguardFiles( // File with default rules provided by the Android Gradle Plugin getDefaultProguardFile("proguard-android-optimize.txt"), // File with your custom rules "proguard-rules.pro" ) // ... } } // ... }
Groovy
android { buildTypes { release { minifyEnabled true shrinkResources true proguardFiles( // File with default rules provided by the Android Gradle Plugin getDefaultProguardFile('proguard-android-optimize.txt'), // File with your custom rules. 'proguard-rules.pro' ) // ... } } // ... }
Theo mặc định, tệp bản dựng của bạn cũng bao gồm tệp proguard-android-optimize.txt
. Tệp này chứa các quy tắc bắt buộc đối với hầu hết các dự án Android, vì vậy bạn nên giữ nguyên tệp này trong tệp bản dựng. Tệp này dựa trên và chia sẻ nội dung với tệp proguard-common.txt
.
Các ứng dụng có kích thước lớn thường có mã trong nhiều mô-đun thư viện. Trong những trường hợp như vậy, bạn thường nên đặt các quy tắc giữ lại cùng với mã mà chúng áp dụng trong mô-đun thư viện cụ thể. Sự khác biệt quan trọng trong việc duy trì các quy tắc giữ lại cho thư viện nằm ở cách bạn khai báo các quy tắc này trong tệp build.gradle.kts
(hoặc build.gradle
) của mô-đun thư viện. Hãy xem phần Tối ưu hoá cho tác giả thư viện để tìm hiểu thêm.
Thêm quy tắc giữ lại
Khi thêm quy tắc giữ lại, bạn có thể thêm các lựa chọn chung cũng như xác định quy tắc giữ lại của riêng mình.
- Các lựa chọn chung: Các lựa chọn chung là những chỉ thị chung ảnh hưởng đến cách R8 hoạt động trên toàn bộ cơ sở mã của bạn. Để tìm hiểu thêm, hãy xem phần Tuỳ chọn chung.
- Quy tắc giữ lại: Bạn cần thiết kế quy tắc giữ lại một cách cẩn thận để đảm bảo bạn đạt được sự cân bằng phù hợp giữa việc tối đa hoá hoạt động tối ưu hoá mã mà không vô tình làm hỏng ứng dụng. Để tìm hiểu cú pháp cho các quy tắc giữ lại của riêng bạn, hãy xem phần Cú pháp quy tắc giữ lại.
Lưu quy tắc dành cho tác giả trong thư viện
Sau khi tìm hiểu về các lựa chọn và cú pháp chung cho quy tắc giữ lại, hãy xem phần Tối ưu hoá cho tác giả thư viện để biết thêm thông tin chi tiết.