L’Architettura di Android

Android è una piattaforma mobile che sta crescendo molto rapidamente: non è, come la vedono alcuni, alla rincorsa di iPhone perchè in un certo modo sta rivoluzionando il mercato dei telefoni cellulari. Grandi marche come LG, HTC, Acer, Motorola o Samsung hanno abbracciato questa piattaforma fornendo prodotti che coprono e interessano diverse fasce di utenti, sia dal punto di vista del portafogli che dei requisiti hardware. La risposta degli utenti non si è fatta attendere: esiste ormai una comunità molto ampia di sviluppatori, estremamente produttiva, che altri sistemi mobili non possono vantare. In questo post vedremo di capire le caratteristiche archietturali che fanno di Android una piattaforma di grande interesse.

Chi c’è dietro Android

Android è principalmente il risultato di un lavoro di collaborazione tra Google e la Open Handset Alliance: si tratta di un’alleanza di quasi 50 organizzazioni che hanno lo scopo di portare sul mercato un concetto di mobile migliore e più aperto di quello conosciuto attualmente. Una vision riassunta in questa frase può apparire fumosa e poco realistica, ma basta dare una breve occhiata alle aziende che ci sono dietro per ricredersi immediatamente. Tra gli operatori mobili infatti troviamo T-Mobile, Vodafone, Telecom Italia e Telefònica; tra i produttori di telefoni partecipano aziende del calibro di Acer, Asus, LG, Samsung e Toshiba. Non siete ancora convinti della serietà dell’alleanza? Tra le compagnie produttrici di semiconduttori compaiono nVidia, ARM e Intel. Non credo sia necessario aggiungere altro!

Una piattaforma software

Android non è una piattaforma hardware, ma un ambiente software progettato appositamente per telefoni o più in generale per dispositivi mobili. Data l’euforia che iPad ha sollevato per il mondo dei tablet, la nuova versione di Android (v. 3) avrà un occhio di riguardo per questo tipo di dispositivi.
In generale, la piattaforma include un sistema operativo basato su Linux, un ricco toolkit di interfacce grafiche, un ambiente di sviluppo, supporto al multimedia e molto altro. Visto che al giorno d’oggi molti si lamentano perchè i telefoni moderni fanno di tutto tranne che telefonare, con Android vi assicuriamo che potete ANCHE telefonare!

Una architettura stratificata

La piattaforma Android è ben strutturata e stratificata a tal punto che ha poco da invidiare a quelle dei comuni sistemi desktop: il sito di Android Developers mostra l’architettura che riproponiamo qui sotto:


Overview architettura

