samedi 10 avril 2010

iPhone vs Android

Astazi, piata SmartPhone-urilor este dominata de RIM(Research In Motion) Blackberry, Apple iPhone, Google Android si ceilalti producatori de terminale (Nokia, LG, Samsung, etc.) mobile ce contin Symbian.
Conform analizelor facute pe ultimii doi ani, desi Android se afla pe locul 5 in utilizare, cei de la Google isi propun sa urce in clasament (Figura 2). Se observa ca piata Smartphone-urilor este inca dominata de Symbian si RIM. Mai mult de 90% din companii ce au publicat aplicatiile lor au fost pe Apple App Store. Deci, modelul economic iPhone este mult mai interesant pentru editorii de programe Smartphone. Inconvenientul este ca se utilizeaza in acest caz o singura platforma ce ruleaza aceste aplicatii. In schimb Android si cei de la RIM pregatesc strategii pentru modelele lor economice de tip multi-platforme. Pentru a intra pe piata si a supravietui este necesar sa se selecteze bine modelul de magazin de aplicatii si tipul de tehnologie pentru platforme. Android are un avantaj, ca si Linux, de a fi OpenSource. Sunt publicate pe Internet sursele sistemului de operare, a middleware-ului si ale aplicatiilor cheie. Chiar daca SO care merge pe iPhone este un SO proprietar Apple, daca ne uitam amanuntit in interiorul lui, acesta este un Linux pentru sisteme imbarcate. Pentru a dezvolta si accede la o parte din cod, Apple propune iPhone Developer Program ce costa intre $99 si $299 pe an. Cei care adera la acest program pot vinde sau/si furniza liber aplicatii utilizand App Store. Aplicatiile sunt validate de Apple inainte de a fi disponibile in App Store. In schimb pentru editorii de programe in Android pot publica pe Android Market, aplicatiile lor. Pentru a publica aplicatiile pe Android Market este necesara o inregistrare si o taxa de $25. In momentul de fata numai editorii de aplicatii din sapte tari pot vinde aplicatii.In ambele cazuri, utilizatorii isi pot alege aplicatiile utilizand App Store respectiv Android Market. Spre deosebire de Android, iPhone poate descarca aplicatiile direct de pe App Store sau utilizand iTunes de pe un PC/Mac si apoi sicronizandu-l cu echipamentul.

Arhitectura celor doua platforme


Ambele platforme se bazeaza pe Linux. Filozofia celor de la Android este "full multitasking", pe cand cea a celor de la Apple este"single 3rd party application running". Din aceasta cauza nivelele arhitecturale difera. Imaginea urmatoare afiseaza majoritatea componentelor unui sistem de operare de tip Android.


Android este livrat cu un set de aplicatii standard cum ar fi clientul de email, SMS, calendar, harti, navigator, contacte si altele. Toate aplicatiile sunt scrise utilizand limbajul de programare Java.
Programatorii au acces la schema API-urilor utilizate de aplicatiile standard. Arhitectura aplicatiilor este conceputa in a simplifica reutilizarea componentelor de cod.
Android include un set de librarii C/C++ utilizate de diferite componente ale sistemului. Mai exista si un set de librarii ce sunt utilizate de masina virtuala Dalvik.
Kernel-ul este specific fiecarui echipament, deoarece contine drivere care difera de la un contructor la altul. Kernel-ul furnizeaza servicii cum ar fi gestiunea memoriei, gestiunea proceselor, stiva de retea, servicii de securitate si gestiunea perifericelor prin drivere. Kernel-ul se comporta ca un nivel abstract intre hardware si restul stivei de software.
La iPhone arhitectura software este tributara Cocoa. Cocoa este structurata in librarii, API-uri si software-uri ce formeaza un nivel de programare pentru toate aplicatiile Mac OS X.
Pentru iPhone exista o varianta Cocoa numita Cocoa Touch. In cazul iPhone multe functii cum ar fi gestionarea de ferestre, drag and drop, gestiunea mouse-ului, nu pot fi utilizate. Astfel versiunea Cocoa Touch este mult mai legera decat cea utilizata in Mac OS X. Nivelul Cocoa Touch se ocupa de tratarea si controlul evenimentelor tip multi-touch, creeaza alerte, utilizeaza selectorul de contacte/imagini (People/Image Picker), gestioneaza controlere de obiecte, afiseaza continuturile web (prin navigatorul Safari), utilizeaza/lucreaza cu senzorii iPhone (accelerometru, GPS, magnetometru).Nivelul Media contine interfete aplicative de programare (API) de tip C (limbajul C) cum ar fi Open GL ES, Core Audio, Quartz(2D), PDF, JPG, PNG, TIFF, Video Playback, Audio Mixing, Audio Recording, Core Animation.
Sistemul fundamental de servicii al SO este furnizat pentru toate aplicatiile de niv elul Core Services. Chiar daca nu sunt utilizate in mod direct foarte multe parti din aplicatii se bazeaza pe aceste servicii.Core OS este chiar kernel-ul. La acest nivel sunt interfete C ce furnizeaza obiecte abstracte pentru a lucra cu protocoale de retea, de a comunica cu accesoriile hardware ale iPhone-ului, de a garanta securitatea datelor.

Arhitectura unei aplicatii


Arhitectura unei aplicatii difera intre iPhone si Android. Aplicatiile in Android sunt scrise in Java iar cele in iPhone sunt scrise in Object-C. La sistemul Android fiecare aplicatie ruleaza propriul ei proces Linux. Fiecare proces are propria lui masina virtuala, astfel incat codul poate rula izolat fata de celelalte coduri ale altor aplicatii. Daca privim aplicatia ca o cutie neagra, in Android nu exista o singura intrare (nu exista functia main() spre exemplu). Mai curand, aplicatiile de tip Android au componente esentiale ce sistemul le poate instantia si rula la cerere. Exista patru componente ce pot fi instantiate de catre aplicatii: cele legate de activitatea aplicatiei (activity), serviciile oferite (service), furnizarea continutului de date (content providers) si difuzarea de informatii receptorilor (broadcast receivers).
Spre exemplu, daca una din aplicatii are nevoie pentru a afisa o lista de imagini de un meniu de defilare si o alta aplicatie contine un tip de meniu de defilare si il furnizeaza pentru celelalte aplicatii, atunci, se poate prelua acesta fara a crea un altul nou. Aplicatia nu include codul celeilalte aplicatii cau o legatura spre el. Mai degraba aplicatia lanseaza acea parte de cod a celeilalte aplicatii cand va avea nevoie. Putem spune ca v-a "imprumuta" pentru o perioada scurta de timp si spatiu memorie meniul de defilare, de fiecare data cand este nevoie.
Android este mult mai flexibil cand este vorba de modelele de proiectare. Modele de proiectare cum ar fi MVC (Model-View-Controller) sau Null pot fi aplicate in creearea de aplicatii.

La sistemul iPhone aplicatiile ruleaza secvential. Nu exista aplicatii multi-proces si nu pot rula mai multe aplicatii in paralel ca in Android. Daca aplicatia este in curs de derulare ea poate fi intrerupta de primirea unui apel telefonic, SMS sau eveniment din calendar. Aceste aplicatii care pot intrerupe o alta aplicatie in curs de derulare sunt aplicatii critice. Cand utilizatorul basculeaza spre o alta aplicatie cea din urma inceteaza sa mai ruleze (nu ruleaza in background). La iPhone, aplicatiile au functia main(). Cand o aplicatie este pornita de catre un utilizator, pe toata perioada sa de functionare pana la exit, este gestionata prin cadrul UIKit ce contine toate functiile cheie ale unei aplicatii. UIKit furnizeaza obiectele cheie pentru a rula o aplicatie si a coordona interactiunile dintre intrarile utilizatorului si afisarea continuturilor pe ecran. Proiectarea cadrului UIKit include cateva "design patterns"-uri care le gasim si la aplicatiile Cocoa traditionale. Cel mai utilizat model de proiectare (design pattern) este cel de tip MVC (Model-View-Controller). Portiunea model gestioneaza datele aplicatiei si starea lor. Portiunea "view" prezinta modelul utilizatorului printr-o interfata apropriata. Portiunea "controller" se comporta ca o legatura intre model si "view si facilizeaza "updates"-urile intre cele doua portiuni. Mai exista un model de proiectare prin delegare. Acest mod de proiectare modifica obiectele complexe fara a fi sub-clasate.

Ciclul de viata al unei aplicatii

Ciclul de viata al unei aplicatii este constituit din secvente de evenimente ce apar pe durata intre lansarii aplicatiei si terminarea ei. La iPhone, utilizatorul lanseaza aplicatia prin apasarea cu degetul a icoanei aflate pe ecran (Home screen). La foarte putin timp dupa aceea, sistemul afiseaza imagini de tranzitie si procedeaza la lansarea aplicatiei apeland functia main(). Din acest moment, cea mai mare parte a procedurii de initializare este preluata de UIKit, care incarca interfata aplicatiei utilizatorului si pregateste bu cla de evenimente. In timpul rularii buclei de evenimente, UIKit coordoneaza evenimentele furnizate te obiectele personalizate si raspunde comenzilor emise de aplicatie.


Această diagramă din figura de mai sus, arată succesiunea de evenimente care au loc din momentul în care începe aplicatia si până la momentul în care se închide. La initializare si terminare a aplicatiei, UIKit emite mesaje specifice obiectelor delegate aplicatiei pentru a se informa despre starea lor. In timpul buclei de evenimente, UIKit distribuie evenimente catre operatorii personalizati de evenimente ai aplicatiei.
Cum am vazut deja, in Android, aplicatiile ruleaza ca procese Linux separate. Astfel ciclul de viata al unei aplicatii este raportat la ciclul de viata a procesului. Ciclul de viat a al unui proces-aplicatie este gestionat de sistem in functie de starea memoriei aparatului. In cazul unei congestii de memorie, sistemul Android elimina procesele mai putin importante. Gradul de importanta a unui proces este decis in functie de starea proceselor componente. Exista mai multe tipuri de procese: procese de prim-plan, procese vizi bile, procese de servicii, procese de fundal si procese goale. In figura de mai jos sunt infatisate cateva metode apelate in timpul ciclului de viata de o activitate. Acestea sunt: onCreate, onStart, Process-specific events, onStop, onDestroy.
Urmand aceeasi logica pentru alte cicluri de viata ale aplicatiilor, o aplicatie Android este creata, procesele sunt pornite, evenimentele sunt eliminate, procesele sunt oprite si aplicatia este distrusa. Totusi sunt cateva diferente de la aplicatie la aplicatie.

Interfata grafica a utilizatorului


Interfata grafica a lui iPhone este compusa dintr-un set de ecrane proiectate pentru tehnologia touch. Elementele GUI a iPhone include vederi si mecanisme de control. Vederile furnizeaza practic intrerfata grafica, culorile, formele. Mecanismele de control au grija sa raspunda la actiunile utilzatorilor (adica la apasarea ecranului spre exemplu). Anatomia unui mecanism de control a interfetei grafice este prezentat in figura de mai jos.


Interfata grafica a Android este compusa si ea din mai multe ecrane. Aceste ecrane sunt dispuse intr-o ierarhie, ca de altfel si obectele ce le contin. Fata de interfata iPhone, cea Android are o multime de widgets-uri, obiecte grafice ce pot construi un ecran/fereastra.

Utilitare pentru dezvoltare de aplicatii


Pentru dezvoltare de aplicatii pe iPhone, Apple furnizeaza un utilitar numit Xcode. Xcode este un mediu de dezvoltare integrat (IDE), care oferă toate instrumentele de care este nevoie pentru a crea şi de a gestiona proiectele de aplicatii iPhone şi fişierele sursă. Xcode poate construi codul într-un executabil, şi a-l rula şi depana, fie în simulatorul de iPhone, fie direct pe un dispozitiv.


Pentru a crea o noua aplicatie iPhone, trebuie sa se inceapa mai intai prin crearea unui nou proiect în Xcode. Un proiect gestionează toate informaţiile asociate cu aplicaţia iPhone, adica, fişierele sursă, construirea de setări, regulile necesare pentru a asambla toate informatiile legate de aplicatie. Centrul fiecarui proiect Xcode este fereastra proiectului, se arată în figura 1. Această fereastră oferă acces rapid la toate elementele cheie ale candidaturii dumneavoastră. Grupuri şi lista Fişiere este locul unde să vă gestionaţi fişiere în proiectul dumneavoastră, inclusiv fişierele sursă şi construi obiective pe care sunt create din aceste fişiere sursă. Bara de instrumente oferă acces la instrumente şi comenzi utilizate în mod obişnuit, în timp ce panoul de detalii oferă un spaţiu de configurabil pentru a lucra la proiectul dumneavoastra. Alte aspecte ale fereastra proiectului va oferi informaţii contextuale despre proiect.