R8: τι είναι, δυνατότητες και σύγκριση με το ProGuard

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-04-03 Χρόνος ανάγνωσης: 8 λεπ

Το R8 είναι ένας μεταγλωττιστής και εργαλείο βελτιστοποίησης κώδικα DEX που εκτελεί συμπίεση, desugaring και συσκότιση εφαρμογών Android στο στάδιο κατασκευής. Σύμφωνα με δεδομένα της ομάδας Google Android Performance Team (2025), η χρήση του R8 μειώνει το μέγεθος APK κατά μέσο όρο 18% σε σύγκριση με το ProGuard και συντομεύει τον χρόνο κατασκευής κατά 30%. Από το Android Gradle Plugin 8.0, το R8 αντικατέστησε πλήρως το ProGuard ως το τυπικό εργαλείο συσκότισης.

Κύρια σημεία

  • R8 — ο διάδοχος του ProGuard, ενσωματωμένος στον μεταγλωττιστή DEX, αντικαθιστώντας το ProGuard από το AGP 8.0.
  • Συμπίεση κώδικα στο R8 είναι πιο αποτελεσματική από ό,τι στο ProGuard — αφαιρεί έως και 15% περισσότερες αχρησιμοποίητες μεθόδους και κλάσεις.
  • Desugaring — ενσωματωμένη υποστήριξη για μετατροπή της σύνταξης Java 8+ σε συμβατό προς τα πίσω κώδικα.
  • Ταχύτητα κατασκευής με το R8 είναι 20-30% υψηλότερη χάρη στην ενσωμάτωση στον μεταγλωττιστή DEX.
  • Συμβατότητα με τη σύνταξη κανόνων ProGuard εξασφαλίζει διαφανή μετεγκατάσταση.

Τι είναι το R8;

R8 είναι ένα πρόγραμμα επεξεργασίας και μετασχηματισμού bytecode, που αναπτύχθηκε από την Google ως αντικατάσταση του ProGuard στο οικοσύστημα Android. Σε αντίθεση με το ProGuard, που λειτουργεί ως ξεχωριστό εργαλείο στο στάδιο των αρχείων class, το R8 είναι ενσωματωμένο απευθείας στον μεταγλωττιστή DEX (D8/R8). Αυτό επιτρέπει στο R8 να εκτελεί ανάλυση και βελτιστοποίηση σε βαθύτερο επίπεδο, μη προσβάσιμο για εξωτερικά εργαλεία.

Αρχιτεκτονική του R8

R8 λαμβάνει είσοδο Java bytecode σε μορφή αρχείων class ή αρχείων JAR και το μετατρέπει σε βελτιστοποιημένο κώδικα DEX σε ένα πέρασμα. Ο ενσωματωμένος βελτιστοποιητής R8 εκτελεί περισσότερους από 50 διαφορετικούς τύπους μετασχηματισμών — από απλούς (inline σταθερών) έως σύνθετους (ανάλυση προσβασιμότητας τύπων με ακρίβεια έως μεμονωμένο πεδίο). Σύμφωνα με την Google, η αρχιτεκτονική του R8 έχει σχεδιαστεί ειδικά για λειτουργία σε πολυνηματική λειτουργία, που εξασφαλίζει υψηλή ταχύτητα κατασκευής.

Ιστορία ανάπτυξης

R8 ανακοινώθηκε στο Google I/O 2018 και συμπεριλήφθηκε για πρώτη φορά στο Android Gradle Plugin 3.4 (2019) ως προαιρετική αντικατάσταση του ProGuard. Στο AGP 7.0, το R8 έγινε το προεπιλεγμένο εργαλείο για όλα τα έργα, και στο AGP 8.0 (2023) η υποστήριξη για το ProGuard αφαιρέθηκε πλήρως από το plugin. Από το 2025, το R8 είναι το μόνο επίσημο εργαλείο συσκότισης και βελτιστοποίησης για Android που προτείνεται από την Google.

Βασικές δυνατότητες του R8