I vari elementi archietturali sono principalmente mutuati dal mondo OpenSource. Possiamo riassumerli nei seguenti punti:

  • Il cuore del sistema è basato sul kernel di Linux (versione 2.6) che costituisce il livello di astrazione di tutto l’hardware sottostante che può includere wi-fi, bluetooth, GPS, fotocamera, touchscreen… I produttori di telefoni possono quindi intervenire già a questo livello per personalizzare i driver di comunicazione con i propri dispositivi. Grazie all’astrazione dell’hardware, infatti, i livelli soprastanti non si accorgono dei cambiamenti hardware, permettendo una programmazione ad alto livello omogenea ed una user experience indipendente dal device.
    Perchè Linux? L’affidabilità è più importante delle prestazioni in un dispositivo mobile che deve principalmente garantire il servizio di telefonia: gli utenti si aspettano quindi tale affidabiltà, ma allo stesso tempo hanno bisogno di un dispositivo che possa garantire servizi più evoluti: Linux permette di raggiungere entrambi gli scopi.
  • Il livello superiore riguarda l’equipaggiamento software costituito dalle librerie fondamentali che gestiscono per esempio la grafica 2D e 3D (OpenGL ES), browser con engine WebKit o il supporto al database (SQLite).
  • L’ambiente di runtime è costituito invece da una libreria core e da una macchina virtuale (VM): insieme costituiscono la piattaforma di sviluppo per Android. La VM di Android è versione particolare della Java Virtual Machine (chiamata Dalvik), progettata e ottimizzata appositamente per girare su hardware non performanti, come quelli dei cellulari appunto. In realtà gli ultimi modelli che montano Android vantano processori dual core con 1 Gb di RAM per cui questa affermazione comincia già ad essere obsoleta.
    Il kernel di Linux di Android è un sistema multi-utente nel quale ogni applicazione è un utente differente. Il sistema infatti crea un unico user ID per ogni applicazione (sconosciuto ad essa) e imposta i permessi dei file dell’applicazione stessa in modo che solo quell’ID possa averne accesso. Inoltre, ogni applicazione sul telefono viene lanciata in un processo Linux a sè stante all’interno della propria istanza della JVM: questa archiettura a sandbox garantisce la stabilità del telefono nel caso in qui qualche applicazione crei problemi. In caso alcune applicazioni abbiano necessità di comunicare tra loro, il sistema non lo impedisce: permette anzi loro di condividere lo stesso user ID e la stessa JVM in modo da preservare la coerenza delle risorse di sistema.
  • Al penultimo livello è possibile rintracciare i gestori e le applicazioni di base del sistema. Ci sono gestori per le risorse, per le applicazioni installate, per le telefonate, il file system e altro ancora.
  • Al livello più alto risiedono le applicazioni utente. Le funzionalità base del sistema, come per esempio il telefono, non sono altro che applicazioni utente scritte in Java e che girano ognuna nella sua JVM. Da notare che non è la distribuzione Java ME quella che viene eseguita, ma una versione appositamente sviluppata per Dalvik: il codice Java infatti viene compilato e tradotto in byte code, dopodichè subisce una ulteriore trasformazione in un formato chiamato dex file. Questo ulteriore passaggio ha permesso a Google da un lato di ottimizzare il codice per la sua JVM, dall’altro di svincolarsi (o quasi!) da problemi legali con Oracle, nuova proprietaria di Java.

Sviluppare per Android

Già da una prima analisi dell’archiettura di Android è evidente che la piattaforma è indirizzata a programmatori che abbiano conoscenze in C/C++ e Java. Quest’ultimo, in realtà, è il linguaggio di riferimento, come abbiamo detto, per scrivere applicazioni Android. C e C++ comunque non sono relegati ad un ambiente di basso livello, ma possono essere sfruttati nel caso sia necessario sviluppare un’applicazione altamente performante, come per esempio un gioco.

Android SDK

Per sviluppare con Android abbiamo bisogno di 4 componenti:

  • Eclipse (ambiente consigliato),
  • ADT (Android Development Tools, plug-in di Eclipse),
  • Android SDK (Software Development Kit)
  • e i virtual devices (emulatori dei dispositivi per lo sviluppo/debug/test).

Come abbiamo già detto, Android non è basato sulla distribuzione ME di Java ma è una versione personalizzata che include gran parte delle funzionalità note ai programmatori Java contenute nei package come java.lang, java.io, java.net e altri. Gli strumenti specifici della piattaforma Android, invece, sono contenuti in tutti i package che cominciano con android e che forniscono le API per l’interazione con il bluetooth, localizzazione o il telefono, costituendo uno strato di astrazione anche su componenti hardware, o per la gestione dell’interfaccia grafica e delle gestures.

Android in C

Se si ha bisogno per esempio di realizzare dei servizi per Android che non necessitano di interfaccia grafica e che interagiscono con il database locale, la piattaforma non si tira indietro e permette di scendere fino livello di Linux per sviluppare: è possibile quindi implementare applicazioni in C senza l’ausilio dell’SDK.
Per sviluppare in C è necessario innanzi tutto un cross-compilatore C: nello specifico, per Android è necessario il Sourcery G++ Lite Edition for ARM di CodeSourcery. Il core Linux di Android è compilato per girare su processori ARM (32 bit RISC), molto usati nei dispositivi mobili per il buon rapporto prestazioni/consumi energetici.
Lavorando senza SDK, gran parte del lavoro sarà eseguito da riga di comando come la compilazione o il deploy sull’emulatore.

Android NDK

L’uso del linguaggio C come presentato in precedenza non riguarda certamente lo sviluppo di applicazioni di largo consumo, ma serve per capire quanto questa piattaforma sia potente e adattabile a diversi livelli di business. Esiste però una modalità “approvata” per scrivere codice C/C++ in Android grazie all’ausilio della Android Native Development Kit (NDK). Si tratta di un toolkit complementare alla SDK: infatti non può essere scritta una applicazione completamente in NDK. Perchè scrivere in nativo? Se si ha a che fare con applicazioni che coinvolgono elaborazione dei segnali, delle immagini o animazioni evolute, le prestazioni migliori si ottengono in un ambiente nativo. Non è detto però che un algorimo scritto in C sia più veloce del corrispettivo in Java: non è quindi automatico supporre che per aumentare le prestazioni basti lavorare con la NDK. In generale, la scelta di lavorare in nativo è da prendere in considerazione quando si ha necessità di elevate prestazioni di calcolo con basso consumo di memoria.
Come abbiamo detto la SDK e la NDK sono complementari: l’applicazione verrà creata come di consueto tramite le API della SDK, mentre qualche algoritmo potrà essere delegato alla NDK tramite tramite la Java Native Interface (JNI) library, già nota ai programmatori Java.

Conclusioni

Seppur breve, questa panoramica sull’architettura di Android ha lo scopo di far intuire la complessità e la versatilità della piattaforma che si presenta come candidata a risolvere problematiche di business di varia natura. La vision che propone un concetto di mobile migliore e più aperto di quello conosciuto attualmente forse non è così lontana.

By Andrea Como

Sono un software engineer focalizzato nella progettazione e sviluppo di applicazioni web in Java. Presso OmniaGroup ricopro il ruolo di Tech Leader sulle tecnologie legate alla piattaforma Java EE 5. In particolare: WebSphere 7.0, EJB3, JPA 1 (EclipseLink), JSF 1.2 (Mojarra) e RichFaces. In passato ho lavorato con la piattaforma alternativa alla enterprise per lo sviluppo web: Java SE 6, Tomcat 6, Hibernate 3 e Spring 2.5. Ultimamente mi sono appassionato al mondo mobile e in particolare ad Android per i motivi che potete immaginare seguendo questo blog! Nei ritagli di tempo invece sviluppo siti web in PHP e ASP e condivido le mie esperienze lavorative sul blog CoseNonJaviste. Per maggiori informazioni consulta il mio curriculum pubblico.

7 comments

  1. Android in C….sbavv! io da buon iOSsiano ho abbandonato android appena ho iniziato a bestemmiare con le interfacce grafiche…ma l’idea di programmare android in C mi alletta tantissimo!

    1. In realtà le interfacce vanno sempre programmate con gli strumenti della SDK (quindi XML+Java). Non so se ti ho dato una buona notizia 😉

  2. Ho sviluppato qualche applicazione per android ma onestamente mi era sfuggita la possibilità di sviluppare anche in C in modo complementare… sicuramente una cosa da approfondire.

  3. Bella la dritta sulla NDK, di cui non sapevo niente.. non vedo l’ora di scaricarla e provare al volo quelche riga di codice.. se non altro per portare il buon vecchio C sulle modernissime piattaforme mobile!

  4. Quindi vuol dire che nella lezione di laboratorio, poco dopo aver fatto le struct gli array ecc..ecc..

    al posso di far girare la mia rubrica in c fatta da me, posso fare il figo e farla girare su android???

    Mi sâ che dovrò stare più attento alle lezioni di programmazione lol

Comments are closed.