Android Runtime (ART) — το περιβάλλον εκτέλεσης εφαρμογών Android, που εισήχθη στο Android 5.0 Lollipop ως αντικατάσταση του Dalvik. Η κύρια καινοτομία — η εκ των προτέρων μεταγλώττιση AOT του bytecode DEX σε εγγενή κώδικα μηχανής απευθείας κατά την εγκατάσταση της εφαρμογής, η οποία εξάλειψε το πολυετές πρόβλημα προθέρμανσης του μεταγλωττιστή JIT. Σύμφωνα με Google, 2024, το ART παρέχει αύξηση απόδοσης έως 20–30% σε σύγκριση με το Dalvik, διατηρώντας πλήρη συμβατότητα προς τα πίσω με τη μορφή DEX.
Κύρια σημεία
Android Runtime (ART) — το περιβάλλον εκτέλεσης εφαρμογών που μεταγλωττίζει το bytecode DEX σε εγγενή κώδικα μηχανής πριν από την εκτέλεση. Σε αντίθεση με το Dalvik, το οποίο χρησιμοποιούσε μεταγλώττιση Just-In-Time κατά την εκτέλεση, το ART εκτελεί μεταγλώττιση Ahead-Of-Time (AOT) κατά την εγκατάσταση του APK. Αυτή η θεμελιώδης αλλαγή αρχιτεκτονικής οδήγησε σε σημαντική επιτάχυνση των εφαρμογών και μείωση της κατανάλωσης ενέργειας.
Το ART εμφανίστηκε για πρώτη φορά ως πειραματική επιλογή στο Android 4.4 KitKat. Οι προγραμματιστές μπορούσαν να το ενεργοποιήσουν στις ρυθμίσεις προγραμματιστή και να δοκιμάσουν τις εφαρμογές τους. Στο Android 5.0 Lollipop, το ART έγινε το προεπιλεγμένο περιβάλλον εκτέλεσης και το Dalvik αφαιρέθηκε εντελώς από την πλατφόρμα. Μέχρι την κυκλοφορία του Android 7.0 Nougat, το ART απέκτησε υβριδική λειτουργία μεταγλώττισης.
Η απόφαση αντικατάστασης του Dalvik με ART δεν ήταν ξαφνική. Οι εργασίες για το νέο περιβάλλον ξεκίνησαν το 2012, όταν η Google συνειδητοποίησε τους περιορισμούς της προσέγγισης JIT. Κύριος στόχοι: επιτάχυνση εκκίνησης εφαρμογών, μείωση φόρτου επεξεργαστή και μείωση κατανάλωσης ενέργειας. Την ανάπτυξη ηγήθηκε η ομάδα Android Runtime Group, η οποία είχε προηγουμένως εργαστεί στις βελτιστοποιήσεις του Dalvik.
Το ART χρησιμοποιεί την ίδια αρχιτεκτονική καταχωρητών με το Dalvik, αλλά με έναν πλήρως επανασχεδιασμένο μεταγλωττιστή. Αντί για διερμηνέα και μεταγλωττιστή JIT, το ART περιλαμβάνει τον μεταγλωττιστή AOT dex2oat, ο οποίος μετατρέπει τα αρχεία DEX σε δυαδικά ELF κατά την εγκατάσταση. Ως αποτέλεσμα, η εφαρμογή στο ART ξεκινά αμέσως με εγγενή απόδοση, χωρίς φάση προθέρμανσης.
ART διατήρησε τις βασικές αρχές του Dalvik: απομόνωση εφαρμογών μέσω ξεχωριστών διεργασιών, αρχιτεκτονική καταχωρητών και υποστήριξη μορφής DEX. Ωστόσο, η εσωτερική υλοποίηση ξαναγράφτηκε πλήρως. Αντί για τον διερμηνέα Dalvik, το ART περιλαμβάνει τρεις λειτουργίες εκτέλεσης: διερμηνέα, μεταγλωττιστή JIT και μεταγλωττιστή AOT dex2oat. Η επιλογή λειτουργίας εξαρτάται από το στάδιο του κύκλου ζωής της εφαρμογής.
Το βασικό στοιχείο του ART — dex2oat (dalvik executable to optimized android translator). Αυτό το εργαλείο εκτελείται κατά την εγκατάσταση της εφαρμογής (από Android 7.0 — επίσης κατά τη βελτιστοποίηση παρασκηνίου). Το dex2oat διαβάζει αρχεία DEX από το APK, βελτιστοποιεί το bytecode και δημιουργεί ένα αρχείο OAT — ένα δυαδικό ELF με εγγενή κώδικα. Τα αρχεία OAT αποθηκεύονται στον κατάλογο /data/dalvik-cache/.
# Έλεγχος αρχείων OAT στη συσκευή
adb shell ls -la /data/dalvik-cache/arm64/
# Αναγκαστική μεταγλώττιση της εφαρμογής
adb shell cmd package compile -m speed com.example.app
Το σύστημα ART αποτελείται από πολλές διασυνδεδεμένες μονάδες. Ο μεταγλωττιστής dex2oat είναι υπεύθυνος για τη δημιουργία εγγενούς κώδικα. Ο συλλέκτης απορριμμάτων (GC) διαχειρίζεται την απελευθέρωση μνήμης. Ο διερμηνέας εκτελεί σπάνια καλούμενο κώδικα χωρίς μεταγλώττιση. Ο προφιλαριστής παρακολουθεί hot μεθόδους για υβριδική μεταγλώττιση. Κάθε μονάδα μπορεί να λειτουργεί ανεξάρτητα, καθιστώντας το ART ευέλικτο και επεκτάσιμο.
Από το Android 7.0 Nougat, το ART χρησιμοποιεί υβριδική προσέγγιση στη μεταγλώττιση, συνδυάζοντας τα πλεονεκτήματα των JIT και AOT. Κατά την εγκατάσταση της εφαρμογής, το ART δεν εκτελεί πλέον πλήρη μεταγλώττιση AOT — αντί αυτού, η εφαρμογή ξεκινά σε λειτουργία διερμηνείας με μεταγλώττιση JIT των hot μεθόδων. Αυτό μειώνει τον χρόνο εγκατάστασης και τον καταλαμβανόμενο χώρο.
Παράλληλα λειτουργεί προφιλαριστής παρασκηνίου (background profiler). Συλλέγει στατιστικά εκτέλεσης: ποιες μέθοδοι καλούνται συχνότερα, ποιοι κλάδοι κώδικα εκτελούνται, ποιες κλάσεις φορτώνονται. Μετά τη συλλογή επαρκών δεδομένων (συνήθως μετά από 2–3 εκκινήσεις της εφαρμογής), το ART εκτελεί το dex2oat στο παρασκήνιο και μεταγλωττίζει μόνο προφιλαρισμένες hot μεθόδους σε εγγενή κώδικα.
ART υποστηρίζει πολλές λειτουργίες μεταγλώττισης που διαχειρίζονται μέσω system_server. Η λειτουργία "speed" μεταγλωττίζει όλες τις μεθόδους σε AOT (μέγιστη απόδοση, μεγάλη εγκατάσταση). Η λειτουργία "speed-profile" μεταγλωττίζει μόνο προφιλαρισμένες hot μεθόδους (ισορροπία ταχύτητας και μεγέθους). Η λειτουργία "verify" μόνο επαληθεύει το bytecode χωρίς μεταγλώττιση (ελάχιστος χώρος, διερμηνεία). Από προεπιλογή χρησιμοποιείται speed-profile — βέλτιστο για τις περισσότερες εφαρμογές.
| Λειτουργία | Μεταγλώττιση | Χρόνος εγκατάστασης | Απόδοση |
|---|---|---|---|
| speed | Πλήρης AOT | Μεγάλος | Μέγιστη |
| speed-profile | Προφιλαρισμένη AOT | Γρήγορος | Υψηλή |
| verify | Χωρίς μεταγλώττιση | Άμεσος | Διερμηνεία |
| space | Ελάχιστη AOT | Μέτριος | Μέτρια |
Ο προφιλαριστής συλλέγει δεδομένα εκτέλεσης σε ειδικά αρχεία .prof. Κάθε εφαρμογή αποθηκεύει το προφίλ της στο /data/misc/profiles/. Κατά την επίτευξη του ορίου (συνήθως 1000 δείγματα), ο προφιλαριστής εκτελεί το dex2oat για μεταγλώττιση των αναγνωρισμένων hot μεθόδων. Τα προφίλ διατηρούνται μεταξύ των ενημερώσεων εφαρμογών, επιταχύνοντας την εκ νέου βελτιστοποίηση μετά από ενημερώσεις OTA συστήματος.
Η συλλογή απορριμμάτων στο ART έχει βελτιωθεί ριζικά σε σύγκριση με το Dalvik. Αντί για τον μονής γραμμής Concurrent Mark and Sweep (CMS), το ART χρησιμοποιεί συλλέκτη γενεών με πολλές βελτιστοποιήσεις: moving collector (συμπίεση σωρού), large object space (ξεχωριστή αποθήκευση μεγάλων αντικειμένων) και concurrent compaction (παράλληλη συμπίεση).
Μια τυπική παύση GC στο ART είναι 2–3 ms έναντι 5–10 ms στο Dalvik. Αυτό κατέστη δυνατό χάρη σε διάφορους μηχανισμούς. Πρώτον, το ART χρησιμοποιεί read-barrier αντί stop-the-world για ταυτόχρονες φάσεις. Δεύτερον, ο συλλέκτης γενεών επεξεργάζεται μόνο τη νέα γενιά αντικειμένων στους περισσότερους κύκλους, χωρίς να επηρεάζει ολόκληρο τον σωρό. Τρίτον, το large object space (LOS) εκχωρείται ξεχωριστά και δεν συμμετέχει σε κανονικούς κύκλους GC.
// Ενεργοποίηση αρχείων καταγραφής GC για αποσφαλμάτωση
System.logV("ART", "GC trigger: allocation failed");
// Αναγκαστική κλήση GC (δεν συνιστάται σε παραγωγή)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
Debug.getRuntimeIStats();
}
Παρά τη βελτιωμένη GC, οι διαρροές μνήμης παραμένουν ένα επίκαιρο πρόβλημα. Μια αιτία ειδική για το ART — φόρτωση εγγενών βιβλιοθηκών μέσω JNI χωρίς σωστή απελευθέρωση. Εάν ο εγγενής κώδικας εκχωρεί μνήμη μέσω malloc αλλά δεν καλεί free, το ART δεν μπορεί να ελευθερώσει αυτή τη μνήμη — βρίσκεται εκτός του διαχειριζόμενου σωρού. Το εργαλείο AddressSanitizer στο Android NDK βοηθά στον εντοπισμό τέτοιων διαρροών.
ART και Dalvik — δύο θεμελιωδώς διαφορετικές υλοποιήσεις της ίδιας εργασίας: εκτέλεση εφαρμογών Android. Οι διαφορές επηρεάζουν όλα τα επίπεδα: από τη μεταγλώττιση έως τη διαχείριση μνήμης. Παρακάτω παρουσιάζεται μια σύγκριση βασικών παραμέτρων απόδοσης και συμβατότητας.
Το κύριο πλεονέκτημα του ART — εξάλειψη της προθέρμανσης JIT. Στο Dalvik, η εφαρμογή μπορούσε να επιβραδύνεται τα πρώτα 3–10 δευτερόλεπτα ενώ ο JIT μεταγλώττιζε hot μεθόδους. Στο ART, όλες οι μέθοδοι είναι ήδη μεταγλωττισμένες σε εγγενή κώδικα (ή θα μεταγλωττιστούν στο παρασκήνιο). Αυτό είναι ιδιαίτερα αισθητό σε παιχνίδια και εφαρμογές με βαριά διεπαφή: η διαφορά στα fps μπορεί να φτάσει 15–20% υπέρ του ART.
| Παράμετρος | Dalvik | ART |
|---|---|---|
| Μεταγλώττιση | JIT (κατά την εκτέλεση) | AOT + υβριδική (κατά την εγκατάσταση) |
| Χρόνος εκκίνησης | 3–10 δ (προθέρμανση) | Άμεσος |
| Μέγεθος APK | ~6–7 MB (DEX) | +20% (OAT) |
| Παύσεις GC | 5–10 ms | 2–3 ms |
| Κατανάλωση ενέργειας | Υψηλότερη (JIT θερμαίνει CPU) | Χαμηλότερη (εγγενής κώδικας) |
Όλες οι εφαρμογές που γράφτηκαν για Dalvik λειτουργούν σε ART χωρίς αλλαγές. Η Google εγγυάται πλήρη συμβατότητα προς τα πίσω σε επίπεδο bytecode DEX. Εξαίρεση — κώδικας που χρησιμοποιεί Dalvik-specific εσωτερικό API μέσω αντανάκλασης: μέλη της κλάσης dalvik.system.DexFile που επισημαίνονται με @hide στο Android SDK. Τέτοιος κώδικας πρέπει να ενημερωθεί για χρήση δημόσιων API.
ART έγινε το πρώτο περιβάλλον εκτέλεσης Android με εγγενή υποστήριξη λειτουργιών Java 8. Από το Android 7.0, το ART περιλαμβάνει desugaring — τη διαδικασία μετατροπής κατασκευών Java 8 (lambdas, method references, Stream API) σε ισοδύναμο κώδικα Java 7. Αυτό επιτρέπει τη χρήση σύγχρονης σύνταξης χωρίς απώλεια συμβατότητας με παλαιότερες συσκευές.
Το desugaring εκτελείται από τον μεταγλωττιστή D8 και λειτουργεί ως εξής. Ο πηγαίος κώδικας με lambda μετατρέπεται σε συνθετική μέθοδο εντός της ίδιας κλάσης και η lambda αντικαθίσταται με κλήση invoke-custom. Το runtime του ART υποστηρίζει την εντολή invoke-custom, που προστέθηκε ειδικά για Java 8. Σε συσκευές με Android 6.0 και παλαιότερες, τα lambdas desugar-άρονται σε ανώνυμες κλάσεις.
// Lambda Java 8 — desugaring στο ART
button.setOnClickListener(v -> handleClick(v));
// Μετά το desugaring (ισοδύναμο σε Java 7)
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
handleClick(v);
}
});
Δεν υποστηρίζονται όλες οι λειτουργίες Java 8 από το desugaring. Το API java.time (ημερομηνία και ώρα) είναι προσβάσιμο μόνο μέσω desugar_jdk_libs — μιας πρόσθετης βιβλιοθήκης που προστίθεται στο build.gradle. Το Stream API απαιτεί επίσης desugar_jdk_libs. Τα java.util.function και Optional λειτουργούν χωρίς πρόσθετες εξαρτήσεις. Η πλήρης υποστήριξη Java 8 είναι διαθέσιμη σε συσκευές με Android 8.0 και νεότερες χωρίς desugaring.
Παρόλο που το ART είναι συμβατό προς τα πίσω, ορισμένες πρακτικές βελτιστοποίησης βελτιώνουν την απόδοση ακριβώς σε αυτό το περιβάλλον. Η κύρια σύσταση — ελαχιστοποίηση της αντανάκλασης. Το ART μεταγλωττίζει μεθόδους ορατές στο στάδιο μεταγλώττισης σε άμεση κλήση κώδικα μηχανής. Η Αντανάκλαση αναγκάζει το ART να δημιουργεί πρόσθετα stub, επιβραδύνοντας την εκτέλεση κατά 10–15%.
Από το Android 9.0, το ART υποστηρίζει App Startup Optimization. Ο προγραμματιστής μπορεί να επισημάνει κλάσεις αρχικοποίησης στο manifest μέσω <initialization> και το ART θα τις προφορτώσει κατά την εκκίνηση της εφαρμογής. Αυτό μειώνει τον χρόνο εκκίνησης κατά 5–15% για εφαρμογές με πολλά πρόσθετα ή βιβλιοθήκες.
<!-- App Startup Optimization στο AndroidManifest.xml -->
<application>
<profileable
android:shell="true"
android:enable="true" />
</application>
Για τη μέτρηση απόδοσης σε ART, χρησιμοποιήστε systrace και perfetto. Το Systrace δείχνει τον χρόνο μεταγλώττισης dex2oat, τη συχνότητα GC και την ταχύτητα απόδοσης καρέ. Το Perfetto παρέχει πιο λεπτομερείς πληροφορίες: κατανομή νημάτων, χρόνο μεταβάσεων JNI, φόρτωση εγγενών βιβλιοθηκών. Εκτέλεση: adb shell perfetto -o /data/misc/perfetto-traces/trace.perfetto -t 10s sched freq idle am wm.
Συχνές ερωτήσεις
ART (Android Runtime) — το περιβάλλον εκτέλεσης εφαρμογών Android που μεταγλωττίζει τον κώδικα της εφαρμογής σε κώδικα μηχανής κατά την εγκατάσταση. Αυτό επιταχύνει την εκκίνηση και λειτουργία των εφαρμογών σε σύγκριση με το παλιό περιβάλλον Dalvik.
ART μεταγλωττίζει τον κώδικα εκ των προτέρων (AOT) κατά την εγκατάσταση της εφαρμογής, ενώ το Dalvik τον μεταγλώττιζε τμηματικά κατά την εκτέλεση (JIT). Επομένως, στο ART οι εφαρμογές ξεκινούν ταχύτερα και καταναλώνουν λιγότερη ενέργεια.
Εκτελέστε adb shell getprop και βρείτε την ιδιότητα persist.sys.dalvik.vm.lib.2. Η τιμή "libart.so" σημαίνει ART, "libdvm.so" — Dalvik. Σε όλες τις συσκευές με Android 5.0+, το περιβάλλον εκτέλεσης είναι ART.
Ελαφρώς. Η ίδια η εφαρμογή παραμένει σε μορφή APK με αρχεία DEX. Το ART δημιουργεί ένα πρόσθετο αρχείο OAT στο /data/dalvik-cache/, το οποίο καταλαμβάνει 10–20% περισσότερο χώρο από το αρχικό DEX, αλλά αυτή η αποθήκευση δεν περιλαμβάνεται στο μέγεθος APK.
Ναι, το ART υποστηρίζει τις περισσότερες λειτουργίες Java 8 μέσω του μηχανισμού desugaring. Τα lambdas, method references και functional interfaces λειτουργούν σε όλες τις συσκευές με Android 5.0+. Για Stream API και java.time απαιτείται η βιβλιοθήκη desugar_jdk_libs.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης