Mobiltelefonapplikationer med J2ME: Lektion 3

Idag: Utvecklingsmiljö och kompilering.
  • Vad är en MIDlet?
  • Vilka steg ingår i att bygga en MIDlet?
  • Vi installerar de program som behövs: Java och WTK

Klicka på startknappen i den lilla mediespelaren ovan för att lyssna på lektionen. (Man kan behöva vänta en stund på att ljudfilen laddas ner.) Om mediespelaren inte syns, eller om det inte fungerar av något annat skäl, kan man klicka här för att ladda ner mp3-filen (ca 20 minuter, ca 9 megabyte). Beroende på hur webbläsaren är konfigurerad kan det kräva ett separat mp3-spelarprogram av något slag.

Tänk på att lektionerna ger en översikt och introduktion. Du måste läsa i kursboken och arbeta med övningarna för att tillgodogöra dig kursen!

"Bild" 1: Vad är en MIDlet?

Java-programmen i J2ME (Java 2 Mobile Edition) kallas MIDlet:ar. (Jämför: applet, servlet.)

  • MID = Mobile Information Device
  • MIDP = Mobile Information Device Profile

Bild 2: Att kompilera och köra ett vanligt Java-program

Hur man kompilerar och kör ett vanligt Java-program i J2SE (Java 2 Standard Edition). Det kan vara en Java-applikation (dvs ett fristående program) eller en applet.

När Java-maskinen ska köra ett Java-program, börjar den med att verifiera att den kompilerade koden inte bryter mot reglerna.

Hur man kompilerar och kör ett Java-program i J2SE

Bild 3: Att kompilera och köra en MIDlet

Att bygga en MIDlet är lite mer komplicerat. Det har tillkommit två steg:

Diagram som visar stegen för att bygga Java-program för J2ME

"Bild" 4: Steg 1 i utvecklingsprocessen - Källkoden

Att skriva källkod för J2ME är precis som all annan Java-programmering. Varje fil innehåller en klass vars namn är identiskt med filnamnet, inklusive stor och liten bokstav.

"Bild" 5: Steg 2 i utvecklingsprocessen - Kompileringen

"Korskompilering" = vi kompilerar för en annan miljö än på datorn med kompilatorn!

Java-kompilatorn (javac.exe) kräver parametern -bootclasspath för att ange var klassbiblioteken i kör-miljön (dvs MIDP) finns, till exempel java.lang-paketet.

WTK (eller en IDE) sköter dock detta automatiskt.

"Bild" 6: Steg 3 i utvecklingsprocessen - För-verifiering (pre-verification)

Verifierar att .class-filerna är korrekt uppbyggda och inte innehåller några konstigheter.

WTK (eller en IDE) sköter detta automatiskt.

"Bild" 7: Steg 4 i utvecklingsprocessen - Paketering

Lägger ihop alla klassfiler och resursfiler i en fil med filändelsen .jar. En jar-fil är egentligen bara en zip-fil och kan packas upp med exempelvis WinZIP eller WinRAR.

En jar-fil innehåller ett manifest (svenska: märkrulla, förteckning över lasten på ett fartyg) som beskriver innehållet i jar-filen.

En jar-fil kan också vara åtföljd av en jad-fil, som innehåller ungefär samma innehåll som manifestet i jar-filen. En jad-fil behövs om man t. ex. vill installera program via GPRS, men använder man t.ex. Nokias PC-suite behövs inte jad-filen.

"Bild" 8: Steg 5 i utvecklingsprocessen - Körning

En MIDlet kan man köra antingen på en telefon eller i en emulator på datorn. En emulator är ett program som emulerar, alltså låtsas vara, någonting annat. I vårat fall emulerar vår emulator olika typer av telefoner. Det man ser på datorskärmen ska likna det man får se på skärmen på telefonen.

En emulator behöver, till skillnad från en simulator, inte fungera exakt som hårdvaran den emulerar, därför är det viktigt att man provar sitt program på en riktig telefon med jämna mellanrum.

Det är dessutom skillnad mellan olika telefontillverkares implementationer av JVM:en och MIDP-api:et så prova på så många olika telefoner som möjligt.

En kommentar från Magnus Runesson, som arbetar med J2ME och är med under kursutvecklingen:

Du nämnde att det inte finns så många emulatorer att prova med. Jag vet inte exakt hur det ligger till med det men om man t.ex. laddar hem en SDK från Nokia för exempelvis 7710'an eller vilken telefon som helst så får man med en speciell emulator för just den enheten, komplett med en ny bild för telefonen som emulatorn ska representera. Jag skulle tro att det är i gurnden samma emulator som följer med WTK men den har skeppats med en speciell jar-fil för lite enhetsspecifika grejer, t.ex. Nokias egna API:er. Så om man inte är riktigt nöjd med det som följer med WTK'n kan man ladda hem en unik WTK från telefontillverkarens hemsida, så kanske man har tur och får en ny emulator och lite nya dokument osv. Tänkte att det kunde vara bra att veta.

"Bild" 9: Program som vi ska installera

  • J2SE SDK
    En generell Java-SDK (Software Development Kit). Återanvänd samma som användes i grundkursen i Java, eller installera en nyare version. Innehåller bland annat JRE (Java Runtime Environment) och en kompilator.
  • Sun Java Wireless Toolkit 2.3
    Program som behövs för att förverifiera, paketera samt testa MIDlet:ar.
    • Kursboken beskriver version 2.2.
    • Version 2.3 finns för tillfället bara som beta, och bara för Windows. Fungerar likadant, men innehåller några lite nyare tekniker.
  • Valfri texteditor
    Det går bra med vilken editor som helst som du känner dig bekväm med, exempelvis TextPad som ni använde i förra kursen.

"Bild" 10: Installation av J2E SDK

Om ni har kvar J2SE-SDK:n från förra kursen kan ni hoppa över detta steg. Annars kan ni hämta SDK:n från http://java.sun.com/j2se/1.5.0/download.jsp och installera som vanligt.

Man bör komma ihåg vilken katalog som man väljer att installera SDK:n i. Eventuellt kan man även behöva ange sökvägen när man sen installera Sun Java Wireless Toolkit, så kom ihåg den. Mer utförliga installationsanvisningar finns att läsa på http://java.sun.com/j2se/1.5.0/install-windows.html.

Ett tillägg våren 2007 (inte med på ljudspåret):

Det har kommit senare versioner efter J2SE 1.5.0, och dessutom har Sun slutat prata om "Java 2" och säger nu bara "Java". Därför kallas "J2SE" nu för "Java SE". Dessutom säger man inte längre "SDK" (Software Development Kit) utan "JDK" (Java Development Kit).

Den senaste versionen av JDK heter numera "Java(TM) SE Development Kit 6" eller bara "JDK 6". Den kan laddas ner från http://java.sun.com/javase/downloads/index.jsp, och finns (bland annat) både för Windows och Linux.

Bild 11: Installation av Sun Java Wireless Toolkit

Hämta från http://java.sun.com/products/sjwtoolkit/download-2_3.html och följ anvisningarna under installationen. Installationsprogrammet kommer att behöva ha sökvägen till en J2SE SDK, och kommer göra ett försök att hitta den själv men den kan eventuellt behöva hjälp på traven.

Här lyckades installationsprogrammet hitta en J2SE SDK, som synes.

Notera att installationen måste ha katalogen till en J2SE SDK, inte JRE (J2SE Runtime Environment). Om man bara ger sökvägen till en JRE kan man bara provköra MIDletar, inte utveckla dem.

Skärmdump som visar installationsprogrammet som har hittat en J2SDK

Ett tillägg våren 2007 (inte med på ljudspåret):

Man kan fortfarande ladda ner och använda WTK 2.3, men det har kommit en nyare version, WTK 2.5 (version beta 2, och bara för Windows). Den kan laddas ner från http://java.sun.com/products/sjwtoolkit/download-2_5.html.

Jag har ännu inte provkört alla exempel, men 2.5 verkar fungera som 2.3. Exemplen i fortsättningen är gjorda med 2.3, men 2.5 ser ungefär likadan ut, och det är den jag rekommenderar att man använder.

Bild 12: Installationen, igen

Förra bilden är från en installation på en svensk Windows XP. Bara för att visa att det fungerar på en engelsk Windows 2000 också:

WTK

Bild 13: Installationen av Sun Java Wireless Toolkit fortsätter

Installationsprogrammet kommer sedan att fråga efter den katalog där WTK ska installeras.

Kom ihåg denna katalog, för där kommer alla projekt att finnas!

Skärmdump som visar installationsprogrammet när man får välja var man vill installera WTK:n

Bild 14: Brandväggen i Windows XP

Om du använder Windows XP. och har aktiverat den inbyggda brandväggen, kommer du att få en fråga när WTK startas för första gången, nämligen om du vill fortsätta att blockera programmet.

Vi litar på Sun och tillåter deras grejer koppla upp sig mot nätet om det skulle behövas.

Skärmdump som visar Microsofts brandvägg som frågar om man vill blockera programmet

"Bild" 15: Installation av någon texteditor

Vi ska skriva programmen i en vanlig texteditor. Använd vilken som helst, i värsta fall Notepad.

Annars kan man ladda ner Textpad från http://www.textpad.com/download/. Installationsprocessen är inte så klurig så den klarar ni nog utan assistans.

Bild 16: Att starta WTK

Starta WTK. Själva programmet heter KToolbar.

WTK

Bild 17: WTK-fönstret

WTK-fönstret: Några knappar och ett fönster för informations- och felmeddelanden. Man kan skapa projekt.

WTK

Bild 18: Att skapa ett projekt i WTK

Man får ange namn på projektet och MIDlet-klassen.

WTK

Bild 19: Projektinställningar i WTK

Notera att man kan lägga till API:er.

WTK

Bild 20: Projektets källkodskatalog

Om man installerat WTK i till exempel C:\WTK23, och ens projekt heter till exempel Tompa-Test-1, så hamnar projektets källkodsfiler i katalogen C:\WTK23\apps\Tompa-Test-1\src.

På ett Linux-system blir det (till exempel) /usr/local/java/installation/WTK2.2/apps/Tompa-Test-1/src.

WTK

Bild 21: Texteditor och källkod

Skriv in källkoden med en vanlig texteditor. Här använder jag WordPad.

Källkoden finns i boken, men ladda hellre ner den från bokens webbplats, som finns på http://www.apress.com/. (Direktlänk http://www.apress.com/ApressCorporate/supplement/1/426/1590594797-2644.zip, men såna har en tendens att ändras ibland.)

Vi ska studera detaljerna i hur man skriver en MIDlet-klass senare.

WTK

Bild 22: Kompilera och kör

Klicka på Build för att bygga projektet. Klicka på Run för att köra.

Kompilering, för-verifiering och paketering görs automatiskt.

WTK

Bild 23: Emulatorn

En av flera emulatorer: DefaultColorPhone.

WTK

Bild 24: En annan emulator

Det finns flera olika emulatorer att välja mellan, för att efterlikna olika typer av mobiltelefoner. Här är en annan, QwertyDevice:

WTK

"Bild" 25: Obfuscation

Engelska obfuscate = svenska fördunkla, göra obegripligt

En class-fil innehåller inte bara själva koden utan även fullständiga klass-, variabel- och metodnamn i klartext. Dessa kan man förvränga och minimera med hjälp av "obfuscation". Varför? Jo:
  • Det blir svårare för en utomstående att komma åt koden i dina klasser
  • Den kompilerade koden blir betydligt mindre vilket betyder att även MIDlet:ens jar-fil blir mindre

Ett bekymmer med att förvränga sina namn är när man har en klass eller metod som måste behålla sitt ursprungliga namn. Ett exempel är notifyIncomingMessage, en metod i din kod som anropas av JVM:en när programmet tar emot ett SMS. När ett SMS anländer till din telefon kommer JVM:en leta i sin lista över metoder efter den som heter notifyIncomingMessage, men eftersom obfuscatorn har bytt namn på metoden till t. ex. a, så kan inte JVM:en hitta rätt och programmet visar ett felmeddelande. Andra metoder som fungerar likadant är startApp och destroyApp men eftersom de är så vanliga så förvrängs inte de som standard.

Bild 26: WTK 2.2 på Linux

WTK 2.3 finns än så länge bara som en beta-version för Windows. WTK 2.2 fungerar dock på Linux. (Men Sun har klantat sig lite med hur installationen sker. Installera som användaren!)

WTK

Bild 27: Emulatorn i WTK 2.2 på Linux

Jargoneer-applikationen från boken fungerar bra i WTK 2.2:

WTK

Ett tillägg våren 2007 (inte med på ljudspåret):

Som ett alternativ till Suns WTK kan man prova öppen-källkods-alternativet MicroEmulator 2.0. Den är byggd helt i Java, och fungerar därför både på Linux och Windows. Den både startar och kör mycket snabbare än WTK.

Om man har installerat Java så man kan köra Java-applets i sin webbläsare, kan man till exempel provköra mobil-webbläsaren Opera Mini i MicroEmulator här: http://www.operamini.com/features/simulator/

Läsanvisningar

Den här lektionen motsvaras av kapitel 2, Building MIDlets, i kursboken. Avsnitten Tour of MIDP Features och Using Ant kan hoppas över.

Det är själva provkörandet av MIDlet:en, så man kommer igång med utvecklingsmiljön, som är det viktiga här, men det finns också några frågor som kan användas som instuderingsfrågor:

  1. Vad är en referensimplementation?
  2. Det finns en referensimplementation från Sun av MIDP. Varför använder vi inte den i den här kursen?
  3. I boken står om Suns J2ME Wireless Toolkit. I version 2.3 har de ändrat lite på namnet. Vad heter det nu?
  4. Måste man använda detta toolkit från Sun (eller referensimplementation), eller finns det fler alternativ? Nämn några!
  5. Jargoneer-exemplets källkod finns på sidan 13-15 i kursboken. Titta lite på Jargoneer-klassens konstruktor, och försök räkna ut vad den gör.
  6. Vad innebär förverifiering eller preverifiering, och varför har man infört detta krångel?
  7. Vilka säkerhetsrisker finns med preverifiering?
  8. Vad är en "mjuk knapp" (engelska: soft button)?
  9. När ska obfuskeringen ske: (Svaren på dessa tre frågor är egentligen ganska självklara. Förklara varför de är självklara!)
Om du vill skriva svar på instuderingsfrågorna, räcker det för de flesta frågorna med en eller några få meningar.

Programmeringsövningar

Föregående lektion | Lektionslista | Nästa lektion


Thomas Padron-McCarthy (Thomas.Padron-McCarthy@tech.oru.se), 13 januari 2007

Den här lektionen är utvecklad av Thomas Padron-McCarthy i samarbete med Magnus Runesson