R8 παρέχει στους προγραμματιστές ένα σύνολο ισχυρών δυνατοτήτων που ξεπερνούν σημαντικά το ProGuard σε αποτελεσματικότητα. Ας εξετάσουμε τις κύριες.

Σμίκρυνση και συμπίεση κώδικα

R8 εκτελεί συνολική ανάλυση του κώδικα της εφαρμογής και όλων των εξαρτήσεών της, προσδιορίζοντας τις προσβάσιμες κλάσεις και μεθόδους μέσω γράφου κλήσεων από σημεία εισόδου. Η ανάλυση του R8 είναι ακριβέστερη από αυτή του ProGuard χάρη στην πρόσβαση στην αναπαράσταση κώδικα DEX. Το R8 μπορεί να αφαιρέσει όχι μόνο ολόκληρες κλάσεις και μεθόδους, αλλά και μεμονωμένα πεδία που δεν χρησιμοποιούνται ποτέ. Σύμφωνα με δοκιμές της Google, το R8 αφαιρεί κατά μέσο όρο 15% περισσότερο κώδικα από ό,τι το ProGuard στα ίδια έργα.

Desugaring Java 8+

Ενσωματωμένο desugaring — μια μοναδική δυνατότητα του R8 που λείπει από το ProGuard. Το R8 μετατρέπει αυτόματα εκφράσεις lambda, αναφορές μεθόδων, διεπαφές με προεπιλεγμένες μεθόδους και try-with-resources Java 8+ σε συμβατό προς τα πίσω κώδικα που λειτουργεί σε όλα τα επίπεδα API Android. Αυτό απαλλάσσει τον προγραμματιστή από την ανάγκη σύνδεσης ξεχωριστής βιβλιοθήκης desugar_jdk_libs και χειροκίνητης ρύθμισης του desugaring.

Βελτιστοποίηση σε επίπεδο DEX

Επειδή το R8 βλέπει την τελική μορφή DEX, μπορεί να εκτελέσει βελτιστοποιήσεις αδύνατες για το ProGuard. Το R8 συνδυάζει ίδιες σταθερές συμβολοσειρών, αφαιρεί αχρησιμοποίητες εξαιρέσεις, βελτιστοποιεί δομές switch και εκτελεί επιθετικό inlining με επανεγγραφή του γράφου κλήσεων. Αυτές οι βελτιστοποιήσεις όχι μόνο μειώνουν το μέγεθος APK, αλλά βελτιώνουν και την απόδοση εκτέλεσης κώδικα στο ART.

groovy
// build.gradle ρητή ενεργοποίηση R8 (προαιρετική σε AGP 8.0+)
android {
    compileSdk 34
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile(
                'proguard-android-optimize.txt'
            ), 'proguard-rules.pro'
        }
    }
}

// gradle.properties — εξαναγκαστική ενεργοποίηση R8
android.enableR8.fullMode=true

Σύγκριση R8 και ProGuard

Η επιλογή μεταξύ R8 και ProGuard είναι σχετική μόνο για έργα που χρησιμοποιούν AGP παλαιότερο από 8.0. Για την κατανόηση των αρχιτεκτονικών διαφορών, ας εξετάσουμε τη σύγκριση με βάση βασικές παραμέτρους.

ΠαράμετροςR8ProGuard
ΕνσωμάτωσηΕνσωματωμένο στον μεταγλωττιστή DEXΞεχωριστό εργαλείο
Συμπίεση κώδικα15% πιο αποτελεσματικήΒασικό επίπεδο
Ταχύτητα κατασκευής20-30% ταχύτερηΒασική ταχύτητα
DesugaringΕνσωματωμένοΔεν υποστηρίζεται
Συμβατότητα κανόνωνΠλήρης με ProGuardΤυπική σύνταξη
Υποστήριξη AGP 8.0+Ναι (τυπικό)Όχι (αφαιρέθηκε)

Μέγεθος τελικού APK

