Πώς λειτουργεί η εγκατάσταση εφαρμογών Android κάτω από την κουκούλα

A smartphone on engineering blueprints with gears, illustrating how app installation works

Όταν πατάτε "Εγκατάσταση" σε ένα αρχείο APK ή κάνετε λήψη μιας εφαρμογής από το Play Store, μια σύνθετη ακολουθία λειτουργιών ξεκινά στα παρασκήνια. Αυτό που φαίνεται να είναι μια απλή γραμμή προόδου αντιπροσωπεύει στην πραγματικότητα δεκάδες βήματα που περιλαμβάνουν ανάλυση πακέτων, κρυπτογραφική επαλήθευση, διαχείριση αδειών, εξαγωγή αρχείων και βελτιστοποίηση κώδικα. Η κατανόηση αυτής της διαδικασίας εξηγεί γιατί μερικές φορές αποτυγχάνουν οι εγκαταστάσεις και τι μπορείτε να κάνετε για αυτό.

Σε αυτό το άρθρο, θα περάσουμε σε κάθε σημαντικό βήμα του αγωγού εγκατάστασης Android, από τη στιγμή που το σύστημα λαμβάνει ένα APK μέχρι το σημείο όπου η εφαρμογή είναι έτοιμη για εκκίνηση.

Βήμα 1: Έναρξη της εγκατάστασης

Η διαδικασία εγκατάστασης ξεκινά διαφορετικά ανάλογα με την πηγή:

  • Play Store: Η εφαρμογή Play Store πραγματοποιεί λήψη του APK (ή διαχωρισμού APK) και καλεί το πρόγραμμα εγκατάστασης πακέτων του συστήματος με ειδικά προνόμια που παρακάμπτουν ορισμένες επιβεβαιώσεις χρηστών.
  • Πλευρική φόρτωση: Όταν ανοίγετε ένα αρχείο APK, το Android εκκινεί τη δραστηριότητα εγκατάστασης πακέτων. Σε Android 8.0 και μεταγενέστερες εκδόσεις, η εφαρμογή εγκατάστασης πρέπει να έχει το δικαίωμα "Εγκατάσταση άγνωστων εφαρμογών" για τη συγκεκριμένη πηγή.
  • ADB: Η εντολή adb install επικοινωνεί απευθείας με την υπηρεσία διαχείρισης πακέτων μέσω USB, παρακάμπτοντας πλήρως το πρόγραμμα εγκατάστασης γραφικών.

Ανεξάρτητα από την πηγή, όλες οι εγκαταστάσεις φθάνουν τελικά στην ίδια υπηρεσία συστήματος: το PackageManagerService (PMS). Αυτή είναι η κεντρική αρχή για όλες τις λειτουργίες πακέτων στο Android.

Βήμα 2: Ανάλυση πακέτου

Πριν από οτιδήποτε άλλο, το σύστημα πρέπει να καταλάβει τι πρόκειται να εγκαταστήσει. Το PackageManagerService καλεί το PackageParser για να διαβάσει το αρχείο APK και να εξαγάγει τα μεταδεδομένα του.

Ο αναλυτής διαβάζει το αρχείο AndroidManifest.xml μέσα από το APK. Αυτό το δυαδικό αρχείο XML περιέχει κρίσιμες πληροφορίες:

  • Όνομα πακέτου: Το μοναδικό αναγνωριστικό για την εφαρμογή (π.χ). com.example.myapp
  • Κωδικός και όνομα έκδοσης: Χρησιμοποιείται για να προσδιορίσει εάν πρόκειται για αναβάθμιση ή για νέα εγκατάσταση
  • Ελάχιστες και στοχευόμενες εκδόσεις SDK: Καθορίζει τη συμβατότητα με τη συσκευή
  • Δηλωμένες άδειες: Τόσο τα δικαιώματα που ζητά η εφαρμογή όσο και τα προσαρμοσμένα δικαιώματα που ορίζει
  • Συστατικά: Δραστηριότητες, υπηρεσίες, δέκτες εκπομπής και πάροχοι περιεχομένου που καταχωρεί η εφαρμογή
  • Χαρακτηριστικά υλικού και λογισμικού: Απαιτήσεις όπως κάμερα, GPS ή συγκεκριμένες εκδόσεις OpenGL

Εάν το μανιφέστο έχει κακή μορφή ή η δομή APK δεν είναι έγκυρη, η εγκατάσταση αποτυγχάνει σε αυτό το στάδιο με ένα μήνυμα "Σφάλμα ανάλυσης". Αυτός είναι ένας από τους πιο συνηθισμένους λόγους για τους οποίους τα παραφορτωμένα APK αποτυγχάνουν να εγκατασταθούν.

Βήμα 3: Έλεγχοι συμβατότητας

Αφού αναλυθεί η δήλωση, το σύστημα εκτελεί μια σειρά ελέγχων συμβατότητας:

  • Έκδοση SDK: Εάν το minSdkVersion της εφαρμογής είναι υψηλότερο από το επίπεδο API της συσκευής, η εγκατάσταση απορρίπτεται.
  • Συμβατότητα ABI: Εάν το APK περιέχει εγγενείς βιβλιοθήκες, το σύστημα ελέγχει εάν ταιριάζουν με την αρχιτεκτονική CPU της συσκευής. Ένα APK με μόνο βιβλιοθήκες armeabi-v7a δεν θα εγκατασταθεί σε συσκευή μόνο x86.
  • Απαιτούμενα χαρακτηριστικά: Εάν η εφαρμογή δηλώσει απαιτούμενες λειτουργίες υλικού (όπως το android.hardware.telephony), το σύστημα επαληθεύει ότι η συσκευή τις υποστηρίζει.
  • Διαθέσιμος χώρος αποθήκευσης: Το σύστημα ελέγχει εάν υπάρχει αρκετός ελεύθερος χώρος για την εγκατάσταση της εφαρμογής, συμπεριλαμβανομένου χώρου για τις εξαγόμενες εγγενείς βιβλιοθήκες και βελτιστοποιημένα αρχεία DEX.

Βήμα 4: Επαλήθευση υπογραφής

Αυτό είναι ένα από τα πιο κρίσιμα βήματα στη διαδικασία εγκατάστασης. Το Android επαληθεύει την κρυπτογραφική υπογραφή του APK για να διασφαλίσει την ακεραιότητα και την αυθεντικότητά του.

Η διαδικασία επαλήθευσης εξαρτάται από τα συστήματα υπογραφής που υπάρχουν:

Υπογραφή V1 (Υπογραφή JAR)

Το σύστημα ελέγχει τον κατάλογο META-INF/ για αρχεία υπογραφής (.SF, .RSA ή .DSA). Κάθε αρχείο στο APK επαληθεύεται σε σχέση με τις συνοπτικές πληροφορίες που αναφέρονται στο μανιφέστο. Αυτό είναι αργό γιατί κάθε αρχείο πρέπει να κατακερματιστεί ξεχωριστά.

Υπογραφή V2 (Σχήμα υπογραφής APK v2)

Παρουσιάστηκε στο Android 7.0, αυτό το σχήμα υπογράφει ολόκληρο το APK ως δυαδικό blob. Το μπλοκ υπογραφής εισάγεται μεταξύ του κεντρικού καταλόγου ZIP και της εγγραφής στο τέλος του κεντρικού καταλόγου. Η επαλήθευση είναι πολύ πιο γρήγορη επειδή λειτουργεί στα ακατέργαστα byte χωρίς να χρειάζεται να αποσυμπιεστούν μεμονωμένες καταχωρήσεις.

Υπογραφή V3 (Περιστροφή κλειδιού)

Διαθέσιμο από το Android 9.0, το V3 επεκτείνει το V2 με υποστήριξη για περιστροφή πλήκτρων. Περιλαμβάνει μια δομή απόδειξης περιστροφής που συνδέει παλιά και νέα κλειδιά υπογραφής, επιτρέποντας στους προγραμματιστές να αλλάξουν το κλειδί υπογραφής τους, διατηρώντας παράλληλα τη συμβατότητα των ενημερώσεων.

Υπογραφή V4 (αυξητική)

Το Android 11 παρουσίασε το V4 για σταδιακές εγκαταστάσεις. Παρέχει μια υπογραφή που βασίζεται σε δέντρο Merkle που επιτρέπει την επαλήθευση μεμονωμένων μπλοκ καθώς μεταδίδονται στη συσκευή.

Εάν η επαλήθευση της υπογραφής αποτύχει για οποιονδήποτε λόγο, η εγκατάσταση ματαιώνεται αμέσως. Μπορείτε να ελέγξετε την υπογραφή ενός APK πριν την εγκατάσταση χρησιμοποιώντας το Εργαλείο επαλήθευσης APK.

Ενημέρωση αντιστοίχισης υπογραφών

Εάν μια εφαρμογή με το ίδιο όνομα πακέτου είναι ήδη εγκατεστημένη, το σύστημα εκτελεί έναν πρόσθετο έλεγχο: το πιστοποιητικό υπογραφής του νέου APK πρέπει να ταιριάζει με το πιστοποιητικό της υπάρχουσας εγκατάστασης. Αυτό εμποδίζει ένα κακόβουλο μέρος να αντικαταστήσει μια νόμιμη εφαρμογή με μια παραποιημένη έκδοση. Εάν οι υπογραφές δεν ταιριάζουν, θα δείτε το σφάλμα "Η εφαρμογή δεν εγκαταστάθηκε: Το πακέτο έρχεται σε διένεξη με ένα υπάρχον πακέτο με το ίδιο όνομα".

Βήμα 5: Επιβεβαίωση χρήστη

Για πλευρικές εγκαταστάσεις, το σύστημα εμφανίζει ένα παράθυρο διαλόγου επιβεβαίωσης εγκατάστασης που δείχνει:

  • Το όνομα και το εικονίδιο της εφαρμογής (εξάγεται από τους πόρους του APK)
  • Επιτρέπει τα αιτήματα της εφαρμογής (σε παλαιότερες εκδόσεις Android)
  • Είτε πρόκειται για νέα εγκατάσταση είτε για ενημέρωση
  • Οποιεσδήποτε προειδοποιήσεις σχετικά με την πηγή της εφαρμογής ή τους πιθανούς κινδύνους

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

Βήμα 6: Εξαγωγή και τοποθέτηση αρχείου

Μόλις ο χρήστης επιβεβαιώσει (ή για εγκατάσταση του Play Store, αυτόματα), το σύστημα ξεκινά την εξαγωγή και την τοποθέτηση αρχείων:

Χώρος αποθήκευσης APK

Το ίδιο το αρχείο APK αντιγράφεται στο /data/app/[package-name]-[random]/base.apk. Για χωριστές εγκαταστάσεις APK, επιπλέον αρχεία όπως το split_config.arm64_v8a.apk τοποθετούνται δίπλα στο βασικό APK. Το αρχικό APK στο φάκελο Λήψεις δεν τροποποιείται ούτε διαγράφεται.

Εξαγωγή εγγενούς βιβλιοθήκης

Εάν το APK περιέχει εγγενείς βιβλιοθήκες (στον κατάλογο lib/, εξάγονται στο /data/app/[package-name]-[random]/lib/[abi]/.) Σε νεότερες εκδόσεις Android, οι εφαρμογές μπορούν να επιλέξουν να διατηρούν τις εγγενείς βιβλιοθήκες συμπιεσμένες εντός του APK και να τις φορτώνουν απευθείας χρησιμοποιώντας το android:extractNativeLibs="false", το οποίο εξοικονομεί χώρο αποθήκευσης.

Δημιουργία καταλόγου δεδομένων

