Leseprobe - beck

Werbung
Java ME
Anwendungsentwicklung für Handys, PDA und Co.
von
Ulrich Breymann, Heiko Mosemann
2., aktualisierte und erweiterte Auflage
Hanser München 2008
Verlag C.H. Beck im Internet:
www.beck.de
ISBN 978 3 446 41376 4
Zu Inhaltsverzeichnis
schnell und portofrei erhältlich bei beck-shop.de DIE FACHBUCHHANDLUNG
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
Herunterladen