Ulrich Breymann, Heiko Mosemann Java ME Anwendungsentwicklung für Handys, PDA und Co. ISBN-10: 3-446-41376-6 ISBN-13: 978-3-446-41376-4 Leseprobe Weitere Informationen oder Bestellungen unter http://www.hanser.de/978-3-446-41376-4 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 19 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 401 beschrieben. Diese Umgebungsvariable wird benötigt, wenn wir später einen Web-Server installieren (siehe unten, Abschnitt 19.2). 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 in diesem Abschnitt 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. 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 des WTK in Entwicklungsumgebungen wie Eclipse möglich. Abschnitt 19.4 im Kapitel über Werkzeuge beschreibt kurz und beispielhaft die Entwicklung mobiler Anwendungen mit NetBeans, das mit einem integrierten WTK erhältlich ist. 1 MAC-User bitten wir vorab um Entschuldigung! 22 2 Erste Schritte 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.beispiele.proj0; 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 Anweisungen werden auf nachfolgende Kapitel verschoben, um zunächst den großen Zusammenhang darzustellen. Das WTK bringt die Bibliothek javax.microedition mit, die im JDK nicht enthalten ist, sowie die zugehörige Dokumentation der APIs, siehe im Installationsverzeichnis 2.1 Das erste Programm 23 .../docs/api/midp/index.html. Im Beispielprogramm fällt auf, dass die sonst bei vielen Java-Programmen vorhandene Funktion main(String[]) fehlt – startApp() übernimmt stattdessen die Rolle zum Starten des Programms. 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). Natürlich kann auch unter Linux ein Symbol auf dem Desktop angelegt werden, dessen Anklicken das WTK startet. Abbildung 2.1 zeigt die nun folgenden, unten beschriebenen Bedienungsschritte. Die Einstellung JWTI oben genügt zunächst. Einstellungen Einstellungen Abbildung 2.1: Anlegen eines Projekts mit dem WTK 24 2 Erste Schritte Abbildung 2.2: Projektbeschreibung eingeben Im KToolbar-Fenster klicken wir nun auf »New Project«, wählen einen Projektnamen, zum Beispiel »Proj0«, und tragen den vollständigen Namen unserer erProj0 sten MIDlet-Klasse (de.java_me.beispiele.proj0.ErstesMIDlet einschließlich Package-Name) ein. Zu den anderen Projekteinstellungen siehe Abbildungen 2.1 und Abbildung 2.2. Nach Anklicken von »Optional« geben wir zunächst nur den beschreibenden Text »Mein erstes MIDlet!« ein und bestätigen mit OK. Die Datei ErstesMIDlet.java kopieren wir in das neu angelegte Verzeichnis C:\WTK\apps\Proj0\src\de\java_me\beispiele\proj0 (Windows) bzw. /home/user/wtk/apps/Proj0/src/de/java_me/beispiele/proj0 (Linux). Bitte auf Groß- und Schreibweise! Kleinschreibung achten! Der Projektname kann groß geschrieben werden. PackageNamen und auf diesen basierende Verzeichnisnamen werden im Allgemeinen klein geschrieben. → Beispiel Übersetzen und Verifizieren Mit »Clear Console« kann das Anzeigefeld gelöscht werden. 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 proj0 in einer Shell (Linux) bzw. Eingabeaufforderung (Windows) ein entsprechendes Kommando eingegeben würde. Wer Tipp 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 2.2 Installationsvorbereitungen 25 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.3 zeigt das Ergebnis. 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 Proj0.jar, Proj0.jad und MANIFEST.MF werden im Verzeichnis bin des Projekts abgelegt. Statt Proj0 ist der jeweilige Projektname einzusetzen, hier beziehen wir uns auf das obige Beispiel. Proj0.jar ist das ausführbare Java-Archiv, Proj0.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 Proj0.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 26 2 Erste Schritte Abbildung 2.3: Das erste MIDlet 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 Proj0.jad2 : MIDlet-1: Proj0, Proj0.png, de.java_me.beispiele.proj0.ErstesMIDlet MIDlet-Description: Mein erstes MIDlet! MIDlet-Jar-Size: 100 MIDlet-Jar-URL: Proj0.jar MIDlet-Name: Proj0 MIDlet-Vendor: Unknown MIDlet-Version: 1.0 MicroEdition-Configuration: CLDC-1.0 MicroEdition-Profile: MIDP-2.0 2 Die erste Zeile erstreckt sich nur aus Layout-Gründen über zwei Zeilen. 2.3 Simulation der Luftschnittstelle 27 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, verwirProguard ren). Ein Open Source Obfuscator ist unter [Prog] zu finden. Nach dem Entpacken installieren 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 verhindert, indem der Obfuscator mit der Option -keep public class * extends javax.microedition.midlet.MIDlet aufgerufen wird. Bedeutung der keep-Option: Alle public-Klassennamen sowie der Name der Oberklasse MIDlet sollen nicht vom Obfuscator durch andere Namen ersetzt werden. Die Option ist im WTK voreingestellt. Auf Seite 25 wird gezeigt, wie das Programm mit dem »Run«-Knopf des WTK gestartet wird. Dabei sind nur die class-Dateien beteiligt. In Abschnitt 2.3 wird die Simulation der Luftschnittstelle gezeigt, die die gepackte jar-Datei verwendet. 2.3 Simulation der Luftschnittstelle Im Abschnitt 19.1 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.4, links). Wenn dort »Apps« und dann »Menu« mit dem Softkey angeklickt wird, zeigt sich (Abbildung 2.4, rechts) die Auswahl 1 (Launch) und 2 (About). Die Wahl von »Launch« durch Klicken der 1 zeigt einen vorbereiteten URI (Uniform Resource Identifier, siehe Abbildung 2.5 links)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. 3 Zu den Begriffen URI, URL und URN siehe die Einträge im Glossar Seite 440. 28 2 Erste Schritte Abbildung 2.4: Begrüßungsbildschirm der OTA-Simulation und Auswahl Er zeigt auf die im bin-Verzeichnis des Projekts angelegte Datei Proj0.html, die nur einen Verweis auf Proj0.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.5: URI und jad-Datei Die Wahl von 1 (Go) simuliert die Verbindung und das Laden der Datei Proj0.jad, deren Namen 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 rechts). »Install« lädt und verifiziert den geladenen Code. Danach wird das Proj0 zur Auswahl angeboten. Klicken von »Menu« 1 (=Launch) startet die Anwendung, sodass sich dasselbe Bild wie Abb. 2.3 auf Seite 26 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 NetBeans werden im Kapitel 19 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 BildschirBitte mausgabe umzuleiten. Im Folgenden wird davon ausgegangen, dass alle Kombeachten! mandos im 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. Im Übrigen kann das vorgegebene Projektverzeichnis geändert werden. Dazu ist das Verzeichnis in die Datei [WTK-Verzeichnis]/wtklib/Windows/ktools.properties mit dem Schlüsselwort kvem.apps.dir: einzutragen, zum Beispiel kvem.apps.dir: E:\\jmebuch\\beispiele\\midlets (Windows) oder kvem.apps.dir: /home/user/jmebuch/beispiele/midlets (Linux). Der Backslash \ ist wie gezeigt doppelt anzugeben. Ü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 Proj0 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/Proj0/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. 32 2 Erste Schritte Verifizieren Das Programm preverify wird aus dem Projekt-Verzeichnis über die folgende Kommandozeile aufgerufen: ../../bin/preverify -classpath ../../lib/cldcapi10.jar; ../../lib/midpapi20.jar -d classes tmpclasses Auch hier handelt es sich um eine Zeile. In einem Windows-System sind die ersten drei Schrägstriche / jeweils durch einen Backslash \ zu ersetzen. Wenn geprüft werden soll, ob die Klassen der CLDC 1.0 genügen, ist die Option -cldc einzuschalten. Näheres zum Unterschied der Versionen siehe unten, Abschnitt 3.2. Packen Alternativ kann mit einem Shell-Kommando gepackt werden, genau wie man es bei der Java SE machen würde. Im Falle von im Verzeichnis res vorhandenen und einzubindenden Ressourcendateien müsste noch -C res . angehängt werden. jar cfm bin/Proj0.jar bin/MANIFEST.MF -C classes . Packen mit Obfuscator java -jar ../../bin/proguard.jar @Proj0.pro ist der Aufruf des Obfuscators im Projektverzeichnis mit einem Shell-Kommando. Dabei ist Proj0.pro die Datei mit den Optionen für den Obfuscator, die vom WTK angelegt wird. Es ist möglich, die in der Datei Proj.pro vorhandenen Optionen dem Kommando direkt mitzugeben, zum Beispiel (wiederum als eine Zeile zu lesen): java -jar ../../bin/proguard.jar -libraryjars ../../lib/cldcapi10.jar;../../lib/midpapi20.jar -injars bin/Proj0.jar -outjar /tmp/Proj0.jar -keep "public class * extends javax.microedition.midlet.MIDlet" Nach Start des Obfuscators aus der Shell ist die Datei /tmp/Proj0.jar in das Verzeichnis bin zu kopieren. Die Größenangabe in der Datei bin/Proj0.jad ist anzupassen. Programmstart Es ist möglich, das entsprechend dem vorhergehenden Abschnitt gepackte Programm direkt im Emulator laufen zu lassen, indem er direkt mit der beschreibenden jad-Datei als Parameter aufgerufen wird. In der Linux-Distribution des WTK liegt der Emulator als jar-Datei vor, in der Windows-Distribution als emulator.exe, weswegen sich die Aufrufe unterscheiden: Linux: java -jar ../../bin/emulator -Xdescriptor bin/Proj0.jad Windows: ..\..\bin\emulator -Xdescriptor bin/Proj0.jad