550 likes | 686 Views
Symbian alapú szoftverfejlesztés. ELTE PSZT – 2008. november. Symbian operációs rendszer. SIBO – Psion Computers (1980) EPOC - irodai kisszámítógép (1980-1998) Symbian OS – (alapítva 1998 : Nokia, Motorola, Psion, Ericsson, 2002: Sony-Ericssson , Siemens)
E N D
Symbian alapú szoftverfejlesztés ELTE PSZT – 2008. november
Symbian operációs rendszer • SIBO – Psion Computers (1980) • EPOC - irodai kisszámítógép (1980-1998) • Symbian OS – (alapítva 1998 : Nokia, Motorola, Psion, Ericsson, 2002: Sony-Ericssson, Siemens) • Mérföldkő: 2000-ben megjelent 6.0-ás verzió
Segédanyagok • www.symbian.com/books • www.symbian.com/developer • www.symbian.developer/public/index.html • http://forum.nokia.com/main.html • SDK online dokumentáció:C:\S60\devices\S60_3rd_FP2_SDK_v1.1\docs\eclipse.exe
Okos telefonok • erős processzor • nagyméretű kijelző • viszonylag nagy memória • információ kezelő programok • egyéni alkalmazások • egyszerű kezelhetőség • megbízhatóság • erőforrásaival nem pazarló (memória, szolgáltatások, energia fogyasztás) • gyors reakcióidő • folyamatos üzemmód
Elvárosok • megbízható • nincs adatvesztés • nem dobja el a vonalat • optimális a memória felhasználás • nincs memória szivárgás • minden hibát „értelmesen” kezel • nyitott a külső fejlesztések irányába
Symbian OS felépítése Felhasználói interfész szinkronizáció UI alkalmazás keretrendszer UI eszköz-készlet MIDP CLDC JVM Alkalmazás szintű szolgáltatások PIM Üzenet-kezelés Böngészés Adat- szinkron Java Operációs rendszer szolgáltatásai Általános szolgáltatások Kommunikációs szolgáltatások Grafikai szolgáltatások PC-s kapcsolat szolgáltatásai Alap-szolgáltatások Alacsonyszintű szolgáltatások Fájlszerver Kernel és hardware integráció Kernel szolgáltatások Eszközmeghajtók
A fejlesztés alapelemei • Symbian C++ sajátosságok • Elnevezési konvenciók • Kivétel- és memóriakezelés • Alaptípusok, sztringek, tömbök • ThinTemplate minta • Hibakezelés módja • Aszinkron kezelés (ActiveObject)
Symbian C++ sajátosságok • Nincs kivétel. Helyette: TRAP és User::Leave • Nincs RTTI (dinamikus castolás nem megengedett) • Kódolási minták a memóriaszivárgás kiszűrésére: kétfázisú konstrukció, CleanUpStack • Saját elnevezési konvenciók:nem a változó típusa, hanem szerepe szerint történik az elnevezés (T,C,R,M) • memóriakezelés segítése függvénynevekkel: prefixek, postfixek
Symbian C++ sajátosságok • Nincs STL, helyette saját generikus adatszerkezeteket használ • String helyett deszkriptorok • Többszálúság kezelése: ActiveObject, Thread • Template-ek használata: ThinTemplate
Elnevezési konvenciók • Általános szabályok • Osztályok (T,C,M,R) • Egyéb típusok • Változók • Metódusok • Osztálydeklarációk elhelyezkedése
Általános szabályokTípusok, változók, metódusok • Angol név, amerikai angol írásmód (Color, Colour) • Szavakat egybe írjuk, minden szót nagybetűvel kezdünk • Osztálynevek: főnevek; metódusnevek: igék • Név végén konvenció szerinti záróbetű (L, LC, LD)
T osztályok (Type) • Egyszerű típusok • Nem tárolnak heapen objektumokat • Nincs szükségük destruktorra (az alapértelmezett jó) • Másoló konstruktort és értékadó operátort is ritkán használ • Legtöbbször a stack-en foglal helyet Nem igényelnek destruktort, ezért nem probléma, ha nem kerül végrehajtásra (leavelés).
C osztályok (Class) • Bonyolultabb funkcionalitású osztályok • Ősosztálya a CBase • Virtuális destruktorral KELL rendelkeznie (memória felszabadítás) • Tagváltozók automatikusan kinullázódnak • Birtokolnak heapen tárolt objektumokat (memóriakezelés!) • Függvényhívásnál referenciaként, vagy pointerként adjuk át (nem igényelmásoló konstruktort vagy értékadó operátort)A destruktor hívását minden esetben biztosítani kell.
R osztályok (Resource) • Valamilyen szerves szerű program által biztosított erőforrásra tartalmaznak azonosítót. (Pl. az RFile osztály az RFS osztály erőforrását használja ) • „Azonosító” miatt helyet foglalhatnak a stack-en is • A felszabadítás az erőforrást birtokló objektum (szerver) dolga • Szál befejeződésekor automatikusan felszabadul • Foglalás: Open, Create, Allocate • Elengedés: Close, Destroy, Free
M osztályok (Mixin) • Interfész, absztrakt protokoll • C++: absztrakt osztályok • Csak virtuális metódusuk van, legtöbbször implementáció nélkül • Szigorú többszörös öröklődés: egy C osztály csak egy másik C osztályból és több M osztályból örökölhet (ugyanabból az M osztályból csak egyszer)
Osztálytípusok - összefoglalás • T: egyszerű típus; nincs destruktora; csak T-ből, vagy M-ből öröklődhet; értékként átadható; stack-en tárolható • C: csak a heapen foglalható; van destruktora; pontosan egy C és tetszőleges M osztályból származhat; nem adható át értékként • M: interfész; csak virtuális metódusok; nincsenek tagváltozók; nem példányosítható • R: erőforrás, melyet meg kell nyitni és be kell zárni
Kivételek, egyéb típusok • S: tagfüggvény nélküli struktúrák • Statikus osztályok: User, Math, Mem • H:HBufC • D: Kernel oldali osztályok • E:felorolások(enum) • K: Konstansok • i: tagváltozók (pl. iNum) • a: argumentumok (pl.: voidSetNumber (TIntaNumber);)
Metódusok • Lekérdező és beállító metódusok • iNum tagváltozóhoz Num() lekérdező SetNum() beállító metódus • Bonyolultabb lekérdezéshez GetNum(); • „Kilépő” metódusok („Leavelő”) • Azok a metódusok, amelyek közvetlenül vagy közvetve User::Leave hívást eredményezhetnek • Lehetséges végződések: L, LC, LD
Osztálydeklarációk - egyezmények • public, protected, private: mindig ki kell írni • Sorrend: tagfüggvények, tagváltozók • Metódusok argumentumait a deklarációban is ki kell írni • Az ősosztály virtuális metódusait külön csoportosítjuk, megjelölve, honnan öröklődtek • Ha sok inline függvény van, külön fájlba kell helyezni
Dinamikus objektumok - heap • Minden szál rendelkezik saját heap területtel • Symbian OS alatt a CBase osztályok példányait a heap-en helyezzük el • Az osztály adattagjai létrejöttükkor kinullázódnak • A virtuális destruktor biztosítja, hogy a felszabadítás helyesen megtörténjen
Kivételkezelés, memóriakezelés • Kivételkezelési konvenciók • CleanupStack • Kétfázisú konstruktor
Kivételkezelés • A Symbian elődjének fejlesztésekor a C++ fordítók nem ismerték a kivételkezelést • A C++ kivételek többlet memóriát és több számítást igényelnek • Symbian: egy-két konvenció kisebb erőforrás igény
Objektum létrehozása a heapen – példa Hiba esetén abbahagyja a végrehajtást.
Kivételkezelési konvenciók C++ Symbian • Throw • Catch • Függvénydeklaráció: Throw • new operátor: 0-t ad vissza • User::Leave • TRAP, TRAPD • záró L • new (ELeave): kivételt dob, ha nincs memória
Kivételkezelés C++-ban Ha kivételkezelés történik • A program stack visszafejtésre kerül a catch szintjéig • Az objektumok destruktorai meghívódnak • A mutatók „elvesznek” (esetleg smart pointert lehet használni)
Kivételkezelés C++-ban Ha kivételkezelés történik • A program stack visszafejtésre kerül a catch szintjéig • Az objektumok destruktorai meghívódnak • A mutatók „elvesznek” (esetleg smart pointert lehet használni)
Kivételkezelés C++-ban Ha kivételkezelés történik • A program stack visszafejtésre kerül a catch szintjéig • Az objektumok destruktorai meghívódnak • A mutatók „elvesznek” (esetleg smart pointert lehet használni)
Kivételkezelés C++-ban Ha kivételkezelés történik • A program stack visszafejtésre kerül a catch szintjéig • Az objektumok destruktorai meghívódnak • A mutatók „elvesznek” (esetleg smart pointert lehet használni)
Kivételkezelés C++-ban Ha kivételkezelés történik • A program stack visszafejtésre kerül a catch szintjéig • Az objektumok destruktorai meghívódnak • A mutatók „elvesznek” (esetleg smart pointert lehet használni)
Kivételkezelés C++-ban Ha kivételkezelés történik • A program stack visszafejtésre kerül a catch szintjéig • Az objektumok destruktorai meghívódnak • A mutatók „elvesznek” (esetleg smart pointert lehet használni) sizeof(Object) + sizeof(int) méretű memóriaszivárgás.
Symbian C++ hibakezelés Nincs C++ kivétel • Nincs veremvisszafejtés • Destruktorokat nem hívja meg • Egész számot lehet eldobni és elkapni
Hibakezelés - Leave • A Symbianbana hiba kezelésére a User könyvtár Leave metódusa szolgál. • Az olyan függvényeket, amelyek a User::Leave metódust hívják leave-elő függvényeknek nevezzük. • Minden leave-elő függvény neve L betűre végződik. • Mikor leave-elhet egy függvény? • Ha közvetlenül meghívja a User::Leave() függvényt • Heapen foglal helyet new (ELeave) metódussal • Más leave-elő függvényt hív.
Hibakezelés + Leave Leave kezelése TRAP segítségével. Több függvényhívás esetén mindegyiket bele kellene tenni egy TRAP konstrukcióba. A CleanupStack használata „egyszerűsíti” ezeket a függvényhívásokat.
CleanupStack Az x automatikus változó a heap-re mutat. Ha UseL() leave-el, akkor a delete nem hajtódik végre, a CX által lefoglalt terület „árván” marad. A UseL() függvény memóriát foglal és leave-elhet. A CX helyfoglalása után a rá mutató pointert elhelyezzük a CleannupStack-en Ha UseL() nem leave-el, akkor MI szedjük le a címet a stackről. Ha UseL() leave-el, akkor a Laeve kezelő eljárás.
CleanupStack alkalmazása Egyszerre több elemet is leemelhetünk a stackről. Tilos!! Pointert tartalmazó adattagot ne tegyünk a CleanupStack-re. Az általa mutatott terület felszabadítása az adattagot tartalmazó osztály feladata, nem a Leave-elő mechanizmusé. A PushL() nem leave-el (előrefoglalás miatt)
Kétfázisú konstrukció Probléma: A CY példányosításakor a CY konstruktora leave-el!
Kétfázisú konstrukció • A konstruktort két részre bontjuk: • 1. rész: Biztonságos, nem leave-elő a példányra mutató pointer biztosan felkerül a CleanupStack-re • 2. rész: A „veszélyesebb” leave-elő rész. De ekkor már jó helyen van a pointer.
Kétfázisú konstrukció A „két fázist” a NewL, NewLC függvényekbe „becsomagolják”.
Kétfázisú konstrukció - összefoglalás • Az osztály standard konstruktorában nem hívunk leave-elő kódot • A leave-elő hívásokat egy külön „második fázisú konstruktorba” tesszük. (ConstructL) • Az osztály példányosításakor: • Meghívjuk a standard konstruktort (new) • A „félig létrejött” objektumot feltesszük a CleanupStack-re • Meghívjuk a második fázisú konstruktort (ConstructL) • (Levesszük a CleanupStack-ről) A „két fázist” a NewL, NewLC függvényekbe „becsomagolják”.
Tagváltozók • Amikor egy osztály tagváltozót hozunk létre a heapen, akkor azt nem szabad feltenni a CleanupStack-re!! • Leave esetén meghívódik a gazda osztály destruktora és az törli a tagváltozót • Ha emellett a CleanupStack-en is fenn lenne a tagváltozó, akkor kétszer próbálná törölni, ami HIBA.
Hibák elleni védekezés • _ASSERT_ALWAYS • _ASSERT_DEBUG • User::Panic • _TEST_INVARIANT • _UHEAP_MARK, _UHEAP_MARKEND