R8: định nghĩa, tính năng và so sánh với ProGuard

Tác giả: IT Sectr Đã đăng: 2026-04-03 Thời gian đọc: 8 phút

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à sự kế thừa của ProGuard, được tích hợp vào trình biên dịch DEX và thay thế ProGuard từ AGP 8.0.
  • Nén mã trong R8 hiệu quả hơn ProGuard — loại bỏ tới 15% nhiều phương thức và lớp không dùng đến.
  • Desugaring — hỗ trợ tích hợp chuyển đổi cú pháp Java 8+ thành mã tương thích ngược.
  • Tốc độ xây dựng với R8 cao hơn 20-30% nhờ tích hợp vào trình biên dịch DEX.
  • Tương thích với cú pháp quy tắc ProGuard đảm bảo di chuyển minh bạch.

R8 là gì?

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.

Kiến trúc của R8

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.

Lịch sử phát triển

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ị.

Tính năng chính của R8

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.

Thu nhỏ và nén mã

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 Java 8+

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.

Tối ưu hóa cấp DEX

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.

groovy
// 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

So sánh R8 và ProGuard

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ốR8ProGuard
Tích hợpTích hợp trong trình biên dịch DEXCô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ựngNhanh hơn 20-30%Tốc độ cơ bản
DesugaringTích hợpKhông hỗ trợ
Tương thích quy tắcĐầy đủ với ProGuardCú pháp tiêu chuẩn
Hỗ trợ AGP 8.0+Có (tiêu chuẩn)Không (đã loại bỏ)

Kích thước APK cuối cùng

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ế.

Tương thích Kotlin

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 trong dự án Android

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

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.

properties
# 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 *;
}

Gỡ lỗi sự cố R8

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ích hợp CI/CD

Để 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.

Thực hành tốt nhất với R8

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ụ.

Áp dụng dần dần

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.

Giám sát tệp ánh xạ

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.

Kiểm tra với chế độ đầy đủ của R8

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.

Giám sát kích thước bản dựng

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ã.

kotlin
// 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

Tôi có cần cài đặt R8 riêng không?

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.

Tại sao R8 nhanh hơn ProGuard?

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.

Tôi có thể tắt R8 và quay lại ProGuard không?

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ý coroutine Kotlin như thế nào?

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.

Những lỗi nào thường gặp nhất khi di chuyển sang R8?

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

  • R8 là sự kế thừa của ProGuard, được tích hợp vào trình biên dịch DEX và thay thế ProGuard từ AGP 8.0.
  • Nén mã của R8 hiệu quả hơn ProGuard 15%, giảm APK thêm 5-11 MB.
  • Tốc độ xây dựng với R8 cao hơn 20-30% nhờ kiến trúc đa luồng.
  • Desugaring Java 8+ được tích hợp trong R8, loại bỏ nhu cầu thư viện bổ sung.
  • Chế độ đầy đủ kích hoạt các tối ưu hóa mạnh mẽ để nén APK tối đa.
  • Tương thích quy tắc ProGuard với R8 đảm bảo di chuyển minh bạch cho các dự án hiện có.
  • Tệp ánh xạ R8 là bắt buộc để lưu trữ và tích hợp với Firebase Crashlytics.

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.

Thảo luận dự án

Đọc thêm