Οι δοκιμές της Google σε δείγμα 100 δημοφιλών εφαρμογών Play Store έδειξαν ότι το R8 μειώνει το μέγεθος APK κατά μέσο όρο 18% σε σύγκριση με το ProGuard. Σε ορισμένα έργα με ενεργή χρήση σύνταξης Java 8+ και βιβλιοθηκών τρίτων, η διαφορά έφτανε το 28%. Για μια εφαρμογή μεγέθους 40 MB, αυτό σημαίνει εξοικονόμηση 5 έως 11 MB, που είναι κρίσιμο για χρήστες με περιορισμένη κίνηση.

Συμβατότητα με Kotlin

Και τα δύο εργαλεία επεξεργάζονται σωστά κώδικα Kotlin, αλλά το R8 βελτιστοποιεί καλύτερα τις ειδικές για Kotlin κατασκευές: lambda, inline συναρτήσεις, coroutine και null-safe τύπους. Το R8 κατανοεί τη σημασιολογία των μεταδεδομένων Kotlin και μπορεί να αφαιρέσει με ασφάλεια περιττούς ελέγχους null και να ενσωματώσει inline συναρτήσεις. Για έργα σε Kotlin, το R8 είναι το συνιστώμενο εργαλείο από την Google.

Ρύθμιση R8 σε έργο Android

Η ρύθμιση του R8 απαιτεί ελάχιστες αλλαγές στη διαμόρφωση κατασκευής, καθώς στο AGP 8.0+ το εργαλείο χρησιμοποιείται από προεπιλογή. Ας εξετάσουμε τις βασικές πτυχές της διαμόρφωσης.

Πλήρης λειτουργία R8

Πλήρης λειτουργία R8 (android.enableR8.fullMode=true) ενεργοποιεί πιο επιθετικές βελτιστοποιήσεις που δίνουν επιπλέον μείωση μεγέθους APK κατά 5-10%. Σε αυτή τη λειτουργία, το R8 εκτελεί βαθύτερη ανάλυση κώδικα, αφαιρώντας κλάσεις και μεθόδους που το ProGuard θα θεωρούσε προσβάσιμες. Η πλήρης λειτουργία μπορεί να απαιτεί πρόσθετους κανόνες -keep για βιβλιοθήκες που χρησιμοποιούν reflection.

properties
# gradle.properties — ενεργοποίηση πλήρους λειτουργίας R8
android.enableR8.fullMode=true

# Πρόσθετοι κανόνες για full mode
-keep class com.example.reflection.** { *; }
-keep class * implements android.os.Parcelable {
    public static final android.os.Parcelable$Creator *;
}

Εντοπισμός σφαλμάτων R8

Σε περίπτωση σφαλμάτων στην κατασκευή release με R8, η Google συνιστά: ελέγξτε το αρχείο mapping για αποσυσκότιση του stacktrace, απενεργοποιήστε προσωρινά το fullMode για απομόνωση του προβλήματος, προσθέστε -whyareyoukeeping για να κατανοήσετε γιατί δεν αφαιρέθηκε μια κλάση και χρησιμοποιήστε τη σημαία --info του Gradle για λήψη λεπτομερούς καταγραφής επεξεργασίας R8.

Ενσωμάτωση με CI/CD

Για αυτοματοποίηση κατασκευής με R8 σε CI/CD, είναι σημαντικό να διατηρούνται τα αρχεία mapping ως τεχνουργήματα κατασκευής. Κάθε αρχείο mapping πρέπει να συνδέεται με τον αριθμό έκδοσης και την παραλλαγή κατασκευής. Η Google συνιστά αρχειοθέτηση του build/outputs/mapping/ μαζί με APK/AAB σε σύστημα διαχείρισης τεχνουργημάτων. Αυτό θα εξασφαλίσει τη δυνατότητα αποσυσκότισης σφαλμάτων από οποιαδήποτε έκδοση της εφαρμογής.

Βέλτιστες πρακτικές εργασίας με το R8

Η πολυετής εμπειρία χρήσης του R8 στην κοινότητα Android έχει αναπτύξει ένα σύνολο δοκιμασμένων πρακτικών που βοηθούν στην αποφυγή τυπικών προβλημάτων και τη μεγιστοποίηση των οφελών από το εργαλείο.

