Δημιουργία εφαρμογών Android. Δομή εφαρμογής Android

Ηλεκτρονική 08.05.2019

Επισκόπηση προγράμματος Η έκδοση υπολογιστή του Microsoft Excel Viewer θα επιτρέψει...

Chercher Θα πρέπει να ξεκινήσουμε από το γεγονός ότι όλες οι εφαρμογές για το Android OS διανέμονται με τη μορφή πακέτων εγκατάστασης - αρχείων με επέκταση APK.) είναι μια μορφή για αρχειοθετημένα εκτελέσιμα αρχεία εφαρμογής για Android.

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

Τα αρχεία με αυτήν την επέκταση αποθηκεύονται στο κατάστημα Google Play, και μεταφορτώνονται χρησιμοποιώντας το σε smartphone για χρήση ή εγκαθίστανται με μη αυτόματο τρόπο από τον χρήστη στη συσκευή.

Τα αρχεία σε αυτήν τη μορφή δεν είναι κρυπτογραφημένα και αποτελούν υποσύνολο της μορφής αρχείου ZIP.

Κάθε αρχείο .APK είναι συμπιεσμένο αρχείογια εκτέλεση σε DalvikVM (εικονική μηχανή), η οποία μπορεί να εγκατασταθεί όχι μόνο στο λειτουργικό σύστημα Android.

Ένα αρχείο APK ως αρχείο περιέχει συνήθως τους ακόλουθους καταλόγους:

· META-INF:

§ MANIFEST.MF: αρχείο δήλωσης

§ CERT.RSA: πιστοποιητικό αίτησης

§ CERT.SF: λίστα πόρων και το άθροισμα κατακερματισμού SHA1 για παράδειγμα στο Σχήμα 6:

· Υπογραφή-Έκδοση: 1.0

Δημιουργήθηκε από: 1.0 (Android)

· SHA1-Digest-Manifest: wxqnEAI0UA5nO5QJ8CGMwjkGGWE=

· Όνομα: res/layout/exchange_component_back_bottom.xml

· SHA1-Digest: eACjMjESj7Zkf0cBFTZ0nqWrt7w=

· Όνομα: res/drawable-hdpi/icon.png

· SHA1-Digest: DGEqylP8W0n0iV/ZzBx3MW0WGCA=

Εικόνα 6. Δομή αρχείου με λίστα πόρων και τα αθροίσματα κατακερματισμού τους.

· κατάλογος lib:περιέχει μεταγλωττισμένο εκτελέσιμο κώδικα προσαρμοσμένο για διάφορα είδηεπεξεργαστές, συνήθως χωρίζεται στους ακόλουθους καταλόγους:

Ш armeabi: κωδικός μόνο για επεξεργαστές ARM

Ш armeabi-v7a: κωδικός μόνο για ARMv7 και κατώτερους επεξεργαστές.

Ш x86: μεταγλωττισμένος κώδικας μόνο για αρχιτεκτονική x86

Ш mips: μεταγλωττισμένος κώδικας μόνο για αρχιτεκτονική MIPS

· κατάλογος res:ο κατάλογος περιέχει αρχεία πόρων που δεν περιλαμβάνονται στο αρχείο resources.arsc (δείτε παρακάτω)

· κατάλογος περιουσιακών στοιχείων:περιέχει στοιχεία που μπορούν να αποκτηθούν χρησιμοποιώντας το AssetManager

· Αρχείο AndroidManifest.xml: πρόσθετο αρχείο δήλωσης που περιγράφει την έκδοση της εφαρμογής, τα δικαιώματα, τις βιβλιοθήκες που χρησιμοποιούνται. Κατά κανόνα, αυτό το αρχείο είναι σε δυαδική μορφή XML, σε αυτή τη μορφή αρχείου μπορεί να μετατραπεί αναγνώσιμη μορφήμε τη χρήση βοηθητικά προγράμματα τρίτωνόπως AXMLPrinter2, apktool ή Androguard.

· Αρχείο classes.dex:εκτελέσιμο αρχείο της εικονικής μηχανής Dalvik, που λαμβάνεται με μετατροπή μεταγλωττισμένων κλάσεων JAVA χρησιμοποιώντας το βοηθητικό πρόγραμμα DX. Το βοηθητικό πρόγραμμα περιλαμβάνεται στο Android SDK.

· Αρχείο Resources.arsc:το αρχείο περιέχει προμεταγλωττισμένους πόρους, για παράδειγμα με τη μορφή δυαδικών αρχείων XML.

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

AndroidManifest.xml

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

Εικόνα 7. Επιβεβαίωση εγκατάστασης μιας εφαρμογής από τρίτη πηγή.

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

Ο Πίνακας 1 παραθέτει μερικές από τις άδειες που ενέχουν τον μεγαλύτερο κίνδυνο:

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

ACCESS_COARSE_LOCATION

Η εφαρμογή θα μπορεί να έχει πρόσβαση στην κατά προσέγγιση τοποθεσία που λαμβάνεται από πηγές τοποθεσίας δικτύου, όπως πύργους κινητής τηλεφωνίας και Wi-Fi.

ACCESS_FINE_LOCATION

Η εφαρμογή θα μπορεί να έχει πρόσβαση σε ακριβή τοποθεσία από πηγές τοποθεσίας όπως GPS, πύργους κινητής τηλεφωνίας και Wi-Fi.

CALL_PHONE

Η εφαρμογή θα μπορεί να ξεκινήσει τηλεφώνημα, παρακάμπτοντας τη διεπαφή χρήστη Dialer για τον χρήστη.

Η εφαρμογή θα μπορεί να τραβήξει φωτογραφία με την ενσωματωμένη κάμερα

DELETE_PACKAGES

Επιτρέπει σε μια εφαρμογή την αφαίρεση πακέτων.

DEVICE_POWER

Επιτρέπει σε μια εφαρμογή να απενεργοποιήσει τη συσκευή

Όπως φαίνεται από τις περιγραφές, ορισμένα δικαιώματα μπορούν να ομαδοποιηθούν, ορίζοντας το επίπεδο κινδύνου για μια ολόκληρη ομάδα λειτουργιών, για παράδειγμα, τα δικαιώματα READ_SMS, BRICK είναι πολύ επικίνδυνα και μπορούν να τους εκχωρηθεί ένα επίπεδο κινδύνου 10 (μέγιστο). Αυτό συμβαίνει επειδή η άδεια READ_SMS σημαίνει ανάγνωση προσωπικών δεδομένων χρήστη, η οποία είναι μια δυνητικά επικίνδυνη ενέργεια εκ μέρους της εφαρμογής για τον χρήστη. BRICK σημαίνει απενεργοποίηση της συσκευής στο σύνολό της - κάτι που είναι επίσης πολύ επικίνδυνο για τον χρήστη, επειδή η συσκευή σταματά εντελώς να λειτουργεί.

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

Αυτό το αρχείο περιέχει την κύρια λειτουργικότητα της εφαρμογής και περιέχει bytecode που είναι κατανοητό από την εικονική μηχανή Dalvik. Έχει την ακόλουθη εσωτερική δομή, που παρουσιάζεται στον Πίνακα 2:

Πίνακας 2. Δομή αρχείου Dex.

Στην πραγματικότητα, αυτό είναι ένα αρχείο που περιέχει κώδικα προγράμματος για την εικονική μηχανή Dalvik. Οι εφαρμογές Android είναι γραμμένες Γλώσσα Java, αλλά μετά τη μεταγλώττιση του κώδικα σε αρχεία .class, καλείται το βοηθητικό πρόγραμμα dx, το οποίο τα μεταφράζει σε ένα αρχείο classes.dex, το οποίο είναι το κύριο στοιχείο αρχείο APK. Γενικός αλγόριθμοςΟ σχηματισμός dex παρουσιάζεται στο σχήμα 8.


Εικόνα 8. Ο μηχανισμός για τη δημιουργία του αρχείου classes.dex.

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

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

Ονομα Περιγραφή Ανάγκη
γεν Αρχεία που δημιουργούνται από την ίδια την Java. Εδώ είναι ένα σαν αυτό σημαντικό αρχείοόπως η R.java Ναί
AndroidManifest.xml Το αρχείο δήλωσης AndroidManifest.xml παρέχει στο σύστημα βασικές πληροφορίες σχετικά με το πρόγραμμα. Κάθε εφαρμογή πρέπει να έχει το δικό της αρχείο δήλωσης Ναί
src Ο κατάλογος που περιέχει τον πηγαίο κώδικα της εφαρμογής Ναί
ακίνητη περιουσία Αυθαίρετη συλλογή καταλόγων και αρχείων Οχι
res Ο κατάλογος που περιέχει πόρους εφαρμογής. Αυτός ο κατάλογος μπορεί να περιέχει υποφακέλους με δυνατότητα σχεδίασης, anim, διάταξη, μενού, τιμές, xml και raw (δείτε παρακάτω) Ναί

1.5.1. Αρχείο μανιφέστου AndroidManifest.xml

Το αρχείο δήλωσης AndroidManifest.xml παρέχει στο σύστημα βασικές πληροφορίες σχετικά με το πρόγραμμα. Κάθε εφαρμογή πρέπει να έχει το δικό της αρχείο AndroidManifest.xml. Μπορείτε να επεξεργαστείτε το αρχείο δήλωσης μη αυτόματα αλλάζοντας τον κώδικα XML ή μέσω οπτικός επεξεργαστής Manifest Editor, που επιτρέπει την οπτική και κειμενική επεξεργασία του αρχείου δήλωσης εφαρμογής.

Σκοπός αρχείου:

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

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

  • είναι το ριζικό στοιχείο του μανιφέστου.

    Από προεπιλογή, το Eclipse δημιουργεί ένα στοιχείο με τέσσερα χαρακτηριστικά:

    Το xmlns:android ορίζει τον χώρο ονομάτων Android.

    Το πακέτο καθορίζει το μοναδικό όνομα του πακέτου εφαρμογής.

    Το android:versionCode δείχνει τον εσωτερικό αριθμό έκδοσης.

    android:versionName καθορίζει τον αριθμό έκδοσης χρήστη.

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

    Τα πιο συνηθισμένα δικαιώματα:

    INTERNET – Πρόσβαση στο Διαδίκτυο

    READ_CONTACTS – ανάγνωση (αλλά όχι εγγραφή) δεδομένων από το βιβλίο διευθύνσεων του χρήστη

    WRITE_CONTACTS – εγγραφή (αλλά όχι ανάγνωση) δεδομένων στο βιβλίο διευθύνσεων του χρήστη

    RECEIVE_SMS – επεξεργασία εισερχόμενων SMS

    ACCESS_FINE_LOCATION – ακριβής προσδιορισμός τοποθεσίας με χρήση GPS

  • Σας επιτρέπει να δηλώσετε τη συμβατότητα μιας εφαρμογής με μια καθορισμένη έκδοση (ή νεότερες εκδόσεις API) της πλατφόρμας Android. Το επίπεδο API που δηλώνεται από την εφαρμογή συγκρίνεται με το επίπεδο API του συστήματος κινητής συσκευής στο οποίο είναι εγκατεστημένη η εφαρμογή.

    Γνωρίσματα:

    android:minSdkVersion ορίζει το ελάχιστο επίπεδο API που απαιτείται για την εκτέλεση της εφαρμογής. Το σύστημα Android θα εμποδίσει τον χρήστη να εγκαταστήσει την εφαρμογή εάν το επίπεδο API του συστήματος είναι χαμηλότερο από την τιμή που ορίζεται σε αυτό το χαρακτηριστικό.

    android:maxSDKVersion σάς επιτρέπει να προσδιορίσετε την πιο πρόσφατη έκδοση που το πρόγραμμα είναι έτοιμο να υποστηρίξει.

    Το targetSDKVersion σάς επιτρέπει να καθορίσετε την πλατφόρμα για την οποία αναπτύχθηκε και δοκιμάστηκε η εφαρμογή.

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

    Πιθανά χαρακτηριστικά:

    android.hardware.camera – απαιτεί κάμερα υλικού.

    android.hardware.camera.autofocus– Απαιτείται κάμερα με αυτόματη εστίαση.

  • καθορίζει την ανάλυση οθόνης που απαιτείται για τη λειτουργία της εφαρμογής. Από προεπιλογή, μια σύγχρονη εφαρμογή με επίπεδο API 4 ή υψηλότερο υποστηρίζει όλα τα μεγέθη οθόνης και θα πρέπει να αγνοήσει αυτό το στοιχείο.
  • ένα από τα κύρια στοιχεία του μανιφέστου, που περιέχει μια περιγραφή των στοιχείων της εφαρμογής. Περιέχει παιδικά στοιχεία ( , , , Και άλλα), τα οποία δηλώνουν καθένα από τα συστατικά που απαρτίζουν την εφαρμογή. Μπορεί να υπάρχει μόνο ένα στοιχείο σε μια δήλωση .

1.5.2. Πόροι

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

Βασικά, οι πόροι αποθηκεύονται ως αρχεία XML στον κατάλογο res με τιμές υποκαταλόγων, drawable-ldpi, drawable-mdpi, drawable-hdpi, διάταξη. Υπάρχουν όμως και δύο ακόμη τύποι πόρων: ακατέργαστοι και περιουσιακά στοιχεία.

Για ευκολία, το σύστημα δημιουργεί αναγνωριστικά πόρων και τα χρησιμοποιεί στο αρχείο R.java (η κλάση R που περιέχει αναφορές σε όλους τους πόρους του έργου), το οποίο σας επιτρέπει να αναφέρετε πόρους μέσα στον κώδικα του προγράμματος. Μια στατική κλάση R δημιουργείται με βάση τους δεδομένους πόρους και δημιουργείται κατά τη μεταγλώττιση του έργου. Δεδομένου ότι το αρχείο R δημιουργείται αυτόματα, δεν υπάρχει λόγος να το επεξεργαστείτε με μη αυτόματο τρόπο, επειδή όλες οι αλλαγές θα χαθούν όταν αναδημιουργηθεί.

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

Οι πιο συνηθισμένοι πόροι είναι, ίσως, οι συμβολοσειρές, τα χρώματα και τα bitmaps.

Ο παρακάτω πίνακας παραθέτει τους κύριους πόρους μιας εφαρμογής Android:

Τύπος πόρου Κατάλυμα Περιγραφή
Χρωματιστά /res/colors/ Ένα αναγνωριστικό χρώματος που υποδεικνύει έναν κωδικό χρώματος.
Χορδές /res/strings/ Πόροι συμβολοσειρών. Περιλαμβάνουν επίσης συμβολοσειρές σε μορφή java και html.
Μενού /res/menus/ Τα μενού σε μια εφαρμογή μπορούν να οριστούν ως πόροι XML.
Επιλογές /res/values/ Αντιπροσωπεύει τις παραμέτρους ή τις διαστάσεις διαφόρων στοιχείων.
εικόνες /res/drawable/ Πόροι εικόνας. Υποστηρίζει JPG, GIF, PNG (το πιο προτιμώμενο) και άλλα. Κάθε εικόνα είναι ένα ξεχωριστό αρχείο. Το σύστημα υποστηρίζει επίσης τεντώσιμες εικόνες, στις οποίες μπορείτε να αλλάξετε την κλίμακα μεμονωμένων στοιχείων, αφήνοντας τα άλλα στοιχεία αμετάβλητα.

Ζωγραφιζόμενα χρώματα

/res/values/

/res/drawable/

Αντιπροσωπεύει έγχρωμα ορθογώνια που χρησιμοποιούνται ως φόντο κύριας απόδοσης αντικειμένων, όπως bitmaps.
Εμψύχωση /res/anim/ Το Android μπορεί να εκτελέσει απλή κινούμενη εικόνα σε ένα γραφικό ή μια σειρά γραφικών εικόνων.
Προσαρμοσμένα αρχεία XML /res/xml/ Στο Android, αυθαίρετα αρχεία XML μπορούν να χρησιμοποιηθούν ως πόροι.
Τυχαίοι ακατέργαστοι πόροι /res/raw/ Τυχόν μη μεταγλωττισμένα δυαδικά αρχεία ή αρχεία κειμένου, όπως βίντεο.

Εκτός από τις εικόνες, ο κατάλογος res/drawable μπορεί να αποθηκεύσει πόρους απλών γεωμετρικών σχημάτων. Εδώ είναι μερικά μόνο από τα πιθανά χαρακτηριστικά:

  • android:shape καθορίζει τον τύπο του σχήματος: ορθογώνιο (ορθογώνιο), οβάλ (οβάλ), γραμμή (γραμμή), δακτύλιος (κύκλος).
  • δημιουργεί στρογγυλεμένες γωνίες για ένα ορθογώνιο.
  • ορίζει ένα ντεγκραντέ γέμισμα για το σχήμα. στο Android μπορείτε να δημιουργήσετε τρεις τύπους διαβαθμίσεων: Γραμμική, Ακτινική και Σάρωση.
  • ορίζει τις διαστάσεις του σχήματος.
  • ορίζει το συμπαγές χρώμα για το σχήμα.

Υπάρχουν δύο τύποι κινούμενων εικόνων στο Android:

  • Κινούμενα σχέδια καρέ - κινούμενα σχέδια καρέ, παραδοσιακή κινούμενη εικόνα που χρησιμοποιεί γρήγορες αλλαγές διαδοχικών εικόνων, όπως σε φιλμ.
  • Tween Animation – η κίνηση μετασχηματισμού μπορεί να εκτελεστεί ως μια σειρά απλών μετασχηματισμών: αλλαγή θέσης (κατηγορία TranslateAnimation), μέγεθος (ScaleAnimation), γωνία περιστροφής (RotateAnimation) και επίπεδο διαφάνειας (AlphaAnimation). Οι εντολές κίνησης ορίζουν τους μετασχηματισμούς που πρέπει να εκτελεστούν σε ένα αντικείμενο. Οι μετασχηματισμοί μπορεί να είναι διαδοχικοί ή ταυτόχρονοι. Η σειρά των εντολών κινούμενης εικόνας ορίζεται σε ένα αρχείο XML (κατά προτίμηση) ή σε κώδικα προγράμματος.

Το Android έχει έναν άλλο κατάλογο όπου μπορούν να αποθηκευτούν τα αρχεία που θα συμπεριληφθούν σε ένα πακέτο: /assets. Αυτά δεν είναι πόροι, απλώς ακατέργαστα αρχεία. Αυτός ο κατάλογος βρίσκεται στο ίδιο επίπεδο με το /res. Το R.java δεν δημιουργεί αναγνωριστικά πόρων για αρχεία που βρίσκονται στο /assets. Για να τα διαβάσετε, πρέπει να καθορίσετε τη διαδρομή προς το αρχείο. Η διαδρομή του αρχείου είναι σχετική και ξεκινά με /assets. Αυτός ο κατάλογος, σε αντίθεση με τον υποκατάλογο res/, σας επιτρέπει να καθορίσετε ένα αυθαίρετο βάθος υποκαταλόγων και αυθαίρετων ονομάτων αρχείων.

1.5.3. Βαθμολόγηση

Στις εφαρμογές Android, η διεπαφή χρήστη είναι χτισμένη σε αντικείμενα View και ViewGroup. Η κλάση ViewGroup είναι η βάση για την υποκλάση Layout.

Η διάταξη (ονομάζεται επίσης διάταξη ή διάταξη) αποθηκεύεται ως αρχείο XML στο φάκελο /res/layout. Αυτό γίνεται για να διαχωριστεί ο κώδικας από το σχέδιο, όπως συνηθίζεται σε πολλές τεχνολογίες (HTML και CSS, Visual Studio και Expression Blend). Εκτός από την κύρια διάταξη για ολόκληρη την οθόνη, υπάρχουν θυγατρικές διατάξεις για μια ομάδα στοιχείων. Ουσιαστικά, μια διάταξη είναι ένα οπτικό πρότυπο για τη διεπαφή χρήστη μιας εφαρμογής που σας επιτρέπει να ελέγχετε στοιχεία, τις ιδιότητές τους και τη διάταξη τους. Στο ιατρείο σας θα πρέπει να εξοικειωθείτε με όλες τις μεθόδους τοποθέτησης.

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

Δημιουργώντας τη διεπαφή χρήστη σε ένα αρχείο XML, μπορείτε να διαχωρίσετε τη σχεδίαση της εφαρμογής από τον κώδικα. Μπορείτε να αλλάξετε τη διεπαφή χρήστη σε ένα αρχείο σήμανσης χωρίς να χρειάζεται να αλλάξετε τον κώδικα. Για παράδειγμα, μπορείτε να δημιουργήσετε σήμανση XML για διαφορετικούς προσανατολισμούς οθόνης κινητής συσκευής (κατακόρυφος, οριζόντιος), μεγέθη οθόνης και γλώσσες διεπαφής. Ωστόσο, τα στοιχεία διεπαφής μπορούν επίσης να δημιουργηθούν μέσω προγραμματισμού όταν είναι απαραίτητο.

Κάθε αρχείο σήμανσης πρέπει να περιέχει μόνο ένα ριζικό στοιχείο διάταξης, το οποίο πρέπει να είναι αντικείμενο View ή ViewGroup. Μέσα στο ριζικό στοιχείο, μπορείτε να προσθέσετε πρόσθετα αντικείμενα σήμανσης ή στοιχεία θυγατρικής διεπαφής για να δημιουργήσετε σταδιακά την ιεραρχία των στοιχείων που ορίζει η σήμανση που δημιουργείτε.

Υπάρχουν διάφοροι τυπικοί τύποι σήμανσης:

  • Το FrameLayout είναι ο απλούστερος τύπος διάταξης. Συνήθως πρόκειται για κενό χώρο στην οθόνη που μπορεί να συμπληρωθεί μόνο από ένα αντικείμενο θυγατρικής Προβολής ή ViewGroup. Όλα τα παιδιά του FrameLayout κουμπώνονται στην επάνω αριστερή γωνία της οθόνης. Η σήμανση FrameLayout δεν μπορεί να ορίσει διαφορετική θέση για ένα αντικείμενο θυγατρικής προβολής. Οι επόμενες θυγατρικές προβολές απλώς σχεδιάζουν πάνω από προηγούμενες προβολές, μερικώς ή πλήρως αποκρύπτοντάς τις εάν το αντικείμενο στην κορυφή είναι αδιαφανές
  • Το LinearLayout ευθυγραμμίζει όλα τα θυγατρικά αντικείμενα προς την ίδια κατεύθυνση - κάθετα ή οριζόντια. Η κατεύθυνση καθορίζεται χρησιμοποιώντας το χαρακτηριστικό android:orientation. Όλα τα παιδιά ωθούνται στη στοίβα το ένα μετά το άλλο, έτσι ώστε μια κατακόρυφη λίστα προβολών να έχει μόνο ένα παιδί ανά σειρά, ανεξάρτητα από το πόσο ευρεία είναι. Μια οριζόντια διάταξη λίστας θα τοποθετήσει τα στοιχεία σε μια γραμμή με ύψος ίσο με το ύψος του ψηλότερου παιδιού της λίστας.
  • Το TableLayout τοποθετεί τα παιδιά του σε γραμμές και στήλες. Το TableLayout δεν εμφανίζει γραμμές περιγράμματος για γραμμές, στήλες ή κελιά. Το TableLayout μπορεί να έχει σειρές με διαφορετικό αριθμό κελιών. Κατά τη δημιουργία της διάταξης πίνακα, ορισμένα κελιά μπορούν να παραμείνουν κενά εάν είναι απαραίτητο. Το TableLayout είναι βολικό στη χρήση, για παράδειγμα, όταν δημιουργείτε παιχνίδια λογικής όπως το Sudoku, το Tic-Tac-Toe και τα παρόμοια.
  • Το RelativeLayout επιτρέπει στα θυγατρικά στοιχεία να προσδιορίζουν τη θέση τους σε σχέση με τη γονική προβολή ή σε σχέση με γειτονικά θυγατρικά στοιχεία.

Όλη η σήμανση που περιγράφεται εδώ είναι υποκλάσεις του ViewGroup και κληρονομούν ιδιότητες που ορίζονται στην κλάση View.

Οι σημάνσεις συμπεριφέρονται σαν στοιχεία ελέγχου και μπορούν να ομαδοποιηθούν. Η διάταξη των χειριστηρίων μπορεί να είναι ένθετη. Για παράδειγμα, μπορείτε να χρησιμοποιήσετε το RelativeLayout στο LinearLayout και ούτω καθεξής. Ωστόσο, η υπερβολική ένθεση των στοιχείων ελέγχου προκαλεί προβλήματα απόδοσης.

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

Σε αυτό και στα επόμενα άρθρα, θα προσπαθήσουμε να καταλάβουμε εν συντομία τι μπορεί να αποτελείται ένα πρόγραμμα για Android.

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

Πώς να χρησιμοποιήσετε αυτό το πράγμα; Απλώς δημιουργήστε τη δική σας τάξη απογόνων Δραστηριότητακαι παρακάμπτουν πολλές μεθόδους. Γενικά, τι και σε ποια στιγμή συμβαίνει Δραστηριότητακαλύτερα κατανοητό από αυτό το διάγραμμα:

Το κατέβασε από το developer.android.com.

Λοιπόν, τι μπορεί να συμβεί στη δραστηριότητά μας κατά τη διάρκεια της ζωής της και πώς μπορούμε να ελέγξουμε αυτές τις διαδικασίες; Πρώτα πρέπει να δημιουργηθεί η δραστηριότητά μας. Η παράκαμψη της μεθόδου θα μας βοηθήσει να επεξεργαστούμε σωστά τη δημιουργία της onCreate().

Το επόμενο βήμα μετά τη δημιουργία είναι να το δείξουμε στον χρήστη και αν θέλουμε, για παράδειγμα, να αρχικοποιήσουμε κείμενο σε πεδία κειμένου ή να ξεκινήσουμε μουσική υπόκρουση, τότε μπορούμε να το κάνουμε εδώ. Για το σκοπό αυτό χρησιμοποιείται η μέθοδος onStart(). Μετά τη μέθοδο onStart()ονομάζεται μέθοδος onResume().

Εάν καλέσουμε κάποιο παράθυρο διαλόγου και η δραστηριότητά μας πάει στο παρασκήνιο, μπορούμε εύκολα να χειριστούμε μια τέτοια κατάσταση παρακάμπτοντας τη μέθοδο onPause().

Λοιπόν, αν εμείς (ή ο χρήστης) καλέσαμε κάποια άλλη δραστηριότητα και η δική μας μπήκε στο παρασκήνιο, τότε παρακάμπτουμε τη μέθοδο onStop(). Λοιπόν, για παράδειγμα, εάν πρέπει να σταματήσουμε τη μουσική υπόκρουση ή να επαναφέρουμε ορισμένες τιμές που έχει εισαγάγει ο χρήστης. Εάν ο χρήστης αποφασίσει ξανά να επιστρέψει στο δικό μας δραστηριότητατότε επεξεργαζόμαστε αυτό το συμβάν χρησιμοποιώντας τη μέθοδο onRestart(). Ταυτόχρονα, δεν πρέπει να ξεχνάμε ότι εάν το σύστημα απαιτεί μνήμη, τότε η δραστηριότητά μας μπορεί να καταστραφεί και μπορούμε επίσης να το χειριστούμε παρακάμπτοντας τη μέθοδο onDestroy()(Για παράδειγμα, αν ανοίξαμε μια σύνδεση σε κάποιον διακομιστή και τον κρατούσαμε ανοιχτό όλη την ώρα, τότε σε αυτήν τη μέθοδο δεν θα ήταν κακή ιδέα να την κλείσουμε 🙂).

Λοιπόν, η σύντομη θεωρητική εκδρομή τελείωσε, ας προσπαθήσουμε να γράψουμε μια μικρή εφαρμογή που θα επεξεργάζεται όλα αυτά τα γεγονότα.

Πακέτο ru.davidmd.activitytutor; εισαγωγή android.app.Activity; εισαγωγή android.os.Bundle; εισαγωγή android.view.View; εισαγωγή android.view.View.OnClickListener; εισαγωγή android.widget.Button; εισαγωγή android.widget.LinearLayout; εισαγωγή android.widget.Toast; δημόσια κλάση activity_example επεκτείνει τη Δραστηριότητα ( /** Καλείται όταν δημιουργείται για πρώτη φορά η δραστηριότητα. */ Γραμμική διάταξη, Πλήκτρο κουμπιού, @Override δημόσιο κενό onCreate(Bundle savedInstanceState) ( super.onCreate(savedInstanceState); lay = new LinearLayout(this); setContentView(lay.setOrientation)(LinearLayout.VERTICAL = new Button(this butt.setText("CLOSE")(new OnClickListener) ( @Override void onClick); ((Δραστηριότητα) v.getContext()).finish() )); ); Toast.LENGTH_SHORT).show(); ) @Override public void onPause() ( super.onPause(); onStop() ( super.onStop();

Toast.makeText(αυτό, "Η δραστηριότητα σταμάτησε!", Toast.LENGTH_SHORT).show(); ) @Override public void onRestart() ( super.onRestart(); Toast.makeText(αυτό, "Η δραστηριότητα επανεκκινήθηκε!", Toast.LENGTH_SHORT).show(); ) )Με αυτήν την εφαρμογή μπορείτε να δείτε με ποια σειρά ονομάζονται όλες αυτές οι μέθοδοι. Λάβετε υπόψη ότι σε κάθε μέθοδο που παρακάμπτουμε, πρώτα από όλα εκτελούμε την ίδια γονική μέθοδο! ΚΑΙ

  • μόνο

Μετά από αυτό αρχίζουμε να γράφουμε τον κώδικα μας.

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

Αρχιτεκτονική Android OS - λίγη ιστορία

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

Η ανάπτυξη του Android OS ξεκίνησε το 2003 από τη νεαρή εταιρεία Android Inc. Το 2005, αυτή η εταιρεία αγοράστηκε από την Google. Πιστεύω ότι τα κύρια χαρακτηριστικά της αρχιτεκτονικής Android καθορίστηκαν κατά τη διάρκεια αυτής της περιόδου. Αυτό δεν είναι μόνο η αξία της Android Inc. Οι αρχιτεκτονικές ιδέες και οι οικονομικοί πόροι της Google είχαν καθοριστική επίδραση στην αρχιτεκτονική του Android. Παρακάτω θα δώσω μερικά παραδείγματα.

Αν θυμάστε, το 2003-2005 χαρακτηρίστηκε από αυξημένη προσοχή στις εφαρμογές AJAX. Νομίζω ότι αυτό είχε θεμελιώδη επιρροή στην αρχιτεκτονική του Android: από πολλές απόψεις είναι πιο κοντά στην αρχιτεκτονική μιας τυπικής εφαρμογής AJAX παρά σε μια εφαρμογή επιτραπέζιου περιβάλλοντος εργασίας γραμμένη σε Java, C#, C++, VB κ.λπ.

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

Η επιρροή της αρχιτεκτονικής φιλοσοφίας του Eclipse είναι εμφανής στην επιλογή της εφαρμογής GUI, η οποία μοιάζει περισσότερο με το SWT παρά με το Swing.

Τα πρότυπα σχεδίασης κώδικα Android περιέχουν «Ουγγρική σημείωση», που γεννήθηκε στα τείχη του MS. Μπορεί να υποτεθεί ότι όποιος έγραψε αυτά τα πρότυπα είχε προηγουμένως αναπτυχθεί για Windows.

Αρχιτεκτονικά επίπεδα Android
Το λειτουργικό σύστημα Android έχει τρία πολύ διαφορετικά και πολύ διαχωρισμένα επίπεδα:
  1. Βασίζεται σε μια τροποποιημένη και απογυμνωμένη έκδοση του Linux, όπως ανέφερα σε ένα από τα προηγούμενα άρθρα μου.
  2. Πάνω από το επίπεδο Linux βρίσκεται το επίπεδο υποδομής εφαρμογών, το οποίο περιέχει την εικονική μηχανή Dalvik, ένα πρόγραμμα περιήγησης ιστού, μια βάση δεδομένων SQLite, μερικά «δεκανίκια» υποδομής και ένα Java API.
  3. Και τέλος, το επίπεδο που είναι γραμμένο Εφαρμογές Google Android. Σε γενικές γραμμές, αποτελούν επέκταση του επιπέδου υποδομής, αφού ο προγραμματιστής μπορεί να χρησιμοποιήσει αυτές τις εφαρμογές ή μέρη τους ως δομικά στοιχεία για τις δικές του εξελίξεις.
Ας δούμε αυτά τα στρώματα ένα προς ένα και με περισσότερες λεπτομέρειες.

Επίπεδο Linux

Φανταστείτε ότι είστε αρχιτέκτονας σε μια νέα εταιρεία. Πρέπει να αναπτύξετε ένα λειτουργικό σύστημα για έναν νέο τύπο συσκευής. Τι θα κάνεις;

Σε γενικές γραμμές, έχετε δύο επιλογές: να εφαρμόσετε τις δικές σας ιδέες, ξεκινώντας από το μηδέν, ή να χρησιμοποιήσετε ένα υπάρχον λειτουργικό σύστημα και να το προσαρμόσετε στις συσκευές σας.

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

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

Εάν τρέχετε Android Inc, τότε εξ ορισμού δεν μπορείτε να έχετε τόσα πολλά χρήματα. Εάν εκτελείτε το Google, θα έχετε τέτοιου είδους χρήματα, αλλά πιθανότατα θα σκεφτείτε δύο φορές να τα ξοδέψετε για να δημιουργήσετε το δικό σας λειτουργικό σύστημα. Θα σας πάρει επίσης αρκετά χρόνια για να φτάσετε στην τρέχουσα κατάσταση του Linux. Μερικά χρόνια καθυστέρησης μπορεί να είναι πολύ αργά για την είσοδο στην αγορά.

Σε μια τέτοια κατάσταση εταιρεία Appleαποφάσισε να δημιουργήσει Mac OS με βάση το Free BSD. Η Android Inc αποφάσισε να χρησιμοποιήσει το Linux ως βάση για το Android. Τόσο οι δωρεάν πηγές BSD όσο και οι πηγές Linux είναι ελεύθερα διαθέσιμες και παρέχουν μια καλή βάση για οποιαδήποτε ανάπτυξη, είτε είναι Apple είτε Google.

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

Αν σκεφτούμε το Linux στο υψηλό επίπεδο, τότε είναι ένας συνδυασμός του πυρήνα (που δεν μπορείτε να κάνετε χωρίς) και πολλών άλλων, προαιρετικών εξαρτημάτων. Μπορείτε να εκτελέσετε ακόμη και έναν πυρήνα, χωρίς τίποτα άλλο. Έτσι, η Google αναγκάζεται να χρησιμοποιήσει τον πυρήνα Linux ως μέρος του λειτουργικού συστήματος Android σε κάθε περίπτωση. Επιπλέον, εξετάστηκαν προαιρετικά μέρη και επιλέχθηκαν τα πιο απαραίτητα. Για παράδειγμα, προστέθηκαν το τείχος προστασίας δικτύου IPTables και το κέλυφος Ash. Είναι περίεργο ότι προστέθηκε το Ash και όχι το Bash, παρά το γεγονός ότι το τελευταίο είναι μια τάξη μεγέθους πιο ισχυρό. Αυτή η απόφαση βασίστηκε πιθανώς στο γεγονός ότι η τέφρα είναι λιγότερο εντάσεως πόρων.

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

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

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

Μπορείτε να ρωτήσετε τι να κάνετε εάν χρειάζεται να αναπτυχθείτε εγγενής εφαρμογήγια Android; Η Google συμβουλεύει ανεπιφύλακτα να μην το κάνετε αυτό. Τεχνικά, φυσικά, αυτό είναι δυνατό, αλλά στο μέλλον δεν θα μπορείτε να διανείμετε αυτήν την εφαρμογή με τον κανονικό τρόπο. Σκεφτείτε λοιπόν δύο φορές πριν ξεκινήσετε την εγγενή ανάπτυξη Android, εκτός φυσικά και αν εργάζεστε στο Android Open Source Project (AOSP), π.χ. Το ίδιο το λειτουργικό σύστημα Android.

Επίπεδο υποδομής εφαρμογής

Παρά κάποιες ομοιότητες Apple iOSκαι Android OS, υπάρχουν σημαντικές διαφορές μεταξύ των αρχιτεκτονικών λύσεων σε επίπεδο υποδομής και των δύο ΛΣ.

Η Apple αποφάσισε να χρησιμοποιήσει την Objective-C ως γλώσσα προγραμματισμού και χρόνο εκτέλεσης εφαρμογές iOS. Το Objective-C φαίνεται λίγο-πολύ μια φυσική επιλογή για ένα λειτουργικό σύστημα που βασίζεται στο Free BSD. Μπορείτε να σκεφτείτε το Objective-C ως κανονική C++ με έναν προσαρμοσμένο προεπεξεργαστή που προσθέτει ορισμένες συγκεκριμένες γλωσσικές κατασκευές. Γιατί δεν μπορούμε να χρησιμοποιήσουμε την τυπική C++, στην οποία είναι γραμμένο το Free BSD; Μου φαίνεται ότι ο λόγος είναι ότι η Apple προσπαθεί να κάνει τα πάντα με το δικό της στυλ "Apple".

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

Οι εφαρμογές Android είναι πολύ διαφορετικές από αυτή την άποψη. Είναι γραμμένα σε Java, η οποία είναι μια εντελώς διαφορετική τεχνολογία από τη C++ (αν και η σύνταξη κληρονομείται από τη C++).

Νομίζω ότι ο κύριος λόγος είναι η ανάγκη να τρέχει η ίδια εφαρμογή σε διαφορετικό υλικό. Αυτό το πρόβλημα παρουσιάζεται μόνο σε λειτουργικό σύστημα Android. Τα παιδιά από την Apple δεν έχουν αυτό το πρόβλημα. Το iOS τρέχει μόνο με το δικό του υλικό και η Apple έχει τον πλήρη έλεγχο της όλης διαδικασίας. Για το Android, ισχύει το αντίθετο: η Google δεν έχει κανέναν έλεγχο στους κατασκευαστές υλικού. Για παράδειγμα, το Android OS τρέχει σε επεξεργαστές x86, ARM και Atom (τα σχόλια υποδηλώνουν ότι το x86 περιλαμβάνει Atom και το Android τρέχει σε x86, ARM, PPC και MIPS - σημείωμα του μεταφραστή). Σε δυαδικό επίπεδο, αυτές οι αρχιτεκτονικές είναι ασύμβατες.

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

Για να εκτελείται η ίδια εφαρμογή σε διαφορετικό υλικό, η Google χρησιμοποίησε μια αρχιτεκτονική που βασίζεται σε κοντέινερ. Σε μια τέτοια αρχιτεκτονική, ο δυαδικός κώδικας εκτελείται από ένα κοντέινερ λογισμικού και απομονώνεται από τις λεπτομέρειες του συγκεκριμένου μηχανήματα υπολογιστών. Τα παραδείγματα είναι γνωστά σε όλους - Java και C#. Και στις δύο γλώσσες, ο δυαδικός κώδικας είναι ανεξάρτητος από το υλικό και εκτελείται από μια εικονική μηχανή.

Φυσικά, υπάρχει ένας άλλος τρόπος για να επιτευχθεί ανεξαρτησία υλικού σε δυαδικό επίπεδο. Μια επιλογή είναι να χρησιμοποιήσετε έναν εξομοιωτή υλικού, επίσης γνωστό ως QEMU. Σας επιτρέπει να μιμηθείτε, για παράδειγμα, μια συσκευή με Επεξεργαστής ARMστην πλατφόρμα x86 και ούτω καθεξής. Η Google θα μπορούσε να χρησιμοποιήσει την C++ ως γλώσσα για την ανάπτυξη εφαρμογών μέσα σε εξομοιωτές. Πράγματι, η Google χρησιμοποιεί αυτήν την προσέγγιση Εξομοιωτές Android, τα οποία είναι χτισμένα στην κορυφή του QEMU.

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

Όπως και να έχει, η Google αποφάσισε να χρησιμοποιήσει την Java ως κύρια γλώσσα για την ανάπτυξη εφαρμογών και το περιβάλλον εκτέλεσής τους.

Νομίζω ότι αυτή ήταν μια κρίσιμη αρχιτεκτονική απόφαση που ξεχώρισε το Android από τα υπόλοιπα κινητά λειτουργικά συστήματα που βασίζονται στο Linux που κυκλοφορούν σήμερα. Από όσο γνωρίζω, κανένα από αυτά δεν έχει συμβατότητα δυαδικού κώδικα σε επίπεδο εφαρμογής. Ας πάρουμε το MeeGo ως παράδειγμα. Χρησιμοποιεί C++ και το πλαίσιο Qt. παρά το γεγονός ότι το Qt είναι cross-platform, η ανάγκη δημιουργίας διαφορετικών builds για διαφορετικές πλατφόρμεςδεν εξαφανίζεται.

Έχοντας επιλέξει την Java, το επόμενο βήμα ήταν να αποφασίσουμε ποια εικονική μηχανή (JVM) θα χρησιμοποιούσαμε. Λόγω περιορισμένων πόρων, η χρήση του τυπικού JVM ήταν δύσκολη. Η μόνη δυνατή επιλογή ήταν να χρησιμοποιήσετε το Java ME JVM, το οποίο είναι σχεδιασμένο για φορητές συσκευές. Ωστόσο, η ευτυχία της Google δεν θα ήταν πλήρης χωρίς την ανάπτυξη της δικής της εικονικής μηχανής και η Dalvik VM γεννήθηκε.

Το Dalvik VM διαφέρει από άλλες εικονικές μηχανές Java στους ακόλουθους τρόπους:

  • Χρησιμοποιεί μια ειδική μορφή DEX για την αποθήκευση δυαδικών κωδικών, σε αντίθεση με τις μορφές JAR και Pack200 που είναι το πρότυπο για άλλες Εικονικές μηχανές Java. Η Google έχει δηλώσει ότι τα δυαδικά αρχεία DEX είναι μικρότερα από τα JAR. Νομίζω ότι θα μπορούσαν να χρησιμοποιήσουν το ίδιο εύκολα το Pack200, αλλά αποφάσισαν να ακολουθήσουν το δικό τους δρόμο.
  • Το Dalvik VM είναι βελτιστοποιημένο για την εκτέλεση πολλαπλών διεργασιών ταυτόχρονα.
  • Το Dalvik VM χρησιμοποιεί μια αρχιτεκτονική που βασίζεται σε καταχωρητές έναντι της αρχιτεκτονικής που βασίζεται σε στοίβα σε άλλα JVM, με αποτέλεσμα αυξημένη ταχύτητα εκτέλεσης και μικρότερα δυαδικά μεγέθη.
  • Αυτή χρησιμοποιεί δικό του σετοδηγίες (όχι τυπικό bytecode JVM)
  • Είναι δυνατή η εκτέλεση (αν χρειάζεται) πολλών ανεξάρτητων εφαρμογών Android σε μία διαδικασία
  • Η εκτέλεση της εφαρμογής μπορεί να εκτείνεται σε πολλαπλές διαδικασίες Dalvik VM "φυσικά" (θα συζητήσουμε τι σημαίνει αυτό αργότερα). Προστέθηκε για να υποστηρίξει αυτό:
    • Ένας ειδικός μηχανισμός σειριοποίησης αντικειμένων που βασίζεται στις κλάσεις Parcel και Parcelable. Λειτουργικά, έχει τους ίδιους στόχους με το Java Serializable, αλλά τα δεδομένα που προκύπτουν είναι μικρότερα και δυνητικά πιο ανεκτικά στην έκδοση κλάσης.
    • Ένας ειδικός τρόπος για να πραγματοποιείτε κλήσεις διαδικασιών (IPC), με βάση τη γλώσσα ορισμού διεπαφής Android (AIDL).
  • Πριν από το Android 2.2, η Dalvik VM δεν υποστήριζε τη συλλογή JIT, η οποία ήταν μια σοβαρή επιτυχία. Ξεκινώντας από την έκδοση 2.2, η ταχύτητα εκτέλεσης των εφαρμογών που χρησιμοποιούνται συχνά


Συνιστούμε να διαβάσετε

Κορυφή