Symbian alap szoftverfejleszts ELTE PSZT 2008 november Symbian
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: S 60devicesS 60_3 rd_FP 2_SDK_v 1. 1docseclipse. exe
Online dokumentáció
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ó Alkalmazás szintű szolgáltatások Operációs rendszer szolgáltatásai UI alkalmazás keretrendszer PIM Általános szolgáltatások UI eszközkészlet Üzenetkezelés Böngészés Kommunikációs szolgáltatások MIDP CLDC Adatszinkron Grafikai szolgáltatások Alapszolgáltatások Alacsonyszintű szolgáltatások Fájlszerver Kernel és hardware integráció Kernel szolgáltatások Eszközmeghajtók JVM Java PC-s kapcsolat szolgáltatásai
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 �Thin. Template minta �Hibakezelés módja �Aszinkron kezelés (Active. Object)
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ó, Clean. Up. Stack �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: Active. Object, Thread �Template-ek használata: Thin. Template
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ályok Tí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).
T osztályok - példa
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
R osztályok - példa
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: HBuf. C �D: Kernel oldali osztályok �E: felorolások(enum) �K: Konstansok �i: tagváltozók (pl. i. Num) �a: argumentumok (pl. : void Set. Number (TInt a. Number); )
Metódusok �Lekérdező és beállító metódusok �i. Num tagváltozóhoz Num() lekérdező Set. Num() beállító metódus �Bonyolultabb lekérdezéshez Get. Num(); �„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
Kivételkezelés Memóriakezelés Hibakezelés
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 �Cleanup Stack �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 automatikus létrehozása a stack-en
Objektum létrehozása a heapen – példa Hiba esetén abbahagyja a végrehajtást.
Trap Harrness és Leave
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) int e float d Object c Object *b int *a Some. Thing ex
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) int e float d Object c Object *b int *a Some. Thing ex
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) float d Object c Object *b int *a Some. Thing ex
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) Object c : ~Object *b int *a Some. Thing ex
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) Object *b (Elveszett: sizeof(Object) leak) int *a Some. Thing ex
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) Object *b (Elveszett) int *a (Elveszett) Some. Thing ex 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 stack Cleanup. Stack int e float d Object c Object *b Object c c. Finalize() int *a Object *b delete b int ecod int *a free(a)
Hibakezelés - Leave � A Symbianban a 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 leaveelő 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 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 Cleanup. Stack használata „egyszerűsíti” ezeket a függvényhívásokat.
Cleanup. Stack Az x automatikus változó a heap-re mutat. Ha Use. L() leave-el, akkor a delete nem hajtódik végre, a CX által lefoglalt terület „árván” marad. A Use. L() függvény memóriát foglal és leave-elhet. A CX helyfoglalása után a rá mutató pointert elhelyezzük a Cleannup Stack-en Ha Use. L() nem leave-el, akkor MI szedjük le a címet a stackről. Ha Use. L() leave-el, akkor a Laeve kezelő eljárás.
Cleanup. Stack alkalmazása Egyszerre több elemet is leemelhetünk a stackről. Tilos!! A Push. L() nem leave-el (előrefoglalás miatt) Pointert tartalmazó adattagot ne tegyünk a Cleanup. Stack-re. Az általa mutatott terület felszabadítása az adattagot tartalmazó osztály feladata, nem a Leave-elő mechanizmusé.
Kétfázisú konstrukció
Kétfázisú konstrukció Probléma: A CY példányosításakor a CY konstruktora leave-el!
Kétfázisú konstrukció
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 Cleanup. Stack-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 New. L, New. LC 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. (Construct. L) � Az osztály példányosításakor: � Meghívjuk a standard konstruktort (new) � A „félig létrejött” objektumot feltesszük a Cleanup. Stack-re � Meghívjuk a második fázisú konstruktort (Construct. L) � (Levesszük a Cleanup. Stack-ről) A „két fázist” a New. L, New. LC 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 Cleanup. Stack-re!! �Leave esetén meghívódik a gazda osztály destruktora és az törli a tagváltozót �Ha emellett a Cleanup. Stack-en is fenn lenne a tagváltozó, akkor kétszer próbálná törölni, ami HIBA.
Kódhatékonyság. Thin. Template
Hibák elleni védekezés �_ASSERT_ALWAYS �_ASSERT_DEBUG �User: : Panic �_TEST_INVARIANT �_UHEAP_MARK, _UHEAP_MARKEND
Aszinkron szolgáltatások, Active. Object �Aszinkron események: billentyű lenyomás, i/o művelet befejeződése, időzítők jelzései, … �Lépések: Igény bejelentése várakozás az eseményre reagálás az eseményre �Active. Sheduler Active. Object Prioritás �Offer. Key. Event. L
Kliens-szerver keretrendszer �fájlszerver �ablakkezelő szerver �kommunikácó kezelés �adatbázis-kezelés �határidőnapló A CServer osztályból származnak.
Cleanup-safe Hello. World Konzolos alkalmazásnál a Cleanup. Stack-et nekünk kell létrehozni.
Fájlkezelés – console alkalmazás
Vége
- Slides: 55