Scopul temei este sa urmareasca utilizarea resurselor pe un dispozitiv mobil Android (telefon sau tableta) pe parcursul a trei scenarii:
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:
Cerinte:
Nota: Tema trebuie insotita de un fisier readme care 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.
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.
O data 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 caracteristice 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. 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.
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:
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.
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.
[1] Hidden APIs http://www.xda-developers.com/android/discover-undisclosed-apis-with-androids-secret/
[2] Java Reflection http://docs.oracle.com/javase/tutorial/reflect/index.html
[3] Open source app that collects information about power using Java Reflection http://syspower.googlecode.com/svn-history/r5/trunk/android-files/src/org/spot/android/collectors/AndroidPowerCollector.java
[3b] Bug in setting sensor type using getHandle http://code.google.com/p/android/issues/detail?id=36840
[4] Running internal and hidden API by altering the Android jar and ADT https://devmaze.wordpress.com/2011/01/19/using-com-android-internal-part-5-summary-and-example/
[5] Get statistics from adb using dumpsys http://stackoverflow.com/questions/10074254/how-to-caculate-power-consumption-of-android-app
[5b] Get statistics using perf-record http://manpages.ubuntu.com/manpages/natty/man1/perf-record.1.html
[6] Reding number of bytes transferred through WiFi http://stackoverflow.com/questions/12837846/how-to-count-the-number-of-bytes-sent-and-received-via-wifi-lan
[7] Run a command from the Android app http://softteco.blogspot.nl/2011/04/android-easy-way-to-get-battery-stats.html
[8] OpenTTD (city builder open source) https://play.google.com/store/apps/details?id=org.openttd.sdl
[9] Raging Thunder 2 (joc arcade cu masini) https://play.google.com/store/apps/details?id=com.polarbit.rthunder2lite