Table of Contents

Laborator 01. Introducere în Programarea Android

Sistemul de Operare Android

Android - Prezentare Generală

Android este un sistem de operare mobil bazat pe o versiune modificată de Linux (pentru gestiunea componentelor hardware, a proceselor și a memoriei) și biblioteci Java (pentru telefonie (audio/video), conectivitate, grafică, programarea interfețelor cu utilizatorul). Este un produs open-source (putând fi dezvoltat de producătorii de dispozitive mobile cu extensii proprietare pentru a-și particulariza platforma), dezvoltat în prezent de compania Google, conceput pe ideea transformării dispozitivelor mobile în adevărate mașini de calcul. Comunitatea Android este în creștere, mai multe companii renunțând la propriul sistem de operare în favoarea acestuia, pentru a putea face față fenomenului iPhone.

În condițiile în care pe piața dispozitivelor mobile aplicațiile sunt cele care aduc avantajul competițional, beneficiul Android este reprezentat de abordarea unitară pentru dezvoltarea aplicațiilor. Cu alte cuvinte, o aplicație dezvoltată conform API-ului Android va putea rula pe mai multe dispozitive mobile pe care este instalat sistemul de operare respectiv.

Versiuni Android

Versiune Android Nivel API Data Lansării Nume de Cod Cota de Piață
5.0 - 5.0.2 21 12.11.2014 Lollipop 1.6%
4.4W - 4.4W.2 20 25.06.2014 KitKat with wearable extensions
4.4 - 4.4.4 19 31.10.2013 KitKat 39.7%
4.3 18 24.07.2013 Jelly Bean 6.3%
4.2.x 17 13.11.2012 Jelly Bean 19.8%
4.1.x 16 09.07.2012 Jelly Bean 18.4%
4.0.3 - 4.0.4 15 16.12.2011 Ice Cream Sandwich 6.4%
4.0 - 4.0.2 14 19.10.2011 Ice Cream Sandwich
3.2 13 15.07.2011 Honeycomb
3.1 12 10.05.2011 Honeycomb
3.0 11 22.02.2011 Honeycomb
2.3.3 - 2.3.7 10 09.02.2011 Gingerbread 7.4%
2.3 - 2.3.2 9 06.12.2010 Gingerbread
2.2 - 2.2.3 8 20.05.2010 Froyo 0.4%
2.1 7 12.01.2010 Eclair
2.0.1 6 03.12.2009 Eclair
2.0 5 26.10.2009 Eclair
1.6 4 15.09.2009 Donut
1.5 3 30.04.2009 Cupcake
1.1 2 09.02.2009
1.0 1 23.09.2008

Arhitectura Android

Arhitectura sistemului de operare Android cuprinde cinci secțiuni grupate pe patru niveluri:

  1. 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.
  2. 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.
  3. Motorul Android este reprezentat de:
    1. 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)
    2. 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.
  4. 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.
  5. 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.

Funcționalități Android

De vreme ce Android este un produs open-source, producătorii având posibilitatea de a-l modifica în mod gratuit, nu există configurații hardware sau software standard. Totuși, Android implementează următoarele funcționalități:

Android vs. iPhone

Deși platforma celor de la Apple pune la dispoziție o gamă de aplicații mult mai variată decât a celor de la Google, la sfârșitul lui 2013 Android deținea 51.8% din totalul descărcărilor, în timp ce iPhone numai 40.7%. Totuși, politica de distribuție a acestora (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) se traduce prin încasările obținute, raportul dintre Apple și Google fiind de 65% la 35%.

Î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 90,60% din piață, OS X 7,68%, sistemele de operare cu kernel Linux 1,60%, iar alte sisteme de operare 0,10%).

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.

Comunitatea programatorilor Android

Ajunsă deja la a cincea versiune, Android este o platformă care beneficiază de experiența a numeroși dezvoltatori ce poate fi exploatată:

Cerințe pentru dezvoltarea unei aplicații Android

Kit de Dezvoltare pentru Limbajul de Programare Java (JDK)

Linux

Încărcarea variabilelor de sistem globale din fișierul /etc/profile se va face numai după repornirea sistemului de operare.

Windows

SDK Android

Descărcare

Linux

Se descarcă arhiva .tgz conținând SDK-ul de Android:

student@pdsd2015:~$ cd /tmp
student@pdsd2015:/tmp$ wget http://dl.google.com/android/android-sdk_r24.0.2-linux.tgz
student@pdsd2015:/tmp$ cd /opt
student@pdsd2015:/opt$ sudo tar xzvf /tmp/android-sdk_r24.0.2-linux.tgz
student@pdsd2015:/opt$ rm -f /tmp/android-sdk_r24.0.2-linux.tgz
Windows

Se descarcă executabilul conținând SDK-ul de Android.

Instalare

Linux

Operațiile de descărcare și instalare pot dura o perioadă de timp mai îndelungată, în funcție de viteza conexiunii la Internet.
Windows

Medii de Dezvoltare Integrate (IDE)

Eclipse Luna SR1a (4.4.1)

Linux

Se descarcă arhiva .tar.gz corespunzătoare arhitecturii mașinii pe care se dorește să se realizeze instalarea în directorul /opt:

Lansarea în execuție a mediului de dezvoltare integrat se face prin /opt/eclipse/eclipse.

Windows

Se descarcă arhiva .zip corespunzătoare arhitecturii mașinii pe care se dorește să se realizeze instalarea:

Plugin Android Developer Tools pentru Eclipse Luna SR1a (4.4.1)

Android Studio

Linux

Procesul de configurare a mediului integrat de dezvoltare Android Studio implică următorii pași:

Windows

Executabilul corespunzător mediului integrat de dezvoltare Android Studio (studio.exe) trebuie să dețină drepturi de rulare corespunzătoare utilizatorului de tip administrator.
  • din meniul contextual al fișierului (click dreapta) se accesează opțiunea Properties
  • în secțiunea Compatibility se bifează opțiunea Run this program as an administrator și se definitivează modificările accesând butonul Apply

Emulatoare

Genymotion

O versiune gratuită pentru emulatorul Genymotion poate fi descărcată de pe http://www.genymotion.com după ce se creează un cont. Alternativ, executabilele pot fi descărcate de la următoarele locații:

Emulatorul Genymotion are nevoie de o mașină virtuală în contextul căreia să ruleze.

Se instalează emulatorul Genymotion pornind de la executabilele descărcate.

Plugin pentru Medii de Execuție Integrate (IDE)

Eclipse


Android Studio



Configurare Dispozitiv Virtual

Se lansează în execuție Genymotion.

În situația în care este generată o eroare legată de versiunea bibliotecii glibc
student@pdsd2015:~$ sudo /opt/genymotion/genymotion
/opt/genymotion/genymotion: /lib/i386-linux-gnu/i686/cmov/libc.so.6: version `GLIBC_2.15' not found (required by /opt/genymotion/libQtGui.so.4)
/opt/genymotion/genymotion: /lib/i386-linux-gnu/i686/cmov/libc.so.6: version `GLIBC_2.15' not found (required by /opt/genymotion/libQtNetwork.so.4)
/opt/genymotion/genymotion: /lib/i386-linux-gnu/i686/cmov/libc.so.6: version `GLIBC_2.15' not found (required by /opt/genymotion/libQtCore.so.4)

este necesar să se instaleze o versiune mai recentă (experimentală).

Se modifică fișierul care conține lista locațiilor de la care pot fi descărcate pachetele (/etc/apt/sources.list), specificându-se o nouă sursă:

student@pdsd2015:~$ sudo gedit /etc/apt/sources.list
/etc/apt/sources.list
# ...
deb http://ftp.debian.org/debian sid main
# ...

Se actualizează baza de date cu locațiile de la care pot fi descărcate pachetele.

student@pdsd2015:~$ sudo apt-get update

Se instalează pachetul eglibc.

student@pdsd2015:~$ sudo apt-get -t sid install libc6 libc6-dev libc6-dbg

(pentru platformele pe 64 de biți se va instala pachetul libc6-amd64).

În timpul instalării, unele servicii afectate vor fi repornite, fiind solicitat acceptul utilizatorului în acest sens.

Este necesară repornirea mașinii după care fișierul care conține locațiile de la care pot fi descărcate pachetele trebuie restaurat la starea inițială (cu actualizarea corespunzătoare a bazei de date).

Inițial, se solicită descarcarea unei imagini corespunzătoare pentru un dispozitiv mobil virtual.

Imaginea pentru dispozitivul mobil virtual trebuie descărcată doar o singură dată.
Autentificarea se face cu numele de utilizator pdsd și parola pdsd.
În situația în care nu pot fi compilate sursele de Android, se va instala pachetul lib32z1 cu sudo apt-get install lib32z1.

AVD (Android Virtual Device)

Ca alternativă la Genymotion, pot fi configurate dispozitive virtuale care vor fi rulate folosind emulatorul standard din cadrul SDK-ului de Android. De regulă, acestea sunt mai lente, consumă mai multă memorie și nu oferă la fel de multe facilități cu privire la funcționalitățile dispozitivului propriu-zis.

Configurarea unui dispozitiv virtual se face prin intermediul aplicației Android Virtual Device (AVD) Manager, livrată împreună cu SDK-ul Android.

Linux
student@pdsd2015:~$ cd /opt/android-sdk-linux/tools/
student@pdsd2015:~$ sudo ./android avd
Windows
C:\Users\Pdsd2015>cd "C:\Program Files (x86)\Android\android-sdk"
C:\Program Files (x86)\Android\android-sdk> "AVD Manager.exe"

Utilitarul listează toate dispozitivele virtuale Android, oferind totodată posibilitatea de a crea unele noi.

Procesul de configurare a unui dispozitiv virtual Android implică specificarea următoarelor proprietăți:

  1. denumire (AVD Name): caracterele permise sunt litere minuscule / majuscule (a-z, A-Z), ., _ și -.
  2. dispozitiv virtual (Device): se alege dintr-o listă în care fiecare dispozitiv virtual este identificat prin dimensiunea ecranului (diagonală exprimată în inchi, rezoluție exprimată în pixeli - lungime x lățime, densitate: ldpi, mdpi, hdpi, xhdpi, xxhdpi, tvdpi)
  3. nivelul de API care va fi folosit (Target), în funcție de ceea ce a fost instalat anterior
  4. tipul de procesor (CPU/ABI): ARM (armeabi-v7a), MIPS (mips), Intel Atom (x86)
  5. posibilitatea de a folosi tastatura sistemului gazdă (Keyboard) este activată în cazul în care este selectată opțiunea Hardware keyboard present
  6. tipul de interfață grafică (Skin)
  7. utilizarea unor dispozitive ale sistemului gazdă pentru camerele dispozitivului virtual (Front Camera, Back Camera)
  8. valorile corespunzătoare pentru dimensiunea memoriei RAM și a heap-ului (Memory Options)
  9. valoarea corespunzătoare spațiului de stocare pe discul local (Internal Storage)
  10. informații cu privire la cardul de memorie (SD Card): dimensiune (exprimată în MB), fișier din cadrul sistemului gazdă care să îi reflecte conținutul
  11. opțiuni legate de emulare (Emulation Options)
    1. Snapshot - permite ca starea dispozitivului virtual să fie stocată, astfel încât acesta să pornească mai rapid ulterior
    2. Use Host GPU - folosirea unității de procesare grafică a sistemului gazdă

Rezultatele procesului de configurare a dispozitivului virtual pot fi vizualizate într-o fereastră care rezumă proprietățile specifice:

Dispozitivele virtuale sunt stocate în directorul $HOME/.android/avd, pentru fiecare dintre acestea fiind stocat un fișier .avd și un fișier .ini (care conțin toate proprietățile dispozitivului virtual, acestea putând fi modificate și manual).

Pentru fiecare dispozitiv virtual din listă, există mai multe opțiuni:

  1. lansare în execuție (Start…)
  2. editarea configurației (Edit…)
  3. restaurare (Repair…) - în situația în care dispozitivul virtual nu a putut fi încărcat
  4. ștergere (Delete…)
  5. vizualizarea configurației (Details…)

Lansarea în execuție poate fi realizată:

  1. prin accesarea butonului Start… corespunzător unui dispozitiv virtual
  2. prin intermediul utilitarului emulator aflat în subdirectorul tools al SDK-ului Android
Linux
student@pdsd2015:~$ cd /opt/android-sdk-linux/tools/
student@pdsd2015:~$ sudo ./emulator @Nexus_S
Windows
C:\Users\Pdsd2015>cd "C:\Program Files (x86)\Android\android-sdk\tools"
C:\Program Files (x86)\Android\android-sdk\tools> emulator @Nexus_S
Pentru arhitecturile pe 32 de biți, utilitarul emulator trebuie rulat cu opțiunea -force-32bit.

Opțiunile prin care poate fi controlată lansarea în execuție sunt:

  1. scalarea ecranului la dimensiunea reală (specificându-se dimensiunea ecranului - exprimată în inchi și rezoluția acestuia - exprimată în dpi)
  2. ștergerea datelor utilizatorului de pe discul local al dispozitivului virtual
  3. rularea pornind de la o stare anterioară (eng. snapshot)
  4. stocarea stării dispozitivului virtual

Emulatorul furnizat împreună cu SDK-ul Android conține o secțiune a ecranului și o secțiune a controalelor utilizatorului (butoane pentru controlul volumului, pornire/oprire, tastele home / menu (meniu contextual) / back / search și un pad cu tastele direcționale (de regulă, dezactivat).

În funcție de capabilitățile hardware ale sistemului gazdă, este posibil ca pornirea dispozitivului virtual în cadrul emulatorului să dureze o perioadă de timp mai mare.

Dispozitiv Mobil Fizic

Pentru a se putea rula o aplicație pe un dispozitiv mobil fizic, trebuie să se activeze posibilitatea de depanare prin USB, din Dev Tools → Developer options → Debugging → USB debugging.

Resurse Utile

Dashboards
Download Android Studio and SDK Tools - Android Developers
Genymotion
How to upgrade glibc from version 2.13 to 2.15 on Debian?