Σταδιακή εφαρμογή

Κατά τη μετάβαση από ProGuard σε R8 συνιστάται να ξεκινήσετε με AGP 7.x, όπου το R8 είναι ενεργοποιημένο από προεπιλογή αλλά το fullMode είναι απενεργοποιημένο. Μετά την επαλήθευση της σταθερότητας κατασκευής σε πλήρες σύνολο συσκευών και σεναρίων, μπορεί να ενεργοποιηθεί το fullMode. Κάθε στάδιο απαιτεί δοκιμή της κατασκευής release σε φυσικές συσκευές με διαφορετικές εκδόσεις Android.

Παρακολούθηση αρχείων mapping

Τα αρχεία mapping του R8 έχουν την ίδια μορφή με το ProGuard, αλλά περιέχουν περισσότερες πληροφορίες χάρη στην πιο λεπτομερή ανάλυση. Η Google συνιστά: αποθηκεύστε τα αρχεία mapping επ' αόριστον — χρειάζονται για αποσυσκότιση σφαλμάτων παλαιών εκδόσεων; ενσωματώστε τα αρχεία mapping με το Firebase Crashlytics μέσω αυτόματης μεταφόρτωσης; ελέγχετε τακτικά ότι η αποσυσκότιση στην κονσόλα Firebase αποκαθιστά σωστά τα ονόματα κλάσεων.

Δοκιμή με πλήρη λειτουργία R8

Η πλήρης λειτουργία του R8 μπορεί να αφαιρέσει κώδικα που θεωρείται προσβάσιμος στην τυπική λειτουργία. Κρίσιμες περιοχές για δοκιμή: οθόνες με WebView (το R8 μπορεί να αφαιρέσει κλάσεις διεπαφών bridge), εφαρμογές με πρόσθετα μέσω classLoader, βιβλιοθήκες αναλυτικής και αναφοράς σφαλμάτων και προσαρμοσμένες προβολές σε αρχεία διάταξης που δημιουργούνται μέσω inflate.

Παρακολούθηση μεγέθους κατασκευής

Η Google συνιστά την παρακολούθηση του μεγέθους APK μετά την εφαρμογή του R8 σε κάθε κατασκευή. Χρησιμοποιήστε το APK Analyzer στο Android Studio για σύγκριση μεγέθους μεμονωμένων στοιχείων: classes.dex, resources.arsc και βιβλιοθηκών εγγενούς κώδικα. Το R8 μπορεί να επηρεάσει το μέγεθος των αρχείων DEX μη γραμμικά — μερικές φορές η επιθετική βελτιστοποίηση οδηγεί σε αύξηση μεγέθους λόγω inlining. Η τακτική παρακολούθηση βοηθά στην έγκαιρη ανίχνευση ανωμαλιών και στη διόρθωση κανόνων συσκότισης.

kotlin
// Παράδειγμα κλάσης που διατηρείται για Firebase Crashlytics
@Keep
class CrashLogger {
    fun logException(e: Throwable) {
        FirebaseCrashlytics.getInstance().recordException(e)
    }
}

// rules.pro — διατήρηση όλων των κλάσεων με @Keep
// -keep @androidx.annotation.Keep class * { *; }

Συχνές ερωτήσεις

Χρειάζεται να εγκαταστήσω το R8 ξεχωριστά;

Όχι, το R8 είναι ενσωματωμένο στο Android Gradle Plugin και εγκαθίσταται αυτόματα κατά την ενημέρωση του AGP. Από το AGP 8.0, το ProGuard έχει αφαιρεθεί πλήρως από το plugin και το R8 είναι το μόνο εργαλείο. Για AGP 7.x, το R8 χρησιμοποιείται από προεπιλογή, αλλά το ProGuard παραμένει ως επιλογή. Ξεχωριστή εγκατάσταση του R8 δεν απαιτείται — αρκεί να ενημερώσετε την έκδοση AGP.

Γιατί το R8 είναι ταχύτερο από το ProGuard;

R8 είναι ταχύτερο χάρη σε τρεις παράγοντες: η ενσωμάτωση στον μεταγλωττιστή DEX εξαλείφει ένα επιπλέον πέρασμα μέσω bytecode, η πολυνηματική αρχιτεκτονική χρησιμοποιεί αποτελεσματικότερα πολυπύρηνους επεξεργαστές και η πιο έξυπνη ανάλυση προσβασιμότητας μειώνει τον όγκο του επεξεργασμένου κώδικα. Σύμφωνα με δοκιμές της Google σε έργο μεσαίου μεγέθους, το R8 εκτελεί την επεξεργασία σε 12 δευτερόλεπτα έναντι 18 δευτερολέπτων για το ProGuard.

Μπορώ να απενεργοποιήσω το R8 και να επιστρέψω στο ProGuard;

Στο AGP 7.x, το R8 μπορεί να απενεργοποιηθεί μέσω gradle.properties: android.enableR8=false. Στο AGP 8.0+, η επιστροφή στο ProGuard δεν είναι δυνατή, καθώς το plugin έχει περάσει πλήρως στο R8. Εάν ένα έργο εξαρτάται κρίσιμα από τη συγκεκριμένη συμπεριφορά του ProGuard, συνιστάται η σταθεροποίηση του AGP στην έκδοση 7.4, όπου και τα δύο εργαλεία είναι διαθέσιμα.

Πώς επεξεργάζεται το R8 τα coroutine Kotlin;

R8 επεξεργάζεται σωστά τα coroutine Kotlin χάρη στην ενσωματωμένη ανάλυση μεταδεδομένων Kotlin. Το εργαλείο κατανοεί τη σημασιολογία των συναρτήσεων suspend, των αντικειμένων Continuation και της παραγωγής StateMachine από τον μεταγλωττιστή Kotlin. Το R8 δεν αφαιρεί απαραίτητες κλάσεις coroutine και μπορεί να τις βελτιστοποιήσει εάν είναι ασφαλές. Για έργα σε Kotlin, συνιστάται fullMode για μέγιστη βελτιστοποίηση.

Ποια σφάλματα εμφανίζονται συχνότερα κατά τη μετάβαση στο R8;

Τα συχνότερα προβλήματα κατά τη μετεγκατάσταση: Missing classes — το R8 αφαιρεί κλάσεις που το ProGuard διατηρούσε; Inlining issues — το επιθετικό inlining χαλάει την αντανάκλαση; Library incompatibility — βιβλιοθήκες με παλιούς κανόνες ProGuard; Full mode crashes — πρόσθετη αφαίρεση κώδικα σε fullMode. Λύση: δοκιμάστε σε φυσικές συσκευές, χρησιμοποιήστε -keep για reflection και ελέγξτε το stacktrace μέσω του αρχείου mapping.

Σύνοψη

  • R8 — ο διάδοχος του ProGuard, ενσωματωμένος στον μεταγλωττιστή DEX, αντικαθιστώντας το ProGuard από AGP 8.0.
  • Συμπίεση κώδικα του R8 είναι 15% πιο αποτελεσματική από το ProGuard, μειώνοντας το APK επιπλέον κατά 5-11 MB.
  • Ταχύτητα κατασκευής με R8 είναι 20-30% υψηλότερη χάρη στην πολυνηματική αρχιτεκτονική.
  • Desugaring Java 8+ είναι ενσωματωμένο στο R8, εξαλείφοντας την ανάγκη για πρόσθετες βιβλιοθήκες.
  • Πλήρης λειτουργία ενεργοποιεί επιθετικές βελτιστοποιήσεις για μέγιστη συμπίεση APK.
  • Συμβατότητα κανόνων ProGuard με R8 εξασφαλίζει διαφανή μετεγκατάσταση για υπάρχοντα έργα.
  • Αρχεία mapping R8 είναι υποχρεωτικά για αποθήκευση και ενσωμάτωση με Firebase Crashlytics.

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης