Γιώργος Γεωργοβασίλης georgeg@di.uoa.gr Μια εισαγωγή στο J2ME Daemon τεύχος 11 Γιώργος Γεωργοβασίλης georgeg@di.uoa.gr
Τι θα δούμε J2ME – Java για μικρές συσκευές Κοινά και διαφορές Βήματα για τη συγγραφή, εγκατάσταση και εκτέλεση μιας εφαρμογής Χρηστική διεπαφή Εφαρμογές δικτύου Ασφάλεια Πολυμέσα Μια εισαγωγή στο J2ME
J2ME – Java για μικρές συσκευές Java (KVM) σε PDA, κινητά τηλέφωνα, μικροσυσκευές, χρήση των εξειδικευμένων λειτουργιών τους Αποτελεσματική διαχείριση πόρων (garbage collection, threads) Κοινό προγραμματιστικό περιβάλλον Ασφάλεια Το J2ME φέρνει την java σε μικρές συσκευές, με όλα τα πλεονεκτήματα και τα μειονεκτήματά της. Αν σας αρέσει η Java, τότε το J2ME σας αφήνει εύκολα να χρησιμοποιήσετε όσα ξέρετε για να γράψετε εφαρμογές για μικρές συσκευές χωρίς να χρειαστεί να μάθετε πολλά από την αρχή. Στα κινητά τηλέφωνα, στα οποία θα εστιάσουμε, προσφέρεται πρόσβαση σε ειδικές λειτουργίες, όπως: Πραγματοποίηση κλήσεων Λήψη κλήσεων Αποστολή / παραλαβή γραπτών μηνυμάτων Πρόσβαση στον τηλεφωνικό κατάλογο και κατάλογο διευθύνσεων Πρόσβαση σε άλλες συσκευές μέσω bluetooth Location based services, μέσω της επικοινωνίας με GPS ή ανακτώντας την θέση από το δίκτυο του τηλεπικοινωνιακού παρόχου. Η εκτέλεση των εφαρμογών είναι πιο αργή από κώδικα μηχανής και λόγω περιορισμένων πόρων συνήθως δεν υπάρχουν οι βελτιστοποιητές που συναντούμε στις JVM για τα PC. Αυτά ήταν και τα κακά νέα. Διαχειρίζεται αποτελεσματικά την μνήμη, προλαμβάνοντας τον κατακερματισμό της. Φέρνει πολυνηματική χρονοδρομολόγιση (threads) σε πλατφόρμες που δεν παρέχουν την δυνατότητα αυτή. Ο τυπικός κώδικας java είναι μικρότερος σε όγκο από τον αντίστοιχο κώδικα μηχανής. Παρέχει ένα κοινό περιβάλλον εκτέλεσης στα προγράμματα. Για τους κατασκευαστές κινητών τηλεφώνων φέρνει έτοιμες λειτουργίες που ειδάλλως αυτοί θα έπρεπε να υλοποιήσουν (παράδειγμα: αναπαραγωγή wav και midi, jpeg και png, αναπαραγωγή flash, xml, ssl/https) Η KJVM δεν επιτρέπει πρόσβαση στις λειτουργίες χαμηλού επιπέδου του ΛΣ. Τα προγράμματα J2ME δηλ παραμένουν πάντοτε εφαρμογές του χρήστη, δεν αποκτούν δικαιώματα υπηρεσίας συστήματος. Οι εφαρμογές μπορούν να υπογραφούν από τον κατασκευαστή (certificates). Μια εισαγωγή στο J2ME
Κοινά και διαφορές Κοινά με την J2SE: java.lang java.util java.io … … και διαφορές: java.lang.ref java.lang.reflection java.awt javax.swing … Το J2ME διατηρεί κοινές αρχές με την ‘μεγάλη’ java: Οι συμβολοσειρές είναι όπως τις ξέραμε (συνεχίζεται ο διαχωρισμός String/StringBuffer!) Τα Streams είναι όπως τα ξέραμε Και κάποιες διαφορές: Classloaders, reflection, references, proxy δεν υπάρχουν MIDP 1.0 δεν έχει float/double Δεν υποστηρίζονται συστήματα αρχείων. Αντ’αυτού υπάρχουν τα record stores Και μετά η λίστα μεγαλώνει: awt, swing, sql, xml κλπ απουσιάζουν, όχι εντελώς απρόσμενα… Μια εισαγωγή στο J2ME
Δημοσίευση σε ένα webserver 1,2,3… Μεταγλώττιση *.class Προέλεγχος *.class Παραγωγή Jar και Jad MyApp.jar MyApp.jad Η μεταγλώττιση της εφαρμογής γίνεται με τον κανονικό μεταγλωττιστή java, αρκεί να έχουμε ορίσει τις βιβλιοθήκες του j2me σαν βιβλιοθήκες συστήματος Επειδή η KVM έχει λιγότερες δυνατότητες ελέγχου της ορθότητας του κώδικα, απαιτείται το στάδιο του προελέγχου. Παράγει νέο κώδικα, ο οποίος και καταλήγει στο jar. Στο jar συγκεντρώνονται κώδικας και δεδομένα (λ.χ. εικόνες). Σε αντίθεση με το j2me μια εφαρμογή αποτελείται από ένα και μόνο jar. Δεν μπορούμε να εγκαταστήσουμε κοινές βιβλιοθήκες για περισσότερες εφαρμογές. Το jar και το jad εγκαθιστώνται σε μια δικτυακή τοποθεσία όπου η συσκευή j2me μπορεί να το βρει μέσω http. Αυτό μπορεί να είναι ένα webserver στη γενική περίπτωση ή, ειδικά και ανά κατασκευαστή, μια επικοινωνία μέσω bluetooth, καλωδίου κ.λ.π Να προσέξουμε το περιεχόμενο του κειμένου http να δηλώνεται ως ‘Content-Type: text/vnd.sun.j2me.app-descriptor’ Δημοσίευση σε ένα webserver http://location/MyApp.jad Σύνδεση στο webserver μέσω GPRS και εγκατάσταση στο κινητό Μια εισαγωγή στο J2ME
KToolbar Το KToolbar είναι ένα απλό περιβάλλον ανάπτυξης της Sun για το J2ME Πακετάρει Jar Κατασκευάζει Jad Χρήσιμο για ρυθμίσεις ασφάλειας Το KToolbar δεν είναι IDE. Απλώς συμμαζεύει κώδικα και resources (εικόνες, ήχους και λοιπά δεδομένα), επιτρέπει στον προγραμματιστή να ορίσει πληροφορίες (όνομα εταιρίας λ.χ. ή απαιτούμενες ρυθμίσεις ασφαλείας) και κατασκευάζει τα jar και jad. Επίσης μπορεί να τρέξει την εφαρμογή μέσω μιας προσομοίωσης συσκευής. Μια εισαγωγή στο J2ME
KToolbar Μια εισαγωγή στο J2ME Η πρώτη άποψη του KToolbar. Εδώ ορίζουμε και χειριζόμαστε projects. Μια εισαγωγή στο J2ME
KToolbar Επεξεργασία των εγγραφών του jad Μια εισαγωγή στο J2ME
KToolbar Μια εισαγωγή στο J2ME Προχωρημένες ρυθμίσεις ασφάλειας. Εδώ επιτρέπουμε (ή απαγορεύουμε) πρόσβαση σε βιβλιοθήκες. Αργότερα, ο χρήστης κατά την εγκατάσταση της εφαρμογής μπορεί να γνωρίσει ποιες λειτουργίες χρησιμοποιεί η εφαρμογή. Μια εισαγωγή στο J2ME
Παράδειγμα JAD MIDlet-1: MyMidlet, res/icon.png, package.MainClass MIDlet-Description: This is my Midlet MIDlet-Jar-Size: 219381 MIDlet-Jar-URL: http://www.myserver.gr/george/midlet.jar MIDlet-Name: George’s Demo MIDlet-Vendor: George MIDlet-Version: 2.0 Manifest-Version: 1.0 MicroEdition-Configuration: CLDC-1.0 MicroEdition-Profile: MIDP-2.0 Το κινητό τηλέφωνο συνδέεται μέσω http σε ένα webserver, ανακτά το JAD, δείχνει κάποιες πληροφορίες από αυτό στο χρήστη και, εφ’ όσον συμφωνεί, ανακτά το jar και το εγκαθιστά. Μια εισαγωγή στο J2ME
Χρηστική διεπαφή Δεν υπάρχουν παράθυρα, μόνο οθόνες Εφαρμογές με φόρμες Εφαρμογές γραφικών Το J2ME δεν περιέχει τις βιβλιοθήκες awt και swing. Εδώ τρέχει μία εφαρμογή κάθε φορά σε ένα μόνο παράθυρο το οποίο εκτείνεται σε όλη την ελεύθερη επιφάνεια της οθόνης. Πάραυτα η εφαρμογή δεν μπορεί να υποθέσει ότι της ανήκει συνεχώς όλη η οθόνη, αφού θα μπορούσαν να εμφανιστούν μηνύματα από το κινητό τηλέφωνο (λ.χ. εισερχόμενη κλήση). Έτσι, ανά περίπτωση, πρέπει να είναι προετοιμασμένη για επανασχεδιασμό των περιεχομένων της οθόνης. Μπορούμε να γράψουμε είτε μια εφαρμογή βασισμένη σε φόρμες (όπου οι δυνατότητες και ο χειρισμός μοιάζουν με WML) είτε μπορούμε κατευθείαν να ζωγραφίζουμε σχήματα στην οθόνη. Η χρήση και των δυο τρόπων στην ίδια οθόνη δεν είναι δυνατή. Μια εισαγωγή στο J2ME
Χρηστική διεπαφή: φόρμες Μια φόρμα κατασκευάζεται παρόμοια με τον τρόπο που ‘γεμίζουμε’ ένα JPanel Τύποι πεδίων: ChoiceGroup, CustomItem, DateField, Gauge, ImageItem, Spacer, StringItem, TextField Στο MIDP 2.0 υπάρχει η δυνατότητα ορισμού δικών μας τύπων πεδίων (Item) Όπως στο swing, εδώ υπάρχει η έννοια της συγγραφής μιας φόρμας και εμπλουτισμού της με πεδία (Items) όπως ετικέτες, πεδία κειμένου, λίστες κ.λ.π. Μια φόρμα κάθε φορά καταλαμβάνει ολόκληρη την οθόνη. Υπάρχουν διαφορετικοί τύποι πεδίων, έχουν σημειωθεί με ειδικό χρώμα οι τύποι που υπάρχουν μόνο στο MIDP 2.0 Δεν υπάρχει η ευελιξία σύνθεσης πολύπλοκων φορμών (φόρμες από φόρμες) ή δικών μας τύπων πεδίων (μόνο στο MIDP 2.0). Τα περισσότερα κινητά τηλέφωνα ολισθαίνουν την οθόνη κάθετα για μεγάλες φόρμες. Δεν είναι δυνατή η ακριβής ή και σχετική (με προηγούμενο πεδίο) τοποθέτηση ενός πεδίου, το ένα πάει μετά το άλλο. Δυστυχώς δεν υπάρχουν ‘κουμπιά’ μέχρι το MIDP 2.0 με τα οποία θα μπορούσαν να συνδεθούν δραστηριότητες. Μια εισαγωγή στο J2ME
Φόρμες, παράδειγμα 1 Μια εισαγωγή στο J2ME Βλέπουμε μια φόρμα με ένα τίτλο (Ταινίες & σινεμά), μια επεξηγηματική ετικέτα (Αναζήτηση ταινιών), ένα πεδίο εισαγωγής κειμένου (Άννα και ο βασιλιάς) με την επεξήγησή της (Ταινία). Κάτω δεξιά η μοναδική εντολή ‘Φόρτωση’ που έχει αντιστοιχηθεί σε ένα πλήκτρο. Μια εισαγωγή στο J2ME
Φόρμες, παράδειγμα 1 import javax.microedition.lcdui.*; public class SearchForm extends Form{ public SearchForm() { super("Ταινίες & σινεμά"); append(new StringItem("Αναζήτηση ταινιών","")); append(new TextField("Ταινία", "", 30, TextField.ANY)); } ... Στο παράδειγμα κατασκευάζω μια φόρμα με ένα τίτλο [super()], ένα κείμενο [StringItem] και ένα πεδίο εισαγωγής κειμένου (TextField) Τα πεδία της φόρμας προστείθονται το ένα κάτω από το άλλο και δεν έχουμε τρόπο ακριβούς τοποθέτησης τους Μια εισαγωγή στο J2ME
Φόρμες, παράδειγμα 2 Κάθε φόρμα συνδέεται με εντολές οι οποίες εμφανίζονται σαν μενού στις επιλογές. Η αναπαράσταση και ο χειρισμός του μενού διαφέρει από συσκευή σε συσκευή Μια εισαγωγή στο J2ME
Φόρμες, παράδειγμα 2 Μια εισαγωγή στο J2ME Μενού με περισσότερες εντολές. Μια εισαγωγή στο J2ME
Φόρμες, παράδειγμα 2 Command moviesCmd = new Command("Ταινίες", Command.ITEM, 1); Command cinemasCmd = new Command("Σινεμά", Command.ITEM, 2); Command loadCmd = new Command("Φόρτωση", Command.ITEM, 3); addCommand(loadCmd); addCommand(cinemasCmd); addCommand(moviesCmd); setCommandListener(this); Εδώ κατασκευάζουμε και προσθέτουμε τρεις εντολές, οι οποίες θα εμφανίζονται σαν εγγραφές του μενού. Μια εισαγωγή στο J2ME
Φόρμες, παράδειγμα 2 public void commandAction(Command command, Displayable displ) { if (command == moviesCmd) Display.getDisplay(CinemaMain.main).setCurrent(movieList); if (command == loadCmd) loadContent(); } Εδώ δίνω ένα παράδειγμα του χειρισμού εντολών. Όταν ο χρήστης επιλέξει μια εγγραφή από το μενού θα κληθεί η μέθοδος commandAction με ορίσματα την εντολή και την φόρμα για την οποία κλήθηκε. Μια εισαγωγή στο J2ME
Χρηστική διεπαφή: οθόνη γραφικών Πλήρης έλεγχος των περιεχομένων της οθόνης Προσπέλαση της οθόνης με αντικείμενο Graphics Στο MIDP 2.0: GameCanvas, Layers Εδώ καλείται η μέθοδος paint(Graphics g) του αντικειμένου της οθόνης, με το οποίο μπορούμε να σχηματίσουμε γραμμές, πολύγωνα, κύκλους, να ζωγραφίσουμε εικόνες και συμβολοσειρές. Η paint (δυστυχώς) καλείται όπως και στο swing από τον διαχειριστή της οθόνης, δηλ. δεν υπάρχει εγγύηση για το πότε ακριβώς θα κληθεί. Στο MIDP 2.0 υπάρχει ένας νέος τρόπος χειρισμού της οθόνης, το GameCanvas, το οποίο ουσιαστικά μας επιτρέπει να γράφουμε εφαρμογές του τύπου: While (gameNotOver) { keyCode = getPressedKeys(); reactToKey(keyCode); paint(); sleep(200); } Τα layers ζωγραφίζονται αυτόματα από τον layer manager. Μπορούμε έτσι να συνθέσουμε σκηνικά πολύ μεγαλύτερα από την οθόνη με αλληλοεπικαλυπτόμενα σχήματα χωρίς να χρειάζεται να υπολογίζουμε ποιο πρέπει να ζωγραφιστεί πρώτα και πιο μετά, να υπολογίζουμε την μετατόπιση της ολίσθησης κλπ. Μια εισαγωγή στο J2ME
Εφαρμογές δικτύου Πριν το MIDP 2.0 υπάρχει μόνο το HttpConnection Στο MIDP 2.0 HttpsConnection, ServerSocketConnection, UDPDatagramConnection Πριν το MIDP 2.0 υπήρχε μόνο η δυνατότητα σύνδεσης του πελάτη στο υπηρέτη μέσω του πρωτοκόλλου http. Τώρα οι συσκευές μπορούν να ανοίγουν TCP/IP και UDP συνδέσεις και να δέχονται εισερχόμενες συνδέσεις και πακέτα. Μια εισαγωγή στο J2ME
Εφαρμογές δικτύου, παράδειγμα StreamConnection c = null; InputStream s = null; c = (StreamConnection)Connector.open(url); s = c.openInputStream(); int ch; while ((ch = s.read()) != -1) { ... } Ένα παράδειγμα σύνδεσης http και ανάγνωσης του περιεχομένου Μια εισαγωγή στο J2ME
Ασφάλεια (1) Τα jar, όπως και στη J2SE μπορούν να υπογραφούν Η εφαρμογή είναι ‘κλειστή’, δηλ. δεν μπορεί να εγκαταστήσει κοινές βιβλιοθήκες για άλλες εφαρμογές Τα δεδομένα μιας εφαρμογής δεν διαμοιράζονται με άλλες εφαρμογές εκτός αν ζητηθεί ρητά Οι εφαρμογές δεν μπορούν να επικοινωνήσουν μεταξύ τους ‘εσωτερικά’ Το jar μπορεί να υπογραφεί με ένα δημόσιο πιστοποιητικό γνησιότητας ώστε να ταυτοποιηθεί η προέλευση και οντότητα της εφαρμογής Σε αντίθεση με το τι συμβαίνει στο J2SE μια εφαρμογή αποτελείται από ένα μόνο jar και το classpath περιορίζεται σε τοποθεσίες μέσα στο jar Το record store είναι μοναδικό για κάθε εφαρμογή και δεν μπορεί να μοιραστεί με άλλες εφαρμογές. Στο MIDP 2.0 δίδεται αυτή η δυνατότητα αν ζητηθεί ρητά. Οι εφαρμογές δεν μπορούν να επικοινωνήσουν μεταξύ τους λ.χ. γράφοντας ή διαβάζοντας κοινά αρχεία ή διαμοιραζόμενες προγραμματιστικές διεπαφές. Μπορούν να επικοινωνήσουν μόνο μέσω εξωτερικών (από τον χρήστη ελεγχόμενων) διαύλων όπως το δίκτυο, bluetooth, στέλνοντας SMS η μία στην άλλη κ.λ.π. Μια εισαγωγή στο J2ME
Ασφάλεια (2) Κρυπτογράφηση δικτυακής επικοινωνίας Ελεγχόμενη πρόσβαση σε λειτουργίες όπως δίκτυο, βιβλίο διευθύνσεων, μόνιμη μνήμη Ελεγχόμενη πρόσβαση σε βιβλιοθήκες (API) Πριν το MIDP 2.0 με εξωτερικές βιβλιοθήκες μπορεί να χρησιμοποιηθεί το https, τώρα είναι μέρος του συστήματος Ο χρήστης ερωτάται όταν η εφαρμογή απαιτεί πρόσβαση σε εξωτερικούς πόρους Μέσω του jad μπορεί να επιτραπεί ή να απαγορευτεί η πρόσβαση σε βιβλιοθήκες (packages). Αυτό δεν είναι ακριβώς αληθές, γιατί εδώ εμπλέκεται ο μηχανισμός ασφαλείας όπως τον ξέρουμε από το J2SE, δηλ ορίζονται security managers οι οποίοι ενεργοποιούνται (ή απενεργοποιούνται) κατ’ επιλογή. Μια εισαγωγή στο J2ME
Πολυμέσα Η κλάση Player υποστηρίζει διάφορα είδη πολυμέσων, όπως wav, mp3, AVI κ.λ.π. Υποστηρίζει έναρξη, παύση και μετακίνηση στον χρονικό άξονα Οι συγκεκριμένες δυνατότητες αναπαραγωγής πολυμέσων του Player εξαρτώνται από τον κατασκευαστή. Οι δυνατότητες μετακίνησης στο μέσο ουσιαστικά είναι start/stop/eject/fast forward/fast backward/set loop count Μια εισαγωγή στο J2ME
Αναφορές J2ME http://java.sun.com/j2me/index.jsp Nokia Developer http://www.forum.nokia.com/main.html Μια εισαγωγή στο J2ME