Tema 2 - Caracterizarea resurselor intr-un sistem Android

Scopul temei este sa urmareasca utilizarea resurselor pe un dispozitiv mobil Android (telefon sau tableta) pe parcursul a trei scenarii:

  1. Scenariul de baza (idle)
  2. Scenariul network intensive (mail, calendar etc.)
  3. Scenariul computational + network intensive (un joc multiplayer)

Nota: Pentru scenariile 2 si 3 trebuie sa aveti o conexiune la internet. Recomandam o conexiune WiFi cel putin pentru setup-ul scenariului 3. Mai multe detalii mai jos.

Se vor colecta date precum:

  • a) Informatii despre device:
    • model device (e.g. Samsung GT-55660),
    • versiune Android (e.g. 2.3.3),
    • total RAM in kB (e.g. 286084),
    • free RAM in kB (e.g. 19640),
    • total disk space in MB (e.g. 181),
    • free disk space in MB (e.g. 42.82),
    • CPU (e.g. ARMv6-compatible),
    • nivel baterie in % (e.g. 68)
  • b) Informatii despre aplicatii:
    • pachet (e.g. com.polarbit.rthunder2lite),
    • uid (e.g. 40565488)
  • c) Informatii despre resurse per aplicatie:
    • total CPU time in ms (e.g. 8320),
    • estimate energy for CPU in mJ (e.g. 664),
    • GPS time in ms (e.g. 15120),
    • estimate energy for GPS in mJ (e.g. 3210),
    • number of bytes sent through wireless (e.g. 300),
    • number of bytes received through wireless (e.g. 2400),
    • estimate energy for wireless in mJ (e.g. 5500)

Cerinte:

  • (2.5p) colectarea de date
  • (2.5p) salvarea datelor intr-o baza de date SQLite
  • (2.5p) trimiterea datelor pe server
  • (2.5p) statistici si comentarii
  • (Bonus 1.5p) orice alte date, in afara de cele mentionate la punctele a,b si c de mai sus, colectate sau derivate cu privire la resursele consumate de aplicatii

Pe moodle trebuie sa incarcati o arhiva care sa contina: (1) intregul proiect eclipse in care ati lucrat (sau echivalent, daca nu lucrati in eclipse) si (2) un fisier readme. Fisierul readme trebuie sa prezinte comentariile voastre cu privire la fiecare din punctele de mai sus. Punctajul pentru acest fisier readme este astfel inclus in punctajele mentionate, iar absenta sa atrage scaderea de punctaje din toate cerintele temei.

Colectarea datelor

Android permite citirea de informatii cu privire la aplicatii si la resurse prin internal API (pachetul com.android.internal) si hidden API (marcate cu @hide in codul sursa Android). Metodele cuprinse in aceste APIs nu sunt in mod normal accesibile din SDK din diferite motive ale creatorilor Android, precum acela ca nu pot sa garanteze backwards compatibility pentru ele in viitoarele versiuni de API. Metodele de care aveti nevoie pentru aceasta tema au fost insa testate pe Android 2.2, 2.3 si 4.0, pe diferite dispozitive.

Din cauza ca aceste metode nu sunt accesibile din SDK, pentru a rezolva tema va trebui astfel sa apelati la un artificiu de programare, denumit Java Reflection[2]. Studiati modalitatea in care sunt folosite clasa Class si metodele getMethod si invoke intr-o aplicatie open source cu o functionalitate similara cu cea pe care trebuie sa o implementati voi[3]. Nu uitati sa adaugati permisiunile necesare pentru a accesa aceste informatii in AndroidManifest.xml: BATTERY_STATS, GET_TASKS, ACCESS_FINE_LOCATION, WAKE_LOCK, ACCESS_COARSE_LOCATION, CONTROL_LOCATION_UPDATES, ACCESS_LOCATION_EXTRA_COMMANDS.

Exista si alte metode de a folosi internal si hidden APIs[4], insa consideram ca nu sunt avatanjoase pentru cerinta acestei teme, iar Java Reflection este suficient.

Odata ce ati inteles mecanismul prin care se apeleaza metodele, studiati aplicatia [3] si API-ul pentru a identifica ce metode puteti folosi pentru a colecta informatii de interes. Recomandam urmatoarele clase:

Informatii cu privire la starea sistemului se pot obtine si din shell prin adb, folosind dumpsys[5] sau, daca aveti telefonul rootat, folosind perf-record[5b]. De asemenea, pe Android se pot consulta o mare parte din fisierele de sistem caractaristice pentru Linux, cum ar fi cele din /proc si cele din /sys. Spre exemplu, pentru a citi cantitatea de date transmisa prin WiFi, puteti folosi exemplul de la [6]. In general, pentru a rula comenzi de shell programatic (din aplicatie) puteti folosi metoda de la [7].

Aceasta parte reprezinta partea de studiu individual a temei. Ea nu a fost acoperita in laborator, insa aveti aici suficiente materiale pentru a intelege despre ce este vorba. Va incurajam sa schimbati pareri cu privire la aceste metode pe forumul dedicat temei.

Metodologie

Observati ca resursele din cerinta sunt in principiu de doua tipuri: resurse statice (raman neschimbate pe timpul scenariilor, e.g. versiunea de Android) si resurse dinamice (se schimba pe parcursul scenariilor, e.g. cantitatea de date transmise prin WiFi). Puteti organiza programul pe care il realizati cum doriti, insa retineti ca resursele statice este suficient sa le cititi o singura data, in timp ce resursele dinamice trebuie citite la intervale regulate de timp. In general cu cat acest sampling se face mai des, cu atat avem o imagine mai buna, insa consumam mai multa energie. Pentru scopul nostru, vom face citiri la 1 min. Consideram ca toate scenariile dureaza 15 minute, adunand astfel cate 15 masuratori pentru fiecare rulare a unui scenariu.

Descrierea scenariilor:

  1. Scenariul de baza (setup: inchideti toate aplicatiile deschise)
    • in acest scenariu este suficient sa lasati telefonul idle timp de 15 min, fara nicio actiune (nici nu este nevoie sa inchideti ecranul, lasati-l sa se inchida singur la intervalul setat de voi)
  2. Scenariul network intensive (setup: inchideti toate aplicatiile deschise)
    • deschideti aplicatia de mail
    • cititi un mesaj primit in urma cu o saptamana
    • trimiteti un mesaj nou
    • deschideti aplicatia calendar
    • adaugati un eveniment nou
    • stergeti evenimentul pe care tocmai l-ati adaugat
    • deschideti un browser
    • accesati cs.curs.pub.ro
    • deschideti aplicatia youtube
    • urmariti un videoclip
    • daca a mai ramas timp din cele 15 minute, lasati telefonul idle, cu aplicatiile de mai sus pornite, pana expira timpul
  3. Scenariul computational + network intensive (setup: instalati si jucati cel putin o data, in mod multiplayer, unul din jocurile de la [8] sau [9], la alegere, apoi inchideti toate aplicatiile deschise)
    • jucati-va in mod multiplayer unul din cele doua jocuri (la alegere) timp de 15 minute

Masuratorile pentru fiecare scenariu trebuie repetate de cel putin 4 ori, pentru a observa daca exista alte cauze care influenteaza parametrii masurati. Este important ca la scenariul b sa urmati aceeasi pasi de fiecare data, iar la scenariul c sa va jucati acelasi joc de fiecare data.

Salvarea datelor intr-o baza de date locala

Pentru a salva local datele colectate folositi o baza de date SQLite, asa cum ati invatat in laborator. Structura bazei de date este la latitudinea voastra, dar observati din nou ca unele date sunt statice si avem o singura intrare pentru ele, in timp ce altele sunt dinamice si vom avea cate o intrare pentru ele la fiecare minut.

Trimiterea datelor pe server

La sfarsitul rularii fiecarui scenariu, sau cand doriti voi si aveti acces la retea, realizati o trimitere a datelor stocate local catre server. Serverul este accesibil la adresa:

http://embedded.cs.pub.ro/si/power

Pentru a trimite o inregistrare a unei resurse catre server, realizati un HTTP GET conform urmatoarelor exemple:

http://embedded.cs.pub.ro/si/power/resource/add?src=b98d2bdd7305ba5fd5e3ff3f3f9cb375&time=1355192353&type=devmodel&val=Samsung+GT-55660&pack=

http://embedded.cs.pub.ro/si/power/resource/add?src=b98d2bdd7305ba5fd5e3ff3f3f9cb375&time=1355192355&type=cpu_time&val=33500&pack=com.polarbit.rthunder2lite

Parametrii cererii get corespund coloanelor din baza de date de pe server:

  • src: id-ul vostru unic; pentru a fi anonim si pentru a preveni coliziunile, fie acest id hashul md5 aplicat userului vostru de cs.curs - spre exemplu md5(alexandru.olteanu) = b98d2bdd7305ba5fd5e3ff3f3f9cb375
  • time: timestamp in format unix (numarul de secunde de la 1 Ian 1970) care corespunde momentului in care ati facut citirea (nu momentului in care ati trimis datele)
  • type: codul cu tipul resursei (vezi anexa de la sfarsit pentru o mapare a codurilor la tipurile de resurse din enunt)
  • val: valoarea resursei, poate fi float sau string dupa caz
  • pack: pachetul aplicatiei pentru care a fost citita resursa; daca este vorba de o resursa de sistem (precum modelul device-ului) atunci acest parametru ar trebui sa ramana gol, ca in primul exemplu de mai sus

Observati ca fiecare citire ar trebui trimisa o singura data catre server. Prin urmare ar fi bine ca in baza de date locala sa aveti pentru fiecare intrare un camp care sa indice daca intrarea respectiva a fost sau nu trimisa la server.

Statistici si comentarii

Oferiti statistici sub forma de tabele si grafice (resursa vs timp) cu privire la aplicatia care consuma cel mai mult din resursele sistemului pentru fiecare scenariu in parte. Daca aveti instalata o aplicatie de tune-up, puteti compara rezultatele obtinute de voi cu cele raportate de aceasta (asa ceva poate sa conteze pentru bonus).

Faceti comentarii cu privire la modalitati de a asigura o citire cat mai apropiata de realitate. Identificati posibile cauze care pot sa aduca erori in datele masurate / calculate de voi.

Referinte

Anexa

Lista de coduri pentru resurse ce trebuiesc folosite cand se trimit datele catre server:

resursa cod in query trebuie precizat pachet
model device devmodel nu
versiune Android osversion nu
total RAM ram_total nu
free RAM ram_free nu
total disk space disk_total nu
free disk space disk free nu
CPU cpu_name nu
nivel baterie batt_level nu
total CPU time cpu_time da
estimate energy for CPU cpu_energy da
GPS time gps_time da
estimate energy for GPS gps_energy da
number of bytes sent through wireless net_bytes_tx da
number of bytes received through wireless net_bytes_rx da
estimate energy for wireless net_energy da
si/teme/tema2android.txt · Last modified: 2020/05/19 22:10 (external edit)
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0