Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
laboratoare:laborator01 [2016/02/26 05:01] Andrei Roșu-Cojocaru |
laboratoare:laborator01 [2017/02/20 20:54] (current) |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Laborator 01. Introducere în Programarea Android ====== | ====== Laborator 01. Introducere în Programarea Android ====== | ||
| - | |||
| - | ===== Materiale Ajutătoare ===== | ||
| - | |||
| - | * [[http://pdsd2015.andreirosucojocaru.ro/_media/laboratoare/laborator01/pdsd2015-lab01-slides.pdf|pdsd2015-lab01-slides.pdf]] | ||
| - | * [[http://pdsd2015.andreirosucojocaru.ro/_media/laboratoare/laborator01/pdsd2015-lab01-slides-3pp.pdf|pdsd2015-lab01-slides-3pp.pdf]] | ||
| ===== Sistemul de Operare Android ===== | ===== Sistemul de Operare Android ===== | ||
| Line 40: | Line 35: | ||
| | 1.1 | 2 | 09.02.2009 | | | | | 1.1 | 2 | 09.02.2009 | | | | ||
| | 1.0 | 1 | 23.09.2008 | | | | | 1.0 | 1 | 23.09.2008 | | | | ||
| + | |||
| + | Pentru identificarea versiunilor se folosesc, de regulă, trei sisteme: | ||
| + | * un număr, ce respectă formatul major.minor[.build], desemnând dacă modificările aduse sunt substanțiale sau reprezintă ajustări ale unor probleme identificate anterior; versiunea curentă este 6.0.1, lansată la sfârșitul anului 2015; | ||
| + | * un nivel de API (același putând grupa un număr de mai multe versiuni), prin care se indică funcționalitățile expuse către programatori; versiunea curentă are nivelul de API 23; | ||
| + | * o denumire, având un nume de cod inspirat din lumea dulciurilor; termenii respectivi încep cu inițiale care respectă ordinea alfabetică; versiunea curentă este Marshmellow. | ||
| + | |||
| + | În momentul în care se ia decizia cu privire la versiunea pentru care se dezvoltă o aplicație Android, trebuie avute în vedere și cotele de piață ale dispozitivelor mobile. Dezvoltarea unei aplicații Android pentru cea mai nouă versiune are avantajul de a se putea utiliza cele mai noi funcționalități expuse prin API. Dezvoltarea unei aplicații Android pentru cea mai veche versiune are avantajul unei adresabilități pe scară largă. Un compromis în acest sens poate fi obținut prin intermediul **bibliotecilor de suport**, dezvoltate pentru fiecare versiune, prin intermediul cărora pot fi utilizate la niveluri de API mai mici funcționalități din niveluri de API mai mari (în limita capabilităților dispozitivului mobil respectiv). Utilizarea acestora reprezintă o practică recomandată în dezvoltarea aplicațiilor Android. | ||
| ==== Arhitectura Android ==== | ==== Arhitectura Android ==== | ||
| Line 45: | Line 47: | ||
| Arhitectura sistemului de operare Android cuprinde cinci secțiuni grupate pe patru niveluri: | Arhitectura sistemului de operare Android cuprinde cinci secțiuni grupate pe patru niveluri: | ||
| - | {{ :laboratoare:laborator01:arhitecturaandroid.png?nolink&600 }} | + | {{ :laboratoare:laborator01:android_architecture.png?nolink&600 }} |
| - | - **Kernelul Linux** (cu unele modificări) conține driver-ele pentru diferitele componente hardware (ecran, cameră foto, tastatură, antenă WiFi, memorie flash, dispozitive audio), fiind responsabil cu gestiunea proceselor, memoriei, perifericelor (audio/video, GPS, WiFi), dispozitivelor de intrare/ieșire, rețelei și a consumului de energie. | + | - **Kernelul Linux** (cu unele modificări) conține driver-ele pentru diferitele componente hardware (ecran, cameră foto, tastatură, antenă WiFi, memorie flash, dispozitive audio), fiind responsabil cu gestiunea proceselor, memoriei, perifericelor (audio/video, GPS, WiFi), dispozitivelor de intrare/ieșire, rețelei și a consumului de energie; de asemenea, au fost implementate și unele îmbunătățiri: |
| + | - **Binder**, sistemul de comunicație inter-proces, a fost adaptat, întrucât reprezintă mediul de comunicație principal dintre aplicații și sistemul de operare, inclusiv funcțiile (serviciile) dispozitivului mobil; expunerea sa este realizată prin intermediul AIDL (Android Interface Definition Language) prin care pot fi manipulate obiecte transformate în primitive utilizate la comunicația propriu-zisă dintre aplicații și sistemul de operare; | ||
| + | - **Logger**, sistemul de jurnalizare, este esențial în cazul în care trebuie realizată depanarea aplicațiilor, în special pentru a detecta anumite situații particulare (informații cu privire la rețea, senzori); acesta este capabil să agrege datele provenite atât de la aplicația propriu-zisă cât și de la sistemul de operare, datele fiind disponibile prin intermediul unor utilitare specializate; | ||
| + | - sistemul prin intermediul căruia se previne transferul sistemului de operare într-o stare de latență (**wake locks**), în care consumul de energie este redus, întrucât se blochează execuția oricărei aplicații; utilizarea unui astfel de mecanism trebuie realizată cu precauție, întrucât poate determina epuizarea bateriei; | ||
| + | - sistemul de **alarme** oferă posibilitatea ca anumite sarcini să fie planificate la anumite momente de timp, putând fi executate, chiar dacă sistemul de operare se găsește într-o stare de latență; | ||
| + | - **Viking Killer** este un mecanism prin care sistemul de operare revendică memoria utilizată, atunci când nivelul acesteia atinge un anumit prag (aplicațiile Android care au fost rulate anterior sunt de regulă stocate în memorie pentru a se putea comuta rapid între ele, de vreme ce încărcarea în memorie este o operație costisitoare); | ||
| + | - **YAFFS2** (Yet Another Flash File System) este un sistem de fișiere adecvat pentru cipuri flash bazate pe porți NAND; platforma Android este stocată pe mai multe partiții, ceea ce îi conferă flexibilitate la actualizări, împiedicând modificarea sa în timpul rulării (''/boot'' - conține secvența de pornire, ''/system'' - stochează fișierele de sistem și aplicațiile încorporate, ''/recovery'' - deține o imagine din care se poate restaura sistemul de operare, ''/data'' - include aplicațiile instalate și datele aferente acestora, ''/cache'' - utilizată pentru fișiere temporare, folosind memoria RAM, pentru acces rapid). | ||
| - **Bibliotecile** (user-space) conțin codul care oferă principalele funcționalități a sistemului de operare Android, făcând legătura între kernel și aplicații. Sunt incluse aici motorul open-source pentru navigare WebKit, biblioteca FreeType pentru suportul seturilor de caractere, baza de date SQLite utilizată atât ca spațiu de stocare cât și pentru partajarea datelor specifice aplicațiilor, biblioteca libc (Bionic), biblioteca de sistem C bazată pe BSD și optimizată pentru dispozitive mobile bazate pe Linux, biblioteci pentru redarea și înregistrarea de conținut audio/video (bazate pe OpenCORE de la PacketVideo), biblioteci SSL pentru asigurarea securității pe Internet și Surface Manager, bibliotecă pentru controlul accesului la sistemul de afișare care suportă 2D și 3D. Aceste biblioteci nu sunt expuse prin API, reprezentând detalii de implementare Android. | - **Bibliotecile** (user-space) conțin codul care oferă principalele funcționalități a sistemului de operare Android, făcând legătura între kernel și aplicații. Sunt incluse aici motorul open-source pentru navigare WebKit, biblioteca FreeType pentru suportul seturilor de caractere, baza de date SQLite utilizată atât ca spațiu de stocare cât și pentru partajarea datelor specifice aplicațiilor, biblioteca libc (Bionic), biblioteca de sistem C bazată pe BSD și optimizată pentru dispozitive mobile bazate pe Linux, biblioteci pentru redarea și înregistrarea de conținut audio/video (bazate pe OpenCORE de la PacketVideo), biblioteci SSL pentru asigurarea securității pe Internet și Surface Manager, bibliotecă pentru controlul accesului la sistemul de afișare care suportă 2D și 3D. Aceste biblioteci nu sunt expuse prin API, reprezentând detalii de implementare Android. | ||
| - | - **Motorul Android** este reprezentat de: | + | - **Motorul Android** rulează serviciile de platformă precum și aplicațiile care le utilizează, fiind reprezentat de: |
| - | - un set de **biblioteci de bază** care permit utilizatorilor să dezvolte aplicații Android folosind limbajul de programare Java; acestea includ acces la funcțiile telefonului (telefonie, mesaje, resurse, locații), interfața cu utilizatorul, furnizori de conținut și gestiunea pachetelor (instalare, securitate) | + | - **ART (Android Runtime)** este mașina virtuală Java care a fost implementată începând cu versiunea 5.0, folosind un tip de compilare AOH (Ahead of Time), în care bytecode-ul este transpus în cod mașină la momentul instalării, astfel încât acesta este executat direct de mediul dispozitivului mobil; compatibilitatea cu versiuni anterioare (care folosesc mașina virtuală Dalvik, ce se bazează pe un compilator JIT - Just in Time) este asigurată prin transformarea pachetelor în format .dex (Dalvik Executable) la momentul compilării, urmând ca translatarea în format .oat să se realizeze la momentul instalării; fiecare aplicație Android rulează în procesul propriu, într-o instanță a mașinii virtuale ART, izolând astfel codul și datele sale prin intermediul unor permisiuni, care se aplică inclusiv la comunicația prin intermediul interfețelor de comunicare oferite de sistemul de operare Android; |
| - | - **mașina virtuală (Java) Dalvik** este optimizată special pentru Android (dispozitive mobile alimentate de o baterie, resurse de procesare și de memorie limitate, sistem de operare fără swap). Arhitectura sa se bazează pe regiștri, fiind echipată cu un compilator JIT (just-in-time), executabilul obținut putând fi modificat când este instalat pe dispozitivul mobil. Întrucât este utilizată o bibliotecă proprie ce pornește de la un subset al implementării Java realizată de Apache Harmony, nu sunt conținute pachetele pentru AWT / Swing, imprimare sau alte componente speciale. Prin urmare, deși de poate utiliza versiunea curentă de Java (7) pentru dezvoltarea aplicației, facilitățile ce pot fi folosite sunt limitate aproximativ la versiunea 6. Bytecode-ul este compilat în fișiere .dex - Dalvik Executable (în loc de .class), datele duplicate provenind din clase diferite (șiruri de caractere, alte constante) fiind incluse o singură dată, motiv pentru care un astfel de fișier necomprimat va avea o dimensiune mai mică decât o arhivă .jar (comprimată). De asemenea, se permite ca fiecare aplicație Android să ruleze în procesul propriu, într-o instanță a mașinii virtuale Dalvik. | + | - **Zygote** este procesul care gestionează toate aplicațiile, fiind lansat în execuție odată cu sistemul de operare: |
| + | - inițial, creează o instanță a mașinii virtuale Java pentru sistemul de operare Android, în contextul căreia plasează serviciile de bază: gestiunea energiei, telefonie, furnizori de conținut, gestiunea pachetelor, serviciul de localizare, serviciul de notificări; | ||
| + | - atunci când este necesar să lanseze în execuție o anumită aplicație, se clonează, partajând astfel componentele sistemului de operare Android, astfel încât să se asigure performanța (timp de execuție) și eficiența (memorie folosită), de vreme ce fiecare aplicație trebuie rulată în propria sa instanță a mașinii virtuale Java; | ||
| - **Cadrul pentru Aplicații** expune diferitele funcționalități ale sistemului de operare Android către programatori, astfel încât aceștia să le poată utiliza în aplicațiile lor. | - **Cadrul pentru Aplicații** expune diferitele funcționalități ale sistemului de operare Android către programatori, astfel încât aceștia să le poată utiliza în aplicațiile lor. | ||
| - | - La nivelul de **aplicații** se regăsesc atât produsele împreună cu care este livrat dispozitivul mobil (Calculator, Camera, Contacts, Clock, FM Radio, Music Player, S Note, S Planner, Video Player, Voice Recorder), cât și produsele instalate de pe Play Store sau cele dezvoltate de programatori. | + | - La nivelul de **aplicații** se regăsesc atât produsele împreună cu care este livrat dispozitivul mobil (Browser, Calculator, Camera, Contacts, Clock, FM Radio, Launcher, Music Player, Phone, S Note, S Planner, Video Player, Voice Recorder), cât și produsele instalate de pe Play Store sau cele dezvoltate de programatori. |
| ==== Funcționalități Android ==== | ==== Funcționalități Android ==== | ||
| Line 76: | Line 86: | ||
| ==== Android vs. iPhone ==== | ==== Android vs. iPhone ==== | ||
| - | Piața de telefoane inteligente este dominată de Android (care - potrivit estimărilor - își va menține supremația până îm 2018), cu 81.2% (peste un miliard de dispozitive vândute) pe întreg anul 2014, în ciuda revenirii spectaculoase a Apple odată cu lansarea Iphone 6 în luna septembrie, reușind să ajungă astfel la 15%, la nivel mondial. În privința tabletelor, Apple devansează de departe orice producător Android (având o cotă de piață de 33.8%), înregistrând însă o scădere cu 14.6% față de anul precedent, fapt ce reflectă de fapt întregul segment reprezentat de astfel de produse (Lenovo fiind singura excepție, cu o creștere a vânzărilor de 43.5% față de 2013). | + | Piața de telefoane inteligente este dominată de Android (care - potrivit estimărilor - își va menține supremația până în 2018), cu 82.8% (peste un miliard de dispozitive vândute) pe întreg anul 2015, în timp ce Apple deține doar 13.9%, la nivel mondial. |
| - | În 2014, numărul de aplicații disponibile pentru platforma Android le-a depășit pe cele destinată dispozitivelor Apple (1.5 milioane, comparativ cu 1.25 milioane). Și în privința numărului de descărcări Android se află în fața Apple cu aproximativ 25%. Totuși, politica de distribuție a aplicațiilor(faptul că aplicațiile iPhone pot fi instalate numai prin intermediul App Store, în timp ce Android pune la dispoziție mai multe posibilități - Play Store, Amazon App Store, prin conexiune USB de la calculator, prin email sau prin pagina Internet a organizației), la care se adaugă numărul mare de programe gratuite și posibilitatea de piratare mai ușoară se traduce prin încasările obținute, Apple generând un profit mult mai mare din aplicații decât Google (cifrele oficiale nu sunt disponibile încă). O altă explicație a acestei situații este dată și de potența financiară a posesorilor de produse Apple (valoarea unui iPhone fiind de aproximativ 600$) față de puterea de cumpărare a persoanelor ce dețin un telefon Android (al cărui preț mediu este de 200-300$), existând o corespondență directă cu disponibilitatea de a achiziționa aplicații. De asemenea, statisticile arată că utilizatorii Apple își folosesc mult mai intens dispozitivele pentru accesarea de conținut Internet decât cei cumpărătorii de produse echipate cu Android. | + | În 2015, numărul de aplicații disponibile pentru platforma Android le-a depășit pe cele destinată dispozitivelor Apple (1.6 milioane, comparativ cu 1.5 milioane). Și în privința numărului de descărcări Android se află în fața Apple cu aproximativ 25%. Totuși, politica de distribuție a aplicațiilor (faptul că aplicațiile iPhone pot fi instalate numai prin intermediul App Store, în timp ce Android pune la dispoziție mai multe posibilități - Play Store, Amazon App Store, prin conexiune USB de la calculator, prin email sau prin pagina Internet a organizației), la care se adaugă numărul mare de programe gratuite și posibilitatea de piratare mai ușoară se traduce prin încasările obținute, Apple generând un profit mult mai mare din aplicații decât Google (cifrele oficiale nu sunt disponibile încă). O altă explicație a acestei situații este dată și de potența financiară a posesorilor de produse Apple (valoarea unui iPhone fiind de aproximativ 600$) față de puterea de cumpărare a persoanelor ce dețin un telefon Android (al cărui preț mediu este de 200-300$), existând o corespondență directă cu disponibilitatea de a achiziționa aplicații. De asemenea, statisticile arată că utilizatorii Apple își folosesc mult mai intens dispozitivele pentru accesarea de conținut Internet decât cei cumpărătorii de produse echipate cu Android. |
| Aplicațiile destinate dispozitivelor mobile reprezintă un segment extrem de productiv al economiei, doar vânzările din AppStore depășind încasările obținute din producția de filme de la Holywood. Ca tematică, cele mai multe aplicații aparțin domeniului social (jocuri, fotografie, muzică, aplicații culinare, stil de viață), urmate de cele destinate gestionării unor segmente ale unor afaceri. | Aplicațiile destinate dispozitivelor mobile reprezintă un segment extrem de productiv al economiei, doar vânzările din AppStore depășind încasările obținute din producția de filme de la Holywood. Ca tematică, cele mai multe aplicații aparțin domeniului social (jocuri, fotografie, muzică, aplicații culinare, stil de viață), urmate de cele destinate gestionării unor segmente ale unor afaceri. | ||
| - | În privința limbajului de programare utilizat pentru dezvoltarea de aplicații mobile, iPhone folosește **Objective-C**, similar cu C++, care nu se bucură însă de o răspândire prea largă (cu excepția aplicațiilor pentru iPhone), în timp ce Android utilizează **Java** (limbajul de programare cel mai adoptat pe scară largă în cadrul corporațiilor) dar și **C/C++**, prin care se pot apela (cu o oarecare dificultate) aplicații native, prin suport JNI (numărul bibliotecilor disponibile în cazul C/C++ este mai redus decât în Java, însă viteza aplicațiilor este mai mare). Dezvoltarea aplicațiilor pentru iPhone se poate realiza numai folosind mașini Mac (echipate cu MacOS), în timp ce aplicațiile Android pot fi scrise în orice sistem de operare cu Java și Eclipse (atât PC-uri cât și Mac-uri echipate cu Windows, Linux sau MacOS). În această situație, se pune problema cotelor de piață ale sistemelor de operare în cadrul companiilor dezvoltatoare de software, care creează sau nu oportunități pentru dezvoltarea unui anumit tip de aplicații (la începutul lui 2014, sistemele de operare Windows dețineau 92,51% din piață, OS X 7,11%, sistemele de operare cu kernel Linux 1,34%, iar alte sisteme de operare 0,51%). | + | În privința limbajului de programare utilizat pentru dezvoltarea de aplicații mobile, iPhone folosește **Objective-C**, similar cu C++, care nu se bucură însă de o răspândire prea largă (cu excepția aplicațiilor pentru iPhone), în timp ce Android utilizează **Java** (limbajul de programare cel mai adoptat pe scară largă în cadrul corporațiilor) dar și **C/C++**, prin care se pot apela (cu o oarecare dificultate) aplicații native, prin suport JNI (numărul bibliotecilor disponibile în cazul C/C++ este mai redus decât în Java, însă viteza aplicațiilor este mai mare). Dezvoltarea aplicațiilor pentru iPhone se poate realiza numai folosind mașini Mac (echipate cu MacOS), în timp ce aplicațiile Android pot fi scrise în orice sistem de operare cu Java și Eclipse (atât PC-uri cât și Mac-uri echipate cu Windows, Linux sau MacOS). În această situație, se pune problema cotelor de piață ale sistemelor de operare în cadrul companiilor dezvoltatoare de software, care creează sau nu oportunități pentru dezvoltarea unui anumit tip de aplicații (la începutul lui 2016, sistemele de operare Windows dețineau 90,60% din piață, OS X 7,68%, sistemele de operare cu kernel Linux 1,71%, iar alte sisteme de operare 0,01%). |
| Așadar, dacă pentru utilizare personală nu se poate stabili un câștigător clar între Android și iPhone (deși produsul celor de la Apple pare să aibă un ușor avantaj printr-un număr mai mare de aplicații și prin loialitatea clienților), în cazul aplicațiilor dezvoltate de corporații situația este inversă, date fiind posibilitățile de instalare și limbajul de programare folosit. | Așadar, dacă pentru utilizare personală nu se poate stabili un câștigător clar între Android și iPhone (deși produsul celor de la Apple pare să aibă un ușor avantaj printr-un număr mai mare de aplicații și prin loialitatea clienților), în cazul aplicațiilor dezvoltate de corporații situația este inversă, date fiind posibilitățile de instalare și limbajul de programare folosit. | ||
| Line 879: | Line 889: | ||
| Pentru a crea o aplicație Android se selectează //Start a New Android Studio project//. | Pentru a crea o aplicație Android se selectează //Start a New Android Studio project//. | ||
| - | {{ :laboratoare:laborator01:android_studio_project01.png?nolink }} | + | {{ :laboratoare:laborator01:android_studio_project01.png?nolink&500 }} |
| <note tip>Portarea proiectelor dezvoltate folosind Eclipse ADT este foarte facilă, prin intermediul opțiunii //Import project (Eclipse ADT, Gradle, etc.)//.</note> | <note tip>Portarea proiectelor dezvoltate folosind Eclipse ADT este foarte facilă, prin intermediul opțiunii //Import project (Eclipse ADT, Gradle, etc.)//.</note> | ||
| Line 952: | Line 962: | ||
| student@eim2016:~$ git config --global merge.tool diff | student@eim2016:~$ git config --global merge.tool diff | ||
| </code> Verificarea valorii pe care o au variabilele de configurare poate fi realizată în mai multe moduri: <code> | </code> Verificarea valorii pe care o au variabilele de configurare poate fi realizată în mai multe moduri: <code> | ||
| - | student@eim2016:~$ git cofig --list | + | student@eim2016:~$ git config --list |
| </code> <code> | </code> <code> | ||
| student@eim2016:~$ cat .git/config | student@eim2016:~$ cat .git/config | ||
| Line 963: | Line 973: | ||
| - Să se creeze un depozit pe contul Github creat, denumit 'Laborator01'. Inițial, acesta trebuie să fie gol (nu trebuie să bifați nici adăugarea unui fișier ''README.md'', nici a fișierului ''.gitignore'' sau a a fișierului ''LICENSE''). | - Să se creeze un depozit pe contul Github creat, denumit 'Laborator01'. Inițial, acesta trebuie să fie gol (nu trebuie să bifați nici adăugarea unui fișier ''README.md'', nici a fișierului ''.gitignore'' sau a a fișierului ''LICENSE''). | ||
| - Să se cloneze în directorul de pe discul local conținutul depozitului la distanță de la [[https://www.github.com/eim2016/Laborator01|]]. În urma acestei operații, directorul Laborator01 va trebui să se conțină un director ''labtaks'' care conține proiectele Eclipse și AndroidStudio denumite ''MyFirstAndroidApplication'', fișierele ''README.md'' și ''LICENSE'' și un fișier ''.gitignore'' care indică tipurile de fișiere (extensiile) ignorate. <code> | - Să se cloneze în directorul de pe discul local conținutul depozitului la distanță de la [[https://www.github.com/eim2016/Laborator01|]]. În urma acestei operații, directorul Laborator01 va trebui să se conțină un director ''labtaks'' care conține proiectele Eclipse și AndroidStudio denumite ''MyFirstAndroidApplication'', fișierele ''README.md'' și ''LICENSE'' și un fișier ''.gitignore'' care indică tipurile de fișiere (extensiile) ignorate. <code> | ||
| - | student@eim2016:~$ git init | ||
| student@eim2016:~$ git clone https://www.github.com/eim2016/Laborator01.git | student@eim2016:~$ git clone https://www.github.com/eim2016/Laborator01.git | ||
| </code> | </code> | ||