Το σύστημα δημιουργεί τον κατάλογο ιδιωτικών δεδομένων της εφαρμογής στο /data/data/[package-name]/ (ή /data/user/0/[package-name]/ σε συσκευές πολλών χρηστών). Αυτός ο κατάλογος ανήκει σε ένα μοναδικό UID Linux που έχει εκχωρηθεί στην εφαρμογή, διασφαλίζοντας ότι καμία άλλη εφαρμογή δεν μπορεί να έχει πρόσβαση σε αυτόν χωρίς δικαιώματα root.

Βήμα 7: Βελτιστοποίηση DEX

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

The Dalvik Era (Android 4.4 και παλαιότερες εκδόσεις)

Η αρχική εικονική μηχανή Dalvik χρησιμοποιούσε τη συλλογή Just-In-Time (JIT). Κατά την εγκατάσταση, το αρχείο classes.dex βελτιστοποιήθηκε σε ένα αρχείο ODEX που περιείχε επαληθευμένο και βελτιστοποιημένο bytecode. Αυτό ήταν σχετικά γρήγορο, αλλά σήμαινε ότι η εφαρμογή έτρεχε πιο αργά στο χρόνο εκτέλεσης, δεδομένου ότι ο περισσότερος κώδικας εξακολουθούσε να ερμηνεύεται.

ART με AOT (Android 5.0 έως 6.0)

Το Android Runtime (ART) αντικατέστησε το Dalvik και εισήγαγε τη συλλογή Ahead-Of-Time (AOT). Κατά την εγκατάσταση, ολόκληρος ο bytecode DEX μεταγλωττίστηκε σε εγγενή κώδικα μηχανής. Αυτό έκανε τις εφαρμογές να τρέχουν πιο γρήγορα, αλλά αύξησε σημαντικά τον χρόνο εγκατάστασης και τη χρήση αποθηκευτικού χώρου. Η εγκατάσταση ορισμένων εφαρμογών χρειάστηκε αρκετά λεπτά.

Σύνταξη με καθοδήγηση προφίλ (Android 7.0+)

Το σύγχρονο Android χρησιμοποιεί μια υβριδική προσέγγιση. Κατά την εγκατάσταση, μεταγλωττίζονται μόνο κρίσιμες διαδρομές εκκίνησης. Καθώς ο χρήστης εκτελεί την εφαρμογή, το σύστημα συλλέγει προφίλ εκτέλεσης προσδιορίζοντας διαδρομές κώδικα που χρησιμοποιούνται συχνά. Κατά τη συντήρηση σε αδράνεια (συνήθως κατά τη διάρκεια της νύχτας), το σύστημα μεταγλωττίζει αυτές τις καυτές διαδρομές σε εγγενή κώδικα. Αυτό εξισορροπεί την ταχύτητα εγκατάστασης, τη χρήση αποθήκευσης και την απόδοση χρόνου εκτέλεσης.

Ο μεταγλωττισμένος κώδικας αποθηκεύεται στο /data/dalvik-cache/ ή δίπλα στο APK ως αρχεία .odex, .vdex και .art. Το αρχείο .vdex περιέχει επαληθευμένο κώδικα DEX, το αρχείο .odex περιέχει μεταγλωττισμένο εγγενή κώδικα και το αρχείο .art περιέχει προκατασκευασμένες εικόνες σωρού για ταχύτερη εκκίνηση.

Βήμα 8: Εγγραφή άδειας

Το PackageManagerService καταχωρεί τα δηλωμένα δικαιώματα και τα στοιχεία της εφαρμογής στο σύστημα:

  • Το Άδειες χρόνου εγκατάστασης (όπως το INTERNET ή το VIBRATE χορηγείται αυτόματα χωρίς αλληλεπίδραση με τον χρήστη).
  • Το Δικαιώματα χρόνου εκτέλεσης (όπως το CAMERA ή το LOCATION έχει καταχωρηθεί αλλά δεν χορηγείται). Η εφαρμογή πρέπει να τα ζητήσει κατά το χρόνο εκτέλεσης.
  • Τα Φίλτρα πρόθεσης είναι εγγεγραμμένα, ώστε το σύστημα να γνωρίζει ποιες εφαρμογές μπορούν να χειριστούν ποιες ενέργειες (όπως το άνοιγμα μιας διεύθυνσης URL ή η κοινή χρήση περιεχομένου).
  • Οι Παρόχους περιεχομένου είναι εγγεγραμμένοι στις αρχές τους, ώστε άλλες εφαρμογές να μπορούν να τους ρωτήσουν.

Βήμα 9: Ενοποίηση συστήματος

Τα τελευταία βήματα ενσωματώνουν την εφαρμογή στο σύστημα Android:

  • Ενημέρωση βάσης δεδομένων πακέτων: Η βάση δεδομένων πακέτων του συστήματος (/data/system/packages.xml) ενημερώνεται με τις πληροφορίες της νέας εφαρμογής, συμπεριλαμβανομένων των εκχωρημένων UID, των δικαιωμάτων και των δηλώσεων στοιχείων.
  • Ειδοποίηση εκκίνησης: Ο εκκινητής αρχικής οθόνης ειδοποιείται για τη νέα εφαρμογή, ώστε να μπορεί να εμφανίσει το εικονίδιο της εφαρμογής.
  • Αναμετάδοση: Το σύστημα στέλνει μια εκπομπή PACKAGE_ADDED, επιτρέποντας σε άλλες εφαρμογές να αντιδράσουν στη νέα εγκατάσταση (για παράδειγμα, οι εφαρμογές δημιουργίας αντιγράφων ασφαλείας ενδέχεται να προγραμματίσουν ένα αντίγραφο ασφαλείας).
  • Περιβάλλον SELinux: Τα αρχεία της εφαρμογής επισημαίνονται με το κατάλληλο περιβάλλον ασφαλείας SELinux με βάση την έκδοση SDK-στόχου και τα δηλωμένα δικαιώματα.

Γιατί αποτυγχάνουν οι εγκαταστάσεις

Η κατανόηση του αγωγού εγκατάστασης βοηθά στη διάγνωση κοινών αστοχιών:

  • "Σφάλμα ανάλυσης": Το APK είναι κατεστραμμένο, ημιτελές ή έχει λανθασμένη μορφή δήλωσης. Αυτό συμβαίνει συχνά με ελλιπείς λήψεις ή αρχεία με ακατάλληλη μετατροπή.
  • "Η εφαρμογή δεν έχει εγκατασταθεί" (αναντιστοιχία υπογραφής): Προσπαθείτε να ενημερώσετε μια εφαρμογή με ένα APK υπογεγραμμένο από διαφορετικό κλειδί. Πρέπει πρώτα να απεγκαταστήσετε την υπάρχουσα έκδοση.
  • "Ανεπαρκής αποθήκευση": Δεν υπάρχει αρκετός χώρος για το APK, τις εξαγόμενες βιβλιοθήκες και την έξοδο βελτιστοποίησης DEX. Ο πραγματικός χώρος που απαιτείται είναι συνήθως 2-3 φορές το μέγεθος APK.
  • "Το πακέτο έρχεται σε διένεξη με το υπάρχον πακέτο": Ίδιο όνομα πακέτου αλλά διαφορετική υπογραφή. Συνηθίζεται κατά την εναλλαγή μεταξύ του Play Store και των πλευρικών εκδόσεων.
  • Αποκλείστηκε η υποβάθμιση έκδοσης: Από προεπιλογή, το Android αποτρέπει την εγκατάσταση παλαιότερης έκδοσης έναντι νεότερης. Το ADB μπορεί να το παρακάμψει με το adb install -d.

Διαχωρισμός εγκατάστασης APK

Κατά την εγκατάσταση διαχωρισμένων APK (από App Bundles), η διαδικασία είναι ελαφρώς διαφορετική. Το σύστημα χρησιμοποιεί ένα εγκατάσταση βασισμένη σε συνεδρία API:

  1. Δημιουργείται μια νέα συνεδρία εγκατάστασης
  2. Κάθε διαχωρισμένο APK εγγράφεται στη συνεδρία
  3. Η συνεδρία δεσμεύεται, ενεργοποιώντας την πλήρη επαλήθευση
  4. Όλοι οι διαχωρισμοί πρέπει να έχουν αντίστοιχα ονόματα πακέτων, κωδικούς έκδοσης και πιστοποιητικά υπογραφής

Αυτός είναι ο μηχανισμός που χρησιμοποιείται από εγκαταστάτες XAPK και εργαλεία όπως το δικό μας Συγχώνευση APKS σε APK για να χειρίζονται εγκαταστάσεις πολλών αρχείων.

Εγκατάσταση μέσω ADB

Όταν χρησιμοποιείτε το adb install, η διαδικασία παρακάμπτει το πρόγραμμα εγκατάστασης γραφικών, αλλά ακολουθεί την ίδια εσωτερική γραμμή. Το ADB επικοινωνεί με την υπηρεσία διαχείρισης πακέτων μέσω μιας σύνδεσης υποδοχής. Υποστηρίζει πρόσθετες σημαίες που δεν είναι διαθέσιμες μέσω του GUI:

  • -r: Αντικαταστήστε την υπάρχουσα εφαρμογή (επιτρέψτε την επανεγκατάσταση)
  • -d: Να επιτρέπεται η υποβάθμιση της έκδοσης
  • -g: Εκχωρήστε αμέσως όλα τα δικαιώματα χρόνου εκτέλεσης
  • -t: Να επιτρέπεται η εγκατάσταση APK μόνο για δοκιμή
  • --install-multiple: Εγκαταστήστε διαχωρισμένα APK σε μία μόνο περίοδο λειτουργίας

Τι συμβαίνει κατά την απεγκατάσταση

Για λόγους πληρότητας, δείτε τι συμβαίνει όταν αφαιρείται μια εφαρμογή:

  1. Οι διαδικασίες της εφαρμογής σκοτώνονται
  2. Το APK και οι εξαγόμενες βιβλιοθήκες διαγράφονται από το /data/app/
  3. Ο κατάλογος ιδιωτικών δεδομένων της εφαρμογής καταργείται (εκτός εάν ο χρήστης επιλέξει να διατηρήσει δεδομένα)
  4. Τα μεταγλωττισμένα αρχεία κρυφής μνήμης DEX διαγράφονται
  5. Η βάση δεδομένων του πακέτου είναι ενημερωμένη
  6. Αποστέλλεται εκπομπή PACKAGE_REMOVED
  7. Η εφαρμογή εκκίνησης αφαιρεί το εικονίδιο της εφαρμογής

Λάβετε υπόψη ότι τα αρχεία για συγκεκριμένες εφαρμογές σε εξωτερικό χώρο αποθήκευσης (/Android/data/[package]/ και /Android/obb/[package]/ διαγράφονται επίσης στο Android 10 και μεταγενέστερα, χάρη στην επιβολή του εύρους αποθήκευσης).

Γιατί η κατανόηση του PackageManager εξοικονομεί χρόνο εντοπισμού σφαλμάτων

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

Εγκατάσταση από το Play Store, πλευρική φόρτωση ενός APK με το χέρι και προώθηση μιας κατασκευής με ADB μέσω της ίδιας διοχέτευσης, που διασφαλίζει ότι κάθε εφαρμογή στη συσκευή σας έχει επαληθευτεί, έχει τοποθετηθεί σωστά και βελτιστοποιηθεί για το υλικό σας.

Κατασκευάστηκε και τεκμηριώθηκε από τον Mst Shaefale Κύριος προγραμματιστής και αρχιτέκτονας πακέτων Android • Επαληθεύτηκε σε Android 12–15

Το Mst Shaefale διατηρεί τη συγχώνευση XAPK/APKS από την πλευρά του πελάτη, τον αναλυτή δυαδικού μανιφέστου και τα εργαλεία υπογραφής APK v1+v2 στο xapktoapk.com. Εντοπίζετε μια παρωχημένη εντολή ή αλλαγή λειτουργικού συστήματος; Στείλτε ένα συντακτικό σημείωμα.