Capitolo Tre
Specifiche tecniche
3.1) Nativa o ibrida?
Quando si procede alla realizzazione di un’app mobile esistono due approcci differenti: la realizzazione di un’app nativa oppure ibrida.
Le app native sono scritte nel linguaggio specifico della piattaforma sulla quale vengono eseguite. Per questo motivo devono essere realizzate in maniera distinta per ciascuna di esse. Hanno delle prestazioni elevate poiché sfruttano tutte le potenzialità del sistema operativo dove sono installate, e hanno velocità di esecuzione non raggiungibili dalle app ibride o dalle applicazioni web, perché effettuano chiamate dirette di sistema. Possono accedere a tutte le funzionalità hardware del dispositivo permettendo il massimo della personalizzazione e dell’esperienza utente.
La app ibride sono realizzate con l’utilizzo di tecnologie web, come HTML, CSS e JavaScript, e incapsulate in un “wrapper nativo”, cioè un contenitore il quale è un’applicazione nativa, che facilita l’integrazione con risorse e caratteristiche del relativo sistema operativo, e permette di sfruttare le caratteristiche del dispositivo su cui è installata. Il contenitore permette di visualizzare il “contenuto”, cioè una applicazione web-based. Esse hanno il vantaggio che solo il contenitore deve essere cambiato in funzione del dispositivo che ospita l’applicazione. Le app ibride di solito non possono accedere a tutte le caratteristiche hardware del dispositivo e in ogni caso non sono performanti e veloci come quelle native.
3.2) Scelta del framework
La scelta del framework di sviluppo ha riguardato vari aspetti. In particolare, efficienza e abbattimento dei costi, che inevitabilmente si ripercuoterebbero sulla spesa sostenuta dal cliente. Questo aspetto, come visto nel capitolo precedente, è uno dei principali ostacoli alla diffusione delle applicazioni mobile all’interno delle aziende. Fondamentale è stata la scelta di realizzare una applicazione multipiattaforma, cioè scritta una sola volta e in unico linguaggio, ma in grado di essere eseguita su più sistemi operativi.
Questo permette una riduzione drastica di tempi e costi, poiché sono necessarie meno competenze specifiche non dovendo scrivere l’applicazione nel linguaggio nativo di ciascuna piattaforma. In caso contrario, sarebbero necessari più sviluppatori che lavorino in contemporanea, oppure, un'unica persona con tutte le competenze, con conseguente dilatazione dei tempi necessari e dunque maggiori costi, dal momento che la risorsa potrebbe essere destinata ad altre attività.
Per sviluppare un’applicazione multipiattaforma è necessaria una infrastruttura di supporto che permetta la scrittura in unico linguaggio e successivamente l’esecuzione su ciascuna piattaforma mobile.
In base a quanto espresso nel paragrafo precedente, dovremmo inevitabilmente propendere per un framework che permetta di realizzare app ibride.
O forse no. La scelta è ricaduta su Titanium. Prodotto dall’azienda Appcelerator, è una piattaforma di sviluppo mobile multipiattaforma che permette di fare un ulteriore passo in avanti rispetto alla realizzazione di app ibride.
Tramite Titanium è possibile realizzare un’app utilizzando semplicemente il linguaggio JavaScript, quindi un unico linguaggio per tutti i SO, ma ottenendo una vera e propria applicazione nativa. Titanium effettua un’operazione di traduzione del codice dal linguaggio JavaScript alle API1 native della piattaforma per la quale l’app è stata
sviluppata, impegnandosi in un’attività di integrazione più profonda con l’infrastruttura sottostante. Questo permette di unire i vantaggi di app native e ibride:
1 Application Programming Interface, o Interfaccia di Programmazione di un'Applicazione, indica un
insieme di librerie software disponibili in un certo linguaggio di programmazione. Le librerie forniscono un insieme di funzioni e di strutture dati di base pronte per essere utilizzate, con un livello di astrazione tale da non richiedere il bisogno di sapere come esse funzionano, o come realizzano una particolare funzionalità.
prestazione elevate e unica scrittura del codice. Il risultato finale è in tutto e per tutto un’app nativa.
Inoltre, qualora sia necessario realizzare il sistema di funzionamento prima descritto implementato dalle piattaforme di sviluppo di app ibride, ad esempio PhoneGap2,
Titanium mette a disposizione lo strumento “WebView”, che rappresenta il contenitore nativo di cui si è parlato precedentemente. In questo modo è consentito utilizzare un contenuto web e avvolgerlo in un contenitore nativo, che nel caso di Titanium è proprio l’oggetto WebView, utile ad esempio per visualizzare un contenuto Web all’interno dell’app.
Infine, sempre nell’ottica di abbattimento dei costi, Titanium viene fornito gratuitamente da Appcelerator sotto Licenza Apache v2.03. Ciò permette di non
affrontare costi di licenza che in molti casi possono costituire spese onerose.
3.3) Titanium Appcelerator
Titanium è un SDK (Software Development Kit) che permette di creare app native per Android, iOS e BlackBerry utilizzando le librerie di API messe a disposizione.
Le applicazioni scritte in linguaggio JavaScript vengono eseguite da un motore JavaScript che effettua le chiamate alle API native. Lo sviluppatore, quindi, di fatto scrive delle applicazione native, ma utilizza il solo linguaggio JavaScript piuttosto che il linguaggio Java usato da Android, Objective-C di iOS o C++ di BlackBerry. Inoltre, può essere utilizzato per realizzare applicazioni Web, con la traduzione del linguaggio verso HTML5.
Esistono API messe a disposizione da Titanium, differenti per le varie piattaforme, per implementare particolari funzionalità che vengono realizzate in maniera differente. Si è deciso di effettuare il test dell’applicazione solo su Android, sia per motivi di praticità sia per impossibilità pratica a effettuarlo su iOS. Poiché il risultato è sempre un'applicazione nativa è necessario testarla sull’emulatore specifico della piattaforma (o su un dispositivo), che richiede l’installazione dell’ambiente di sviluppo relativo, ma
2 Phonegap è un framework opensource di sviluppo mobile che permette di realizzare app ibride,
realizzato dall’azienda canadese Nitobi e acquistato nel 2011 da Abobe Systems.
3 Licenza di software libero non copyleft, scritta dalla Apache Software Foundation (ASF), che obbliga gli
utenti a preservare l'informativa di diritto d'autore con esclusione di responsabilità nelle versioni modificate.
nel caso di iOS l’SDK e l’IDE Xcode possono essere installati solamente su computer Apple.
Titanium non è solamente l’SDK e l’insieme di strumenti che permettono di interpretare4 il codice JavaScript, tradurlo e ottenere un applicazione nativa, ma è
costituito da una serie di elementi.
Le Titanium Mobile API sono API basate su JavaScript che permettono l’accesso a tutti i componenti nativi delle varie piattaforme. Esse sono organizzate in vari namespace quali ad esempio Titanium.UI per le funzioni dell’interfaccia utente o Titanium.Network per le funzioni di rete.
Titanium Studio è un IDE (Integrated Development Environment), cioè l’ambiente di sviluppo che permette la scrittura, test e debug delle applicazioni. Da esso è inoltre possibile gestire l’utilizzo di moduli aggiuntivi e gli aggiornamenti. E’ un’estensione dell’IDE Aptana Studio basato a sua volta su Eclipse.
I moduli Titanium permettono di estendere le funzionalità base offerte dalle API, anche se in realtà le stesse API sono dei moduli, ma già disponibili. Gli sviluppatori possono scrivere i propri moduli per Android e iOS e renderli disponibili tramite il marketplace Titanium.
Infine, i servizi Cloud permettono di estendere ulteriormente le funzioni a disposizione e, ad esempio, utilizzare servizi di analisi. E’ possibile infatti avere informazioni sull’utilizzo delle proprie app, sapere su quali piattaforme sono installate, o analizzare l’uso di specifiche caratteristiche come i click su un bottone o l’accesso ai dati dell’app stessa. In generale, è possibile monitorare ogni tipo di interazione utente per fornire informazioni utili allo sviluppatore in modo da consentire di migliorare i servizi forniti. Titanium rappresenta il ponte tra il sistema operativo nativo e il codice JavaScript del programmatore, come si può vedere dalla figura seguente che mostra la sua architettura.
4 Un interprete è in grado di eseguire direttamente il codice sorgente di un programma, eseguendo le
istruzioni proprie del linguaggio, che vengono di volta in volta tradotte in linguaggio macchina. Un compilatore non esegue il programma che riceve in ingresso ma lo traduce in linguaggio macchina pronto per essere direttamente eseguito dal processore. JavaScript viene definito un linguaggio interpretato, anche se questa definizione è in realtà scorretta poiché per qualunque linguaggio può essere scritto un compilatore e un interprete.
Nella parte inferiore è presente il sistema operativo, Android, iOS, BlackBerry (non rappresentato in figura), o il browser nel caso di un applicazione Web. Nella parte superiore c’è la app scritta in linguaggio JavaScript. In mezzo la SDK Titanium e le API esposte agli sviluppatori.
Essi scrivono il codice effettuando le chiamate alle API JavaScript per realizzare le varie funzioni dell’app, quali aprire finestre, inserire tasti, accedere agli elementi hardware del dispositivo, e così via.
Il bridge Titanium chiamato Kroll e parte dell’SDK, traduce le chiamate alle API JavaScript nel loro equivalente nativo. Quando all’interno del codice viene creato un bottone, viene modificato, aggiunto un evento, Kroll si occupa di tradurre i cambiamenti nelle corrispondenti chiamate alle API native.
In questo modo vengono create app per i vari SO che hanno esattamente l’aspetto delle app sviluppate direttamente nel linguaggio nativo. Si può accedere a tutti gli elementi della piattaforma: bottoni, tabelle, navigation group, menu, animazioni, attività in background, e poi pubblicare l’app sui marketplace come l’App Store di Apple o il Play Store di Android.
Scendendo un po’ più in profondità vediamo cosa accade per arrivare dal codice sorgente alla app nativa.
Innanzitutto, Titanium precompila il codice JavaScript per minimizzarlo cioè eliminare caratteri non necessari, come gli spazi bianchi, linee di interruzione, commenti, riducendo la dimensione del documento. Il precompilatore inoltre analizza staticamente il codice costruendo una gerarchia di tutte le API utilizzate dall’applicazione. Successivamente, il codice viene passato a un interprete JavaScript che crea i file che includono le chiamate alle API specifiche della piattaforma.
Nel caso di iOS, nella fase di precompilazione il codice JavaScript viene codificato Base64 e successivamente compilato, ma non verrà tradotto in Objective-C. Rimane JavaScript e viene interpretato a tempo di esecuzione dall’interprete JavaScript JavaScriptCore.
Per Android, invece, la fase di precompilazione traduce il codice in bytecode. A tempo di esecuzione sarà sempre un interprete JavaScript, in questo caso V8, a creare il codice contenente le chiamate native.
3.4) Android
Android è un sistema operativo mobile basato su kernel5 Linux, costituito da una pila di
software organizzata su 4 differenti livelli, ognuno dei quali è composto da una serie di componenti e fornisce dei servizi ai livelli superiori. Partendo dal basso, i livelli dello stack sono il kernel Linux, il livello costituito dalle librerie native e il runtime, il livello dei framework applicativi e, infine, il livello delle applicazioni.
5 Nucleo del sistema operativo. Si occupa di fornire ai processi in esecuzione sull'elaboratore un accesso
3.4.1) Primo livello: Kernel Linux
Il livello base è il kernel Linux che rappresenta il cuore dell’intero sistema. L’ultima versione attualmente utilizzata da Android è la 3.4. Il kernel interagisce con l’hardware e racchiude tutti i driver essenziali per realizzare questa funzione. Esso svolge tutte le sue funzionalità principali come la gestione della memoria, dei processi, della rete, della batteria, la gestione delle impostazioni di sicurezza.
Il kernel agisce inoltre come livello di astrazione, permettendo la comunicazione tra i dispositivi hardware e gli altri livelli software dello stack, costituendo quello che in alcune schematizzazioni viene chiamato Hardware Abstraction Layer, e rappresentato come un ulteriore livello tra kernel e i livelli superiori.
3.4.2) Secondo livello: librerie e RT
3.4.2.1) Librerie native
Il livello successivo è quello delle librerie native. Questo livello permette ai dispositivi di manipolare differenti tipi di dati tramite le librerie che vengono esposte agli sviluppatori attraverso l’application framework.
Le librerie sono scritte in C o C++, alcune sono generiche, altre sono specifiche dell’hardware in cui vengono utilizzate. Ecco alcune tra le librerie principali.
Surface Manager è utilizzato per la gestione delle schermate. Permette di creare
schermate con l’utilizzo dell’off-screen buffering. Questo significa che è possibile selezionare vari elementi che dovranno essere inseriti all’interno della schermata, i quali vengono memorizzati nel off-screen buffer. Questi sono combinati tra loro e formano insieme la schermata finale visualizzata dall’utente.
Media framework fornisce differenti codec6 che permettono di registrare e riprodurre
svariati tipi di formati multimediali. SQLite è usato per memorizzare i dati, WebKit permette di visualizzare i contenuti HTML e SGL e OpenGL ES, infine, sono utilizzate per visualizzare contenuti 2D e 3D sullo schermo.
6 È un programma o un dispositivo che si occupa di codificare e/o decodificare digitalmente un segnale
analogico (tipicamente audio o video), affinché possa essere salvato su un supporto di memorizzazione, per permetterne la lettura o riproduzione, oppure trasmesso a distanza su un canale di comunicazione.
3.4.2.2) Android Runtime
Il Runtime consiste nella Dalvik Virtual Machine e le librerie Java Core7.
Dalvik è una virtual machine8 appositamente realizzata per dispositivi mobili che
permette di eseguire le applicazioni in maniera ottimizzata, in contesti che non hanno elevata potenza di calcolo e con limitata disponibilità di memoria.
La Dalvik virtual machine è un interprete del bytecode Dalvik, precedentemente trasformato dal bytecode Java. Infatti, differentemente alla JVM9, Dalvik non manda in
esecuzione un file .class ma esegue un file .dex, file costituito a partire dal primo a tempo di compilazione che, avendo una dimensione inferiore, fornisce efficienza in un ambiente dalle risorse limitate in termini di occupazione di memoria.
Quindi, a differenza dei sistemi convenzionali dove il software viene eseguito direttamente sul sistema operativo, le applicazioni Android girano su un’istanza della Dalvik Virtual Machine. È possibile vengano create multiple istanze della virtual machine, le quali sono eseguite simultaneamente (in maniera concorrente), fornendo
7 Rappresentano la base della piattaforma Java.
8 Indica un software il quale crea un ambiente virtuale che emula tipicamente il comportamento di una
macchina fisica grazie all'assegnazione di risorse hardware, ed in cui le applicazioni possono essere eseguite come se interagissero con tale macchina.
9 Java Virtual Machine, è il componente della piattaforma Java che esegue i programmi tradotti in
efficienza, sicurezza, isolamento, supporto per la gestione dei thread10 e della
memoria.
Il sistema di ottimizzazione della memoria è disegnato in modo da gestirla riducendo il consumo energetico al minimo. Quando un’applicazione non è utilizzata, il sistema la “sospende” e, nonostante sia tecnicamente “aperta”, la sospensione fa sì che non ci sia consumo di risorse (batteria o di elaborazione). L’applicazione viene messa in background disponibile se risulta nuovamente necessaria. Questo ha il duplice beneficio di rendere il dispositivo più reattivo, in modo che le applicazioni non debbano essere chiuse e riavviate daccapo, e di permettere alle applicazioni in background di non consumare risorse inutilmente.
Android gestisce la memoria in maniera automatica. Quando la memoria è piena, i processi (e gli elementi di un’applicazione in esso contenuti) possono essere eliminati. La decisione riguardo a quale processo rimuovere è strettamente legata allo stato dell’interazione che l’utente ha con esso e quindi il tempo di inattività del processo stesso. Il sistema calcola l’importanza di un processo in base all’elemento più importante in esso contenuto, e terminerà il processo meno importante prima di essere obbligato a terminarne altri che hanno una priorità maggiore.
Le librerie Java forniscono la gran parte delle funzionalità disponibili nelle librerie Java Core e vengono utilizzate dai programmatori per costruire le applicazioni.
3.4.3) Terzo livello: Application framework
I framework applicativi interagiscono direttamente con le applicazioni, svolgendo la funzione di middleware11, fornendo l’astrazione al livello sottostante delle librerie
native e le funzionalità di Dalvik. Mettono quindi a disposizione delle applicazioni tutti gli strumenti di cui hanno bisogno per svolgere le funzioni per le quali sono disegnate. I vari manager permettono, dunque, di utilizzare le funzioni fornite delle librerie native, senza interagire direttamente con esse.
10 Detto anche lightweight process, è un flusso (sequenziale) di controllo indipendente, fa parte di un
processo, il quale è un ambiente di esecuzione costituito appunto da uno o più thread, che vengono eseguiti concorrentemente da un sistema di elaborazione monoprocessore (multithreading) o multiprocessore.
11 Insieme di programmi informatici che fungono da intermediario tra diverse applicazioni e componenti
Gli application framework sono scritti in Java e, oltre a gestire le funzioni base del dispositivo, contengono un ricco set di elementi che possono essere usati per costruire un’applicazione, tra cui viste, text box, bottoni e altri elementi grafici.
Importanti componenti che fanno parte dell’application framework sono: - activity manager: gestisce il ciclo di vita delle applicazioni
- content providers: gestisce lo scambio di dati tra le applicazioni
- telephony manager: gestisce le chiamate vocali, viene utilizzato per accedere ad esse nelle applicazioni
- location manager: gestisce la localizzazione tramite il segnale telefonico o il GPS - resource manager: gestisce vari tipi di risorse utilizzati nelle applicazioni, come
elementi di grafica e layout, tutto ciò che non è codice
- notification manager: permette alle applicazioni di visualizzare avvisi personalizzabili nella barra di stato.
3.4.4) Quarto livello: le applicazioni
In cima alla pila dell’architettura Android vi è il livello delle applicazioni, che girano nella propria sandbox12 rappresentata dalla Dalvik virtual machine. Alcune di queste
sono pre-installate su ogni dispositivo, come la gestione delle chiamate, degli SMS, il browser, il client email, il calendario, o la gestione dei contatti.
E’ possibile scrivere un’app che sostituisce qualsiasi esistente funzione del sistema. Non c’è limitazione sull’accesso alle funzionalità. In questo modo Android apre infinite opportunità per lo sviluppatore.
Un’applicazione Android è raggruppata in un Android package cioè un file di archivio con suffisso .apk, che contiene il codice dell’applicazione sotto forma di file .dex, altre risorse necessarie all’applicazione (file multimediali, di layout) e l’AndroidManifest, un file XML di configurazione obbligatorio. Questo package è il veicolo di distribuzione e di installazione dell’applicazione sui dispositivi.
12 Ambiente che mette a disposizione del programma eseguito un sottoinsieme controllato e limitato
delle effettive risorse hardware del sistema, impedendo di effettuare operazioni potenzialmente pericolose per l'integrità del sistema stesso.
3.5) Database
Sia Android che iOS utilizzano SQLite per la gestione del database.
SQLite è una libreria scritta in linguaggio C che implementa un DBMS13 SQL. Rispetto ai
tradizionali DBMS, non è un processo stand-alone, utilizzabile separatamente e acceduto da un applicazione client, ma viene incorporato all’interno dell’applicazione stessa, diventando parte integrante del client che lo utilizza.
Grazie a questa caratteristica risulta essere molto veloce, cosa che insieme alle dimensioni notevolmente ridotte, che possono essere inferiori ai 400 KB14, fa sì che
abbia una grande diffusione. In particolare, è molto utilizzato dai browser web (Mozilla Firefox, Google Chrome, Opera) e da sistemi embedded15, come i telefoni cellulari.
Infatti, come detto, è impiegato da Android e iOS, ma anche da BlackBerry OS e Windows Phone.
SQLite memorizza l’intero database (schema, indici, dati) in un unico file sul dispositivo che lo utilizza. Inoltre, il codice della libreria è di pubblico dominio, quindi liberamente utilizzabile senza alcuna restrizione.
Lo strumento utilizzato per la creazione e la gestione del database è stato SQLite Expert Personal, versione 3.4.7. È uno strumento con interfaccia grafica che permette di amministrare database anche di grosse dimensioni.
13 DataBase Management System. È un sistema software progettato per consentire la creazione, la
manipolazione, e l'interrogazione di un database.
14 http://www.sqlite.org/different.html
15 Un sistema embedded è un sistema di elaborazione a microprocessore, progettato per svolgere un
compito preciso, con una combinazione di hardware e software specificamente studiata, spesso inseriti all’interno di sistemi meccanici o elettronici di grosse dimensioni. Grazie alla specificità delle funzioni svolte è possibile ridurre dimensioni e costi, fornendo prestazioni elevate in sistemi che in molti casi hanno risorse computazionali limitate. Si contrappongono ai sistemi general-purpose come i PC, e ne sono un esempio telefoni cellulari, elettrodomestici, l’elettronica di consumo, centraline di controllo sugli autoveicoli.