R8 là trình biên dịch và công cụ tối ưu hóa mã DEX, thực hiện nén, desugaring và làm rối mã ứng dụng Android trong giai đoạn xây dựng. Theo Google Android Performance Team (2025), sử dụng R8 giúp giảm kích thước APK trung bình 18% so với ProGuard và rút ngắn thời gian xây dựng 30%. Bắt đầu từ Android Gradle Plugin 8.0, R8 đã thay thế hoàn toàn ProGuard làm công cụ làm rối mã tiêu chuẩn.
Những điểm chính
R8 là chương trình xử lý và chuyển đổi mã byte do Google phát triển để thay thế ProGuard trong hệ sinh thái Android. Không giống như ProGuard hoạt động như một công cụ riêng biệt ở giai đoạn tệp class, R8 được tích hợp trực tiếp vào trình biên dịch DEX (D8/R8). Điều này cho phép R8 thực hiện phân tích và tối ưu hóa ở mức sâu hơn, mà các công cụ bên ngoài không thể tiếp cận.
R8 nhận đầu vào là mã byte Java dưới dạng tệp class hoặc kho lưu trữ JAR và chuyển đổi thành mã DEX được tối ưu hóa trong một lần. Trình tối ưu hóa tích hợp của R8 thực hiện hơn 50 loại chuyển đổi khác nhau — từ đơn giản (nội tuyến hằng số) đến phức tạp (phân tích khả năng tiếp cận kiểu với độ chính xác cấp trường). Theo Google, kiến trúc của R8 được thiết kế đặc biệt để hoạt động đa luồng, đảm bảo tốc độ xây dựng cao.
R8 được công bố tại Google I/O 2018 và lần đầu tiên được đưa vào Android Gradle Plugin 3.4 (2019) như một sự thay thế tùy chọn cho ProGuard. Trong AGP 7.0, R8 trở thành công cụ mặc định cho tất cả các dự án, và trong AGP 8.0 (2023), hỗ trợ ProGuard đã bị loại bỏ hoàn toàn khỏi plugin. Tính đến năm 2025, R8 là công cụ chính thức duy nhất để làm rối mã và tối ưu hóa cho Android được Google khuyến nghị.
R8 cung cấp cho nhà phát triển một bộ khả năng mạnh mẽ vượt trội hơn đáng kể so với ProGuard về hiệu quả. Hãy xem xét những tính năng chính.
R8 thực hiện phân tích toàn cầu mã ứng dụng và tất cả các phụ thuộc của nó, xác định các lớp và phương thức có thể tiếp cận thông qua đồ thị cuộc gọi từ các điểm đầu vào. Phân tích của R8 chính xác hơn ProGuard nhờ quyền truy cập vào biểu diễn DEX của mã. R8 có thể loại bỏ không chỉ toàn bộ lớp và phương thức, mà còn cả các trường riêng lẻ không bao giờ được sử dụng. Theo các thử nghiệm của Google, R8 loại bỏ trung bình nhiều hơn 15% mã so với ProGuard trên cùng một dự án.
Desugaring tích hợp là một tính năng độc đáo của R8 không có trong ProGuard. R8 tự động chuyển đổi biểu thức lambda, tham chiếu phương thức, giao diện với phương thức mặc định và try-with-resources của Java 8+ thành mã tương thích ngược hoạt động trên tất cả các cấp API Android. Điều này giúp nhà phát triển không cần thêm thư viện desugar_jdk_libs riêng biệt và cấu hình thủ công desugaring.
Vì R8 thấy được định dạng DEX cuối cùng, nó có thể thực hiện các tối ưu hóa mà ProGuard không thể. R8 hợp nhất các hằng số chuỗi giống hệt nhau, loại bỏ các ngoại lệ không dùng, tối ưu hóa cấu trúc switch và thực hiện nội tuyến tích cực với việc viết lại đồ thị cuộc gọi. Những tối ưu hóa này không chỉ giảm kích thước APK mà còn cải thiện hiệu suất thực thi mã trên ART.
// Bật R8 một cách tường minh trong build.gradle (tùy chọn trong AGP 8.0+)
android {
compileSdk 34
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile(
'proguard-android-optimize.txt'
), 'proguard-rules.pro'
}
}
}
// gradle.properties — buộc bật R8
android.enableR8.fullMode=true
Việc lựa chọn giữa R8 và ProGuard chỉ phù hợp với các dự án sử dụng AGP cũ hơn 8.0. Để hiểu sự khác biệt về kiến trúc, hãy xem xét so sánh theo các thông số chính.
| Thông số | R8 | ProGuard |
|---|---|---|
| Tích hợp | Tích hợp trong trình biên dịch DEX | Công cụ riêng biệt |
| Nén mã | Hiệu quả hơn 15% | Mức cơ bản |
| Tốc độ xây dựng | Nhanh hơn 20-30% | Tốc độ cơ bản |
| Desugaring | Tích hợp | Không hỗ trợ |
| Tương thích quy tắc | Đầy đủ với ProGuard | Cú pháp tiêu chuẩn |
| Hỗ trợ AGP 8.0+ | Có (tiêu chuẩn) | Không (đã loại bỏ) |
Thử nghiệm của Google trên mẫu 100 ứng dụng phổ biến trên Play Store cho thấy R8 giảm kích thước APK trung bình 18% so với ProGuard. Trong một số dự án sử dụng nhiều cú pháp Java 8+ và thư viện bên thứ ba, sự khác biệt lên tới 28%. Đối với ứng dụng 40 MB, điều này có nghĩa là tiết kiệm từ 5 đến 11 MB, rất quan trọng đối với người dùng có băng thông hạn chế.
Cả hai công cụ đều xử lý chính xác mã Kotlin, nhưng R8 tối ưu hóa tốt hơn các cấu trúc đặc thù của Kotlin: lambda, hàm inline, coroutine và kiểu an toàn null. R8 hiểu ngữ nghĩa của siêu dữ liệu Kotlin và có thể loại bỏ an toàn các kiểm tra null không cần thiết và nhúng các hàm inline. Đối với các dự án Kotlin, R8 là công cụ được khuyến nghị của Google.
Thiết lập R8 yêu cầu thay đổi tối thiểu trong cấu hình xây dựng, vì trong AGP 8.0+ công cụ được sử dụng mặc định. Hãy xem xét các khía cạnh cấu hình chính.
Chế độ đầy đủ của R8 (android.enableR8.fullMode=true) kích hoạt các tối ưu hóa mạnh mẽ hơn giúp giảm thêm 5-10% kích thước APK. Ở chế độ này, R8 thực hiện phân tích mã sâu hơn, loại bỏ các lớp và phương thức mà ProGuard cho là có thể tiếp cận. Chế độ đầy đủ có thể yêu cầu các quy tắc -keep bổ sung cho các thư viện sử dụng phản chiếu.
# gradle.properties — bật chế độ đầy đủ của R8
android.enableR8.fullMode=true
# Quy tắc bổ sung cho chế độ đầy đủ
-keep class com.example.reflection.** { *; }
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
Khi xảy ra lỗi trong bản dựng release với R8, Google khuyến nghị: kiểm tra tệp ánh xạ để giải rối mã dấu vết ngăn xếp, tạm thời tắt fullMode để cô lập vấn đề, thêm -whyareyoukeeping để hiểu tại sao một lớp không bị loại bỏ và sử dụng cờ --info của Gradle để có nhật ký xử lý R8 chi tiết.
Để tự động hóa bản dựng với R8 trong CI/CD, điều quan trọng là lưu các tệp ánh xạ như tạo phẩm xây dựng. Mỗi tệp ánh xạ phải được gắn với số phiên bản và biến thể bản dựng. Google khuyến nghị lưu trữ build/outputs/mapping/ cùng với APK/AAB trong hệ thống quản lý tạo phẩm. Điều này sẽ đảm bảo khả năng giải rối sự cố từ bất kỳ phiên bản nào của ứng dụng.
Nhiều năm kinh nghiệm sử dụng R8 trong cộng đồng Android đã tạo ra một bộ thực hành đã được kiểm chứng giúp tránh các vấn đề điển hình và tận dụng tối đa công cụ.
Khi di chuyển từ ProGuard sang R8, nên bắt đầu với AGP 7.x, nơi R8 được bật mặc định nhưng fullMode bị tắt. Sau khi xác minh tính ổn định của bản dựng trên đầy đủ thiết bị và kịch bản, có thể bật fullMode. Mỗi giai đoạn yêu cầu kiểm tra bản dựng release trên thiết bị vật lý với các phiên bản Android khác nhau.
Tệp ánh xạ R8 có cùng định dạng với ProGuard nhưng chứa nhiều thông tin hơn nhờ phân tích chi tiết hơn. Google khuyến nghị: lưu trữ tệp ánh xạ vô thời hạn — chúng cần thiết để giải rối sự cố từ các phiên bản cũ; tích hợp tệp ánh xạ với Firebase Crashlytics thông qua tải lên tự động; thường xuyên xác minh rằng việc giải rối trong bảng điều khiển Firebase khôi phục chính xác tên lớp.
Chế độ đầy đủ của R8 có thể loại bỏ mã được coi là có thể tiếp cận ở chế độ tiêu chuẩn. Các lĩnh vực quan trọng cần kiểm tra: màn hình có WebView (R8 có thể loại bỏ các lớp giao diện cầu nối), ứng dụng có plugin qua classLoader, thư viện phân tích và báo cáo sự cố và chế độ xem tùy chỉnh trong tệp bố cục được tạo qua inflate.
Google khuyến nghị theo dõi kích thước APK sau khi áp dụng R8 trong mỗi bản dựng. Sử dụng APK Analyzer trong Android Studio để so sánh kích thước của các thành phần riêng lẻ: classes.dex, resources.arsc và thư viện mã gốc. R8 có thể ảnh hưởng đến kích thước tệp DEX một cách phi tuyến — đôi khi tối ưu hóa tích cực dẫn đến tăng kích thước do nội tuyến. Giám sát thường xuyên giúp phát hiện kịp thời các bất thường và điều chỉnh quy tắc làm rối mã.
// Ví dụ về lớp được giữ lại cho Firebase Crashlytics
@Keep
class CrashLogger {
fun logException(e: Throwable) {
FirebaseCrashlytics.getInstance().recordException(e)
}
}
// rules.pro — giữ tất cả các lớp có @Keep
// -keep @androidx.annotation.Keep class * { *; }
Câu hỏi thường gặp
Không, R8 được tích hợp trong Android Gradle Plugin và tự động được cài đặt khi bạn cập nhật AGP. Bắt đầu từ AGP 8.0, ProGuard đã bị loại bỏ hoàn toàn khỏi plugin và R8 là công cụ duy nhất. Đối với AGP 7.x, R8 được sử dụng mặc định, nhưng ProGuard vẫn là một tùy chọn. Không cần cài đặt riêng R8 — chỉ cần cập nhật phiên bản AGP của bạn.
R8 nhanh hơn nhờ ba yếu tố: tích hợp vào trình biên dịch DEX loại bỏ một lần xử lý bytecode bổ sung, kiến trúc đa luồng sử dụng tốt hơn bộ xử lý đa lõi và phân tích khả năng tiếp cận thông minh hơn giảm lượng mã cần xử lý. Theo thử nghiệm của Google trên một dự án cỡ trung bình, R8 hoàn thành xử lý trong 12 giây so với 18 giây của ProGuard.
Trong AGP 7.x, bạn có thể tắt R8 qua gradle.properties: android.enableR8=false. Trong AGP 8.0+, không thể quay lại ProGuard vì plugin đã chuyển hoàn toàn sang R8. Nếu dự án phụ thuộc quan trọng vào hành vi cụ thể của ProGuard, nên cố định AGP ở phiên bản 7.4, nơi cả hai công cụ đều khả dụng.
R8 xử lý chính xác coroutine Kotlin nhờ phân tích tích hợp siêu dữ liệu Kotlin. Công cụ hiểu ngữ nghĩa của hàm suspend, đối tượng Continuation và quá trình tạo StateMachine của trình biên dịch Kotlin. R8 không loại bỏ các lớp coroutine cần thiết và có thể tối ưu hóa chúng khi an toàn. Đối với các dự án Kotlin, nên sử dụng chế độ đầy đủ để tối ưu hóa tối đa.
Các vấn đề phổ biến nhất khi di chuyển: thiếu lớp — R8 loại bỏ các lớp mà ProGuard giữ lại; vấn đề nội tuyến — nội tuyến tích cực phá vỡ phản chiếu; không tương thích thư viện — thư viện với quy tắc ProGuard cũ; sự cố chế độ đầy đủ — loại bỏ mã bổ sung trong fullMode. Giải pháp: kiểm tra trên thiết bị vật lý, sử dụng -keep cho phản chiếu và kiểm tra dấu vết ngăn xếp qua tệp ánh xạ.
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm