Java ME Anwendungsentwicklung für Handys, PDA und Co. von Heiko Mosemann, Ulrich Breymann 1. Auflage Hanser München 2006 Verlag C.H. Beck im Internet: www.beck.de ISBN 978 3 446 22997 6 Zu Inhaltsverzeichnis schnell und portofrei erhältlich bei beck-shop.de DIE FACHBUCHHANDLUNG Java ME Heiko Mosemann, Ulrich Breymann Anwendungsentwicklung für Handys, PDA und Co. ISBN 3-446-22997-3 Leseprobe Weitere Informationen oder Bestellungen unter http://www.hanser.de/3-446-22997-3 sowie im Buchhandel 2 Erste Schritte 2.1 2.1.1 Das erste Programm Die Werkzeuge Um ein erstes Programm für ein Mobiltelefon schreiben zu können, brauchen wir eine Entwicklungsumgebung. Es gibt mehrere Systeme auf dem Markt, wir wenden uns zunächst der einfachsten Lösung zu, auf anspruchsvollere Werkzeuge wird im Abschnitt 17 eingegangen. Im Folgenden werden betriebssystemtypische Hinweise nur für die am meisten verbreiteten Desktop-Betriebssysteme Windows XP und Linux gegeben.1 Die einfachste Lösung besteht aus drei Teilen: 1. Java SE Development Kit (JDK) Um die Programme kompilieren zu können, muss das JDK installiert sein (download von [JSE]). Am besten setzt man auch gleich den Pfad entsprechend und die Umgebungsvariable JAVA_HOME, wie im Anhang auf Seite 359 beschrieben. Diese Umgebungsvariable wird benötigt, wenn wir später einen Web-Server installieren (siehe unten, Abschnitt 17.3). 2. Java ME Wireless Toolkit Sun stellt ein aus mehreren Komponenten bestehendes Werkzeug zur Verfügung, mit dem sehr leicht MIDlets ausprobiert werden können, das Java ME Wireless Toolkit, abgekürzt WTK (download von [JMEW]). Dieses Toolkit wird anschließend ebenfalls installiert. Es sei angenommen, dass die Installation in das Verzeichnis C:\WTK (Windows) bzw. /home/user/wtk (Linux) erfolgt. Bei der Installation wird die Existenz des JDKs vorausgesetzt. Falls das JDK eine modernere Version als diejenige ist, mit der das Toolkit getestet worden ist, wird man bei der Installation darauf hingewiesen. Wegen der Kompatibilität des Bytecodes sollten keine Schwierigkeiten zu erwarten sein – aber sie sind nicht auszuschließen, gerade bei dem großen Wechsel von Java 1.4 nach Java 5. 3. Nun brauchen wir noch einen beliebigen Editor zum Programmieren. Die folgenden drei Editoren gibt es sowohl für Windows wie für Linux: JEdit (www.jedit.org), SCiTE (www.scintilla.org), XEmacs (www.xemacs.org). Alternativ gibt es Entwicklungswerkzeuge von einzelnen Herstellern wie SonyEricsson oder Nokia. Auch ist die Integration in andere Entwicklungsumgebungen 1 MAC-User bitten wir vorab um Entschuldigung! 22 2 Erste Schritte wie NetBeans oder Eclipse möglich. Abschnitt 17.1 im Kapitel über Werkzeuge beschreibt die Entwicklung mobiler Anwendungen mit Eclipse. 2.1.2 Entwicklungsschritte Hier werden die allerersten Entwicklungsschritte vom Schreiben des Programms bis zu seiner Ausführung auf einem Emulator beschrieben. Als Werkzeug wird das Wireless Toolkit (WTK) von Sun benutzt, wie auch in allen folgenden Beispielen. Programm schreiben Mit einem der genannten Editoren oder einem anderen schreiben wir das kleine Programm ErstesMIDlet.java, das einen vorgegebenen Text ausgibt und ein erläuterndes Laufband (Ticker) anzeigt. Das erste Programm package de.java_me.jme.beispiele.Projekt0; import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class ErstesMIDlet extends MIDlet { private Form form = new Form("Das erste MIDlet!"); public ErstesMIDlet() { form.addCommand(new Command("ENDE", Command.EXIT, 1)); form.setCommandListener(new CommandListener() { public void commandAction(Command c, Displayable d) { notifyDestroyed(); } }); form.setTicker(new Ticker("Ticker läuft!")); } protected void startApp() { form.append(new StringItem("Nachricht:", "MIDlet gestartet!")); Display.getDisplay(this).setCurrent(form); } protected void pauseApp() { } protected void destroyApp(boolean b) { } } Einzelheiten zur Funktionsweise der einzelnen Anweisungen werden auf nachfolgende Kapitel verschoben, um zunächst den großen Zusammenhang darzu- 2.1 Das erste Programm 23 stellen. Das WTK bringt die Bibliothek javax.microedition mit, die im JDK nicht enthalten ist, sowie die zugehörige Dokumentation der APIs, siehe C:\WTK \docs\api\midp\index.html (Windows) bzw. /home/user/wtk/docs/api/midp/index.html (Linux). Im Beispielprogramm fällt auf, dass die sonst bei vielen Java-Programmen vorhandene Funktion main(String[]) fehlt – dazu erfahren Sie mehr im Kapitel 4, »MIDlet Grundlagen«. Projekt anlegen Nun starten wir die Komponente KToolBar des Toolkits mit »Start« → »Alle Programme« → »Java ME Wireless Toolkit« → »KToolbar« (Windows) bzw. durch Eingabe des Kommandos /home/user/wtk/bin/ktoolbar (Linux). Die nun folgenden, unten beschriebenen Bedienungsschritte zeigt Abbildung 2.1. Einstellungen Abbildung 2.1: Anlegen eines Projekts mit dem WTK 24 2 Erste Schritte Im KToolbar-Fenster klicken wir nun auf »New Project«, wählen einen Projektnamen, zum Beispiel »Projekt0«, und tragen den Namen unserer ersten MIDletKlasse einschließlich des Package-Namens ein (de.java_me.jme.beispiele. Projekt0.ErstesMIDlet). Die im nächsten Fenster vorgeschlagenen Projekteinstellungen werden mit OK bestätigt. Die Datei ErstesMIDlet.java kopieren wir in das neu angelegte Verzeichnis C:\WTK\apps\Projekt0\src\de\java_me\beispiele\Projekt0 (Windows) bzw. /home/user/wtk/apps/Projekt0/src/de/java_me/beispiele/Projekt0 (Linux). Übersetzen und Verifizieren Betätigen der Schaltfläche »Build« bewirkt die Übersetzung des Programms in class-Dateien, die im Unterverzeichnis tmpclasses des Projekts abgelegt werden. Falls die Meldung »Build failed« erscheinen sollte, gibt es noch Syntaxfehler im Programm, die mit dem Editor zu korrigieren sind, andernfalls erscheint die Meldung »Build complete«. »Build« sorgt für die Einbindung der richtigen Bibliotheken und ist letztlich nichts anderes, als wenn im Verzeichnis Projekt0 in einer Shell (Linux) bzw. Eingabeaufforderung (Windows) ein entsprechendes Kommando einTipp gegeben würde. Wer wissen will, was sich »hinter den Kulissen« tut, sollte den Abschnitt 2.5 am Ende dieses Kapitels lesen. Der Abschnitt enthält die Kommandozeilen und auch Informationen über notwendige Optionen, die im Sun WTK mit den »Project settings« eingestellt werden. »Build« bewirkt aber noch mehr, nämlich die Prä-Verifikation. Eine vollständige Verifikation im mobilen Endgerät ist zu aufwändig. Es müsste Speicher für das Programm zur Verifikation des Bytecodes bereitgestellt werden, und es würde Laufzeit beim Start einer Anwendung kosten. Daher wird die Bytecode-Verifikation in zwei Schritten ausgeführt: Eine Prä-Verifikation im ersten Schritt, bei der die verifizierten Dateien aus tmpclasses nach classes kopiert werden, und die abschließende Verifikation beim Start der Anwendung auf dem Endgerät. Der erste Schritt wird also schon bei der Konstruktion der Software unternommen, und der zweite Schritt kann deswegen mit sehr viel weniger Speicher und Laufzeit auskommen. Java ME stellt für die Prä-Verifikation das Programm preverify zur Verfügung, das mit »Build« implizit aufgerufen wird. Start der Anwendung – noch ohne Installation Das Toolkit emuliert verschiedene Gerätetypen, die in der Zeile »Device« zur Auswahl angeboten werden. Mit »Run« wird das Projekt auf dem angezeigten Gerät, zum Beispiel DefaultColorPhone, wenn wir kein anderes wählen, zum Start angeboten. Der Eintrag »Launch« unten rechts ist ein so genannter Softkey, der mit der direkt darunter befindlichen Taste betätigt wird und der unser erstes MIDlet startet. Abbildung 2.2 zeigt das Ergebnis. 2.2 Installationsvorbereitungen 25 Abbildung 2.2: Das erste MIDlet 2.2 Installationsvorbereitungen Mit der Schaltfläche »Run« läuft das Programm auf Basis der erzeugten classDateien. Das reicht jedoch nicht – letztlich wird eine jar-Datei benötigt, die man auf ein mobiles Gerät portieren, dort installieren und zur Ausführung bringen kann. 2.2.1 Packen Die Wahl von »Project« → »Package« → »Create Package« in der obersten Menüzeile bewirkt gleich mehrere Schritte: • Übersetzen und Prä-Verifikation mit »Build« wie oben beschrieben. • Packen zu einem Java-Archiv Die entstehenden Dateien Projekt0.jar, Projekt0.jad und MANIFEST.MF werden 26 2 Erste Schritte im Verzeichnis bin des Projekts abgelegt. Statt Projekt0 ist der jeweilige Projektname einzusetzen, hier beziehen wir uns auf das obige Beispiel. Projekt0.jar ist das ausführbare Java-Archiv, Projekt0.jad ist eine Beschreibungsdatei (java archive description), die den Umfang der Anwendung in Bytes und andere Daten enthält. Speicher ist knapp, und die Bandbreite der Netzverbindung ist teuer. Deshalb ist in Projekt0.jad die Angabe der Größe der jar-Datei besonders wichtig. Die Nutzerin oder der Nutzer eines mobilen Geräts (oder ein Programm auf diesem Gerät) kann dann auf der Basis dieser Information entscheiden, ob die jar-Datei tatsächlich aus dem Internet heruntergeladen werden soll. Für das oben beschriebene Projekt lautet Projekt0.jad2 : MIDlet-1: Projekt0, Projekt0.png, de.java_me.beispiele.Projekt0.ErstesMIDlet MIDlet-Jar-Size: 2458 MIDlet-Jar-URL: Projekt0.jar MIDlet-Name: Projekt0 MIDlet-Vendor: Unknown MIDlet-Version: 1.0 MicroEdition-Configuration: CLDC-1.0 MicroEdition-Profile: MIDP-2.0 Diese vom WTK automatisch erzeugte Datei kann nicht mit einem Shell-Kommando erzeugt werden, aber mit einem beliebigen Editor. Es ist wichtig, dass die angegebene Dateigröße für die jar-Datei stimmt. 2.2.2 Packen mit Speicherplatzminimierung Es gibt Werkzeuge, die die Namen im Programm durch Abkürzungen ersetzen. Dadurch wird der Speicherplatz reduziert, die Compilation wird schneller, und der Programmtext ist für andere nicht mehr so leicht zu entschlüsseln. Zum Beispiel könnte der Name ErstesMIDlet durch a1 ersetzt werden usw. So ein Werkzeug heißt auf Englisch »Obfuscator« von »to obfuscate« (dt. verdunkeln, verwirren). Ein Open Source Obfuscator ist unter [Prog] zu finden. Nach dem Entpacken der heruntergeladenen Datei wird die Datei proguard.jar in das bin-Verzeichnis des WTK kopiert und steht damit dem WTK zur Verfügung. Zum Packen wird im WTK nun generell »Project« → »Package« → »Create Obfuscated Package« (statt »Create Package«) in der obersten Menüzeile aufgerufen. Wenn Namen verändert werden, könnte ein Problem auftreten, wenn Klassen dynamisch mit Class.forName() geladen werden sollen. Das wird im WTK verhindert, indem der Obfuscator mit der Option 2 Die erste Zeile erstreckt sich nur aus Layout-Gründen über zwei Zeilen. 2.3 Simulation der Luftschnittstelle 27 -keep public class * extends javax.microedition.midlet.MIDlet aufgerufen wird. Bedeutung dieser keep-Option: Alle public-Klassennamen sowie der Name der Oberklasse javax.microedition.midlet.MIDlet sollen nicht vom Obfuscator durch andere Namen ersetzt werden. Die Option ist im WTK voreingestellt. Auf Seite 24 wird gezeigt, wie das Programm mit dem »Run«-Knopf des WTK gestartet wird. Dabei sind nur die class-Dateien beteiligt. Im folgenden Abschnitt 2.3 wird die Simulation der Luftschnittstelle gezeigt, die die gepackte jar-Datei verwendet. 2.3 Simulation der Luftschnittstelle Im Abschnitt 17.2 wird auf Einrichtung und Benutzung eines vom WTK unabhängigen Web-Servers für Zugriffe eingegangen. Bis dahin, und natürlich erst recht hier im Kapitel »Erste Schritte«, wird mit dem WTK-Emulator gearbeitet, der die Over the Air-Simulation mit einem internen Web-Server des WTKs erlaubt. »Over the Air« (OTA), deutsch etwa »durch die Luft«, meint eine Funkverbindung. Die Auswahl in der obersten Menüzeile »Project« → »Run via OTA« ergibt den Begrüßungsbildschirm (Abbildung 2.3, links). Wenn dort »Apps« und dann »Menu« mit dem Softkey angeklickt wird, zeigt sich (Abbildung 2.3, rechts) die Auswahl 1 (Launch) und 2 (About). Abbildung 2.3: Begrüßungsbildschirm der OTA-Simulation und Auswahl Die Wahl von »Launch« durch Klicken der 1 zeigt einen vorbereiteten URI (Uniform Resource Identifier, siehe Abbildung 2.4)3 an, der mit den Tasten editiert werden kann. Im Beispiel wird er unverändert gelassen. Dieser URI ist die Adresse des im WTK eingebauten Web-Servers und zeigt auf die im bin-Verzeichnis des 3 Zu den Begriffen URI, URL und URN siehe die Einträge im Glossar Seite 392. 28 2 Erste Schritte Projekts angelegte Datei Projekt0.html, die nur einen Verweis auf Projekt0.jad enthält. Anklicken von »Menu« liefert die Auswahl 1 (Go) und 2 (Save). Auf einem Handy kann das Bild je nach Hersteller ganz anders aussehen. Es kann auch sein, dass das Menu erst über die Betätigung eines Softkeys »Optionen« sichtbar wird. Abbildung 2.4: URI Die Wahl von 1 (Go) simuliert die Verbindung und das Laden der Datei Projekt0.jad, deren Namen im Schirm angezeigt wird. Die Wahl des Softkeys »Install« zeigt einen Informationsbildschirm, auf dem auch die Größe der Anwendung angezeigt wird, an und fragt, ob die Installation fortgesetzt werden soll (Abbildung 2.5). Abbildung 2.5: Informationen aus der jad-Datei »Install« lädt und verifiziert den geladenen Code. Danach wird das Projekt0 zur Auswahl angeboten. Klicken von »Menu« 1 (=Launch) startet die Anwendung, sodass sich dasselbe Bild wie Abb. 2.2 auf Seite 25 ergibt. Die Simulation ist beendet! 2.4 Installation auf einem Gerät 2.4 29 Installation auf einem Gerät Es gibt verschiedene Wege, ein Programm auf einem mobilen Endgerät zu installieren: • Übertragung durch die Luft. Das Programm wird auf einen Web-Server gespielt. Von da aus kann es mit dem Browser des Endgeräts heruntergeladen und installiert werden. Dieser Prozess benutzt eine Funkverbindung, also die so genannte Luftschnittstelle, englisch »over the air« oder kurz OTA genannt. Die Abbildung 2.6 zeigt den Ablauf von der Entwicklung bis zur Nutzung. Entwicklung Nutzung Ergebnis: Editieren URL wählen .java Download .jad javac .class preverify Luftschnittstelle (Funk) Download .jar .class jar Mobilfunkanbieter Installieren und verifizieren .jar .jad run (KVM) obfuscate .jar .jad auf Web-Server bringen Internet Abbildung 2.6: Ablauf von der Entwicklung bis zur Nutzung 30 2 Erste Schritte • Direkte Übertragung vom PC. Direkte Übertragung kann im Wesentlichen auf zwei Arten geschehen: drahtlos über eine Infrarotschnittstelle oder Bluetooth, oder über ein USB-Kabel. Bei der Übertragung benutzt man am besten die für das Gerät vorgesehene Software des Herstellers, die allerdings im Allgemeinen nur für das WindowsBetriebssystem geliefert wird. Leider ist das Vorgehen zur direkten Übertragung sehr herstellerspezifisch, sodass keine generelle Vorgehensweise beschrieben werden kann. Aus diesem Grund sei wenigstens ein konkretes Beispiel4 gezeigt. Software-Installation über ein USB-Kabel Zur Installation von Software über ein USB-Kabel werden Handy und USBSchnittstelle des PC mit dem Kabel verbunden. Anschließend sind nur noch wenige Schritte zu tun: 1. Die Frage auf dem Bildschirm des Handys »Telefon als Speichergerät verwenden?« wird verneint. 2. »PC Suite« des Herstellers (nur für Windows erhältlich) aufrufen und dort »Anwendungen installieren« anklicken (siehe Abbildung 2.7). Abbildung 2.7: Software-Installation auf dem Handy 4 Das Vorhandensein eines Firmennamens in einem Bild oder im Text ist weder als Empfehlung noch als Ablehnung des Herstellers zu verstehen. Die Autoren haben keinerlei Geschäftsbeziehung zu einem der Hersteller mobiler Endgeräte. 2.5 Hinter den Kulissen 31 Im erscheinenden Fenster wird links die zu installierende jar-Datei ausgewählt. Ein Klick auf den großen Pfeil in der Mitte bewirkt die Installation. Eine Installation über die Bluetooth-Schnittstelle ist mit der PC-Suite ebenfalls möglich und in der Dokumentation zur Software beschrieben. 2.5 Hinter den Kulissen Natürlich braucht man nicht zwingend das Sun WTK zur Entwicklung von MIDlets. Andere Werkzeuge wie Eclipse werden im Kapitel 17 vorgestellt. Hier wird gezeigt, was das Sun WTK eigentlich tut, indem alle oben beschriebenen Schritte als Kommandozeilenbefehle gezeigt werden – schließlich macht das WTK nichts anderes, als im Hintergrund diese Befehle abzusetzen und die BildschirmausgaBitte be umzuleiten. Im Folgenden wird davon ausgegangen, dass alle Kommandos im beachten! Verzeichnis des Projekts ausgeführt werden und dass das Projektverzeichnis im Verzeichnis wtkapps des Sun WTK liegt. Wenn das nicht der Fall ist, müssen die Kommandos entsprechend angepasst werden. Übersetzen Ein Klick auf die Schaltfläche »Build« des Sun WTK sorgt für die Einbindung der richtigen Bibliotheken und ist letztlich nichts anderes, als wenn im Verzeichnis Projekt0 in einer Shell (Linux) bzw. Eingabeaufforderung (Windows) das folgende Kommando eingegeben würde, allerdings in einer Zeile statt der hier aus LayoutGründen gezeigten drei: javac -bootclasspath ../../lib/cldcapi10.jar; ../../lib/midpapi20.jar -d tmpclasses -source 1.3 -target 1.1 src/de/java_me/beispiele/Projekt0/ErstesMIDlet.java Das Verzeichnis tmpclasses muss existieren und ggf. vorher angelegt werden, wie auch die Verzeichnisse classes und bin, die weiter unten benötigt werden. Die Option -source 1.3 besagt, dass der Quellcode als Java 1.3-Code aufzufassen ist. Option -target 1.1 weist den Compiler an, Bytecode für eine Java 1.1-Virtual Machine, wie sie oft in Handys vorhanden ist, zu erzeugen. Java 1.4 oder höher wird von den VM derzeit nicht unterstützt. -source 1.4 verbietet sich, weil es automatisch -target 1.4 impliziert. Die Option -bootclasspath lädt in diesem Beispiel die Bibliotheken der Konfiguration CLDC (Connected Limited Device Configuration) der Version 1.0 und das MIDP (Mobile Information Device Profile) der Version 2.0. Verifizieren Das Programm preverify wird aus dem Projekt-Verzeichnis über die folgende Kommandozeile aufgerufen: