Fondamenti di Sistemi Operativi DEI - Politecnico di Bari Il sistema operativo Android • • • Sicurezza e permessi Panoramica SDK Codice nativo con NDK Letture consigliate: • Il sistema operativo Android http://www-ictserv.poliba.it/piscitelli/doc/lucidiSO_ElTlc_270/IL%20SISTEMA%20OPERATIVO%20ANDROID.pdf A.A. 2016-2017 1 Fondamenti di Sistemi Operativi DEI - Politecnico di Bari Sicurezza: architettura • Di default un’ applicazione non può effettuare alcuna operazione che possa interferire con altre applicazioni o con il S.O.: • Lettura/scrittura di dati privati (contatti, e-mail, SMS,…) • Lettura/scrittura di file appartenenti ad altre applicazioni • Accesso alla rete internet (UMTS, GPRS, WiFi) • Gestione energetica (es. mantenere il dispositivo acceso) A.A. 2016-2017 2 Fondamenti di Sistemi Operativi DEI - Politecnico di Bari File androidManifest.xml • Ciascuna applicazione deve specificare un file androidManifest.xml (con esattamente questo nome ) nella radice della directory • Il manifest indica le informazioni necessarie al S.O. per poter avviare l’applicazione: • Definisce il nome del package (serve come identificativo univoco dell’applicazione) • Descrive le componenti dell’applicazione (activity, service, broadcast receivers, content providers) • Dichiara i permessi che l’applicazione deve avere per poter accedere a parti protette della API e per poter interagire con le altre applicazioni • Dichiara i permessi che altre applicazioni devono avere per poter interagire con le componenti dell’applicazione • Dichiara il livello minimo delle API per poter eseguire l’applicazione • Elenca le librerie necessarie A.A. 2016-2017 3 Fondamenti di Sistemi Operativi DEI - Politecnico di Bari File androidManifest.xml: esempio <manifest xmlns:android-http://schemas.android.com/apk/res/android package=“com.package.Sample”> <permission android:name="com.example.project.PERMISSION" . . . /> <permission-tree … /> <permission-group … /> <application android:icon="@drawable/icon“ android:label="@string/app_name"> <activity android:name=".Sample" android:label="@string/app_name“ android:permission="com.example.project.PERMISSION"> </activity> </application> <uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="com.example.project.PERMISSION" /> </manifest> A.A. 2016-2017 4 Fondamenti di Sistemi Operativi DEI - Politecnico di Bari Tag <uses-permission> <uses-permission android:name="string" /> • Il tag consente di dichiarare i permessi necessari ad una applicazione per essere eseguita correttamente • I permessi specificati sono presentati all’utente in fase di installazione • L’attributo android:name specifica il nome del permesso: • un permesso custom, definito dalla applicazione stessa o da un’altra applicazione mediante il tag <permission>. • un permesso predefinito del S.O. Android, per l’accesso a servizi nativi che implicano possibili rischi per la sicurezza (SMS, GPS, connessione dati, ecc.) Esempi: <uses-permission android:name=”android.permission.ACCESS_LOCATION” /> <uses-permission android:name=”android.permission.CAMERA” /> A.A. 2016-2017 5 Fondamenti di Sistemi Operativi DEI - Politecnico di Bari Tag <permission> <permission android:description="string resource" android:icon="drawable resource" android:label="string resource" android:name="string" android:permissionGroup="string" android:protectionLevel=["normal" | "dangerous" | "signature" | "signatureOrSystem"] /> • Le applicazioni possono definire dei permessi per l’accesso a componenti e funzionalità condivise • Il permesso viene successivamente riferito ad una singola componente o all’intera applicazione mediante il tag android:permission • Le altre applicazioni devono includere un tag <uses-permission> con stesso attributo name per utilizzare le componenti condivise e protette • L’attributo name specifica il nome univoco del permesso. Si utilizza come prefisso il nome del package ("com.example.project.PERMITTED_ACTION”) • L’attributo protectionLevel caratterizza la tipologia di rischio ed indica al S.O. la procedura da seguire per garantire o meno il permesso A.A. 2016-2017 6 Fondamenti di Sistemi Operativi DEI - Politecnico di Bari Tag <permission-group> e <permission-tree> <permission-group android:description="string resource" android:icon="drawable resource" android:label="string resource" android:name="string" /> <permission-tree android:icon="drawable resource" android:label="string resource" ] android:name="string" /> • • permission-group: dichiara una categoria di un gruppo logico di permessi • Non definisce un permesso • I singoli permessi si aggiungono al gruppo mediante l’attributo android:permissionGroup di <permission> permission-tree: dichiara il nome della radice (namespace) di un albero di permessi. • Non definisce un permesso • L’applicazione può aggiungere dinamicamente nuovi permessi all’albero • Il name deve essere univoco A.A. 2016-2017 7 Fondamenti di Sistemi Operativi DEI - Politecnico di Bari Accesso a risorse condivise • Ciascuna applicazione può consentire l’accesso alle proprie risorse mediante la dichiarazione dei permessi nel file manifest • Esempio: se una applicazione definisce un Content Provider deve definire i permessi richiesti alle altre applicazioni per poter accedere al contenuto A.A. 2016-2017 8 Fondamenti di Sistemi Operativi DEI - Politecnico di Bari Condivisione USER ID • Android consente di eseguire due applicazioni nello stesso processo: • Occorre che lo sviluppatore firmi le due applicazioni con lo stesso certificato • Nel file manifest di ciascuna applicazione deve essere specificato l’attributo sharedUserID con lo stesso valore • Esempio: android:sharedUserId="com.share.sharedapp” • Le applicazioni con lo stesso userID possono accedere indifferentemente e senza limitazioni ai rispettivi dati A.A. 2016-2017 9 Fondamenti di Sistemi Operativi DEI - Politecnico di Bari • Data storage Android prevede diversi meccanismi per la memorizzazione dei dati di una applicazione: • Shared Preferences: memorizza dati privati in array associativi → array i cui elementi sono accessibili mediante nomi • Utile per memorizzare impostazioni o preferenze di una applicazione • Internal Storage: memorizza i dati nella memoria interna • I file privati non possono essere aperti dalle altre applicazioni • External Storage: memorizza i dati nella memoria esterna condivisa (scheda SD) • Tutte le applicazioni possono accedere ai file su scheda SD • Occorre verificare la presenza e le caratteristiche della scheda SD inserita (può essere sostituita o rimossa) • SQLite Database: Memorizza dati strutturati in un database • Network Connection: Memorizza dati sul web mediante un server di rete. I packages java.net and android.net forniscono le classi per gestire l’accesso a dati via internet A.A. 2016-2017 10 Fondamenti di Sistemi Operativi DEI - Politecnico di Bari Data storage: preference • La gestione delle preferenze (Preference) è un meccanismo di Android per memorizzare e leggere dati da una mappa o array associativo • Le preference sono utilizzate di solito per mantenere informazioni sullo stato e per condividere dati fra diverse Activity di una applicazione • Ciascun entry è nel formato <key value> • • La chiave (key) è una stringa • Il value deve essere un tipo di dato primitivo L’interfaccia API consente diverse modalità per l’accesso alle preferenze: • getPreferences(): all’interno di una Activity, per accedere alle preferenze specifiche • getSharedPreferences(): per accedere alle preferenze condivise a livello di applicazione • getDefaultSharedPreferences(): per accedere alle preferenze globali del S.O. Android A.A. 2016-2017 11 Fondamenti di Sistemi Operativi DEI - Politecnico di Bari Preferences API: funzionamento • Tutti i metodi della API restituiscono un oggetto il cui contenuto può essere manipolato mediante un editor che utilizza comandi putXXX e getXXX per memorizzare i dati • I dati salvati nell’oggetto Preference vengono successivamente scritti in un file XML nella memoria interna XXX = { Long, Int, Double, Boolean, String } A.A. 2016-2017 12 Fondamenti di Sistemi Operativi DEI - Politecnico di Bari Resource file • I resource file sono file esterni che sono utilizzati internamente nel codice dell’applicazione • Android supporta diversi tipi di resource file (XML, PNG, JPEG, ecc.) • I file XML sono compilati in un formato interno per velocizzare il caricamento • Le stringhe sono compresse in un formato che ottimizza lo spazio necessario per la memorizzazione Una applicazione Android consiste in codice Java e file di risorsa aggiuntivi, memorizzati in un file .apk A.A. 2016-2017 13 Fondamenti di Sistemi Operativi Resource file DEI - Politecnico di Bari • Per utilizzare un file risorsa, occorre inserirlo nella directory corretta dei sorgenti • In tabella è visualizzato l’elenco delle cartelle dei file resource Directory Resource type res/anim/ File xml che descrivono delle animazioni res/drawable/ Questa directory deve essere usata per le immagini necessarie al software. Sono supportati i formati PNG e JPEG res/layout/ File XML per specificare il layout delle interface utente res/values/ File XML che descrivono stringhe e altri parametri utilizzati dall’applicazione. res/xml/ Questa directory ospita file XML di tipo qualsiasi, che il sistema interpreta e rende semplici da acquisire res/raw/ Questa directory ospita file binari di tipo qualsiasi (ad esempio audio o filmati) che vengono copiati nell’ .apk e l’applicazione poi carica A.A. 2016-2017 14 Fondamenti di Sistemi Operativi DEI - Politecnico di Bari External Storage • Un dispositivo Android dispone di un External Storage, tipicamente una SD card, rimovibile o meno • Tutti i file e le directory salvate all'interno dalla SD sono accessibili da parte di tutte le app • Per poter accedere in lettura non è necessario specificare alcun permission, mentre in scrittura è necessario specificare il permesso: android.permission.WRITE_EXTERNAL_STORAGE A.A. 2016-2017 15 Fondamenti di Sistemi Operativi DEI - Politecnico di Bari • Database su Android: SQLite Android utilizza un programma integrato sqlite3 per la gestione di un database, che consente di: • Creare un database • Definire tabelle SQL, indici, query, viste, ecc. • Inserire tuple nelle tabelle, rimuoverle o editarle • Eseguire query e gestire un database • SQLite implementa la maggior parte dello standard SQL-92 • Dalla versione Froyo 2.2 sono supportati i vincoli di integrità referenziali tramite foreign key • SQLite utilizza una tipizzazione dei dati meno rigida: • • Anzichè assegnare il tipo ad una colonna (INT, VARCHAR, ecc.) sono assegnati a valori individuali • Ad esempio è possibile inserire un numero in una colonna di tipo stringa Un database SQLite è privato: pertanto se una app vuole esporne il contenuto dovrà farlo mediante i Content Provider A.A. 2016-2017 16 Fondamenti di Sistemi Operativi DEI - Politecnico di Bari MapView • Android utilizza una libreria esterna Google Maps per aggiungere le funzionalità di navigazione e visualizzazione delle mappe ad una applicazione di terze parti • L’oggetto MapView visualizza una mappa con i dati ottenuti dal servizio Google Maps • Quando MapView ha il focus, cattura l’input dell’utente (pressione di tasti e dello schermo touch) • Gestisce automaticamente zoom e trascinamento della mappa • Gestisce le connessioni al server per il download dei tile della mappa • Fornisce tutti gli elementi della GUI necessari all’utente per controllare la mappa • Occorre dichiarare nel manifest i seguenti permessi (da accettare in fase di installazione) • • <uses-library android:name="com.google.android.maps" /> • <uses-permission android:name="android.permission.INTERNET“/> Per utilizzare le mappe di Google Maps è necessario registrarsi al servizio web ed ottenere una APIKey A.A. 2016-2017 17 Fondamenti di Sistemi Operativi DEI - Politecnico di Bari Location Based Service • Un servizio Location Based (LBS) è un sistema che consente di fornire informazioni geolocalizzate a dispositivi mobili • I servizi LBS sono utilizzati in diversi ambiti: • • Commerciale • Intrattenimento • Situazioni di emergenza • Salute • Lavoro • … Esempi: • trovare la posizione di punti di interesse nelle vicinanze (banca, ristorante, ospedale ecc.) • Fornire infomazioni per la mobilità (calcolo di percorsi) • Social network per trovare e raggiungere eventi, amici o familiari A.A. 2016-2017 18 Fondamenti di Sistemi Operativi DEI - Politecnico di Bari Sistema GPS • Il sistema Global Positioning System (GPS) consiste di 31 (2017) satelliti operativi orbitanti attorno alla Terra (e altri dismessi, messi in funzione in caso di necessità) • Sviluppato dagli USA come sistema militare, è stato reso disponibile per usi civili • Le orbite sono disposte in modo che in ogni punto della Terra ci siano almeno 4 satelliti visibili • L’antenna GPS funziona sfruttando il principio della trilaterazione • localizza 3 o più satelliti • calcola la distanza • interseca le sfere di raggio pari a ciascuna distanza e individua il punto sulla superficie terrestre A.A. 2016-2017 19 Fondamenti di Sistemi Operativi DEI - Politecnico di Bari • • • Localizzazione su Android Le API Android consentono la localizzazione utilizzando diversi metodi tra cui • Cell Tower Triangulation: utilizza il principio della trilaterazione sulla base dei ping verso 3 torri delle celle telefoniche nelle vicinanze (bassa precisione) • GPS Tramite un gestore (Location Manager) è possibile accedere ai seguenti servizi: • Ottenere aggiornamenti periodici sulla posizione geografica del dispositivo • Lanciare un Intent di notifica quando il dispositivo è nelle vicinanze di una posizione geografica L’antenna GPS non è un dispositivo sincrono (non risponde immediatamente) A.A. 2016-2017 20 Fondamenti di Sistemi Operativi Overlay e GeoCoding DEI - Politecnico di Bari • Un Overlay è un layer trasparente che può essere sovrapposto ad una MapView • Può incorporare diversi oggetti grafici (es. icone o immagini su punti della mappa) • Geocoding: processo per la trasformazione di un indirizzo o altro elemento cartografico in una coppia di coordinate (latitudine longitudine) • Reverse geocoding: è il processo per trasformare le coordinate in un indirizzo. • Il livello di dettaglio ottenuto dal reverse geocoding varia in funzione del punto A.A. 2016-2017 21 Fondamenti di Sistemi Operativi DEI - Politecnico di Bari Librerie native con NDK • Native Development Kit (NDK): tool che consente di implementare parte di una applicazione utilizzando un linguaggio nativo come C/C++ • Scenari di utilizzo: • Riutilizzo di librerie rilasciate in codice nativo • Accelerazione delle prestazioni di routine CPU-intensive (elaborazione di segnali, simulazioni fisiche, ecc.) • Porting di intere applicazioni e giochi (a partire da Android 2.3) • NDK fornisce: • Toolchain basata su GNU make per automatizzare la compilazione del codice • Cross-compilatore gcc compatibile con il set di istruzioni ARM • Tool per includere le librerie native nel package .apk • Un set di header e librerie standard compatibili con le versioni attuali e future di Android • Due modalità di sviluppo di applicazioni: JNI e Native Activity A.A. 2016-2017 22 Fondamenti di Sistemi Operativi DEI - Politecnico di Bari NDK: Librerie standard A.A. 2016-2017 23 Fondamenti di Sistemi Operativi DEI - Politecnico di Bari Dalvik vs C++ Facilmente estendibile Sviluppo flessibile Accesso alle API Android Gestione automatica della memoria Comune ad altre piattaforme Codice di basso livello Aumento delle prestazioni A.A. 2016-2017 24 Fondamenti di Sistemi Operativi DEI - Politecnico di Bari Java Native Interface (JNI) • L’applicazione principale è una Activity o un Service • JNI consente di utilizzare le API delle librerie native all’interno del codice Java • Le librerie utente native richiamano le librerie di sistema mediante la Application Binary Interface (ABI) che definisce: • istruzioni in linguaggio macchina per le system call al kernel • Formato dei parametri di input • Formato dei dati di ritorno A.A. 2016-2017 25 Fondamenti di Sistemi Operativi Sviluppo con NDK: setup progetto DEI - Politecnico di Bari Setup progetto • Tramite il wizard di Eclipse viene creato un progetto Android con il supporto di librerie native • I file di configurazione e gli script vengono creati automaticamente • Il programmatore deve scrivere manualmente i file make Makefile Interfacce Java Generazione header con javah Build e Deploy Debug A.A. 2016-2017 26 Fondamenti di Sistemi Operativi DEI - Politecnico di Bari Sviluppo con NDK: Makefile Setup progetto Makefile Interfacce Java Generazione header con javah Build e Deploy Debug A.A. 2016-2017 27 Fondamenti di Sviluppo Sistemi Operativi DEI - Politecnico di Bari Setup progetto Makefile Interfacce Java Generazione header con javah Build e Deploy con NDK: interfacce – header deploy • Per richiamare le librerie native in Java è sufficiente definire il prototipo dei metodi (native) • Tramite il tool javah viene generato il file header in C, in base alle definizioni contenute nel codice Java • Il codice C/C++ deve implementare i prototipi delle funzioni rispettando il formato del file header generato • La compilazione del codice avviene mediante il programma ndk-build • Il compilatore genera i file di libreria .so • Tramite lo script build.xml è possibile generare il file apk con ant (ant debug o ant release) • ant install installa l’apk su dispositivo Debug A.A. 2016-2017 28 Fondamenti di Sistemi Operativi Sviluppo con NDK: Debug DEI - Politecnico di Bari Setup progetto Makefile Interfacce Java • Per il debug si utilizza il comando ndk-gdb • Viene avviato gdbserver su dispositivo • La comunicazione avviene tramite Remote Serial Protocol (gdb-rsp), mediante scambio di messaggi tra host e dispositivo • Il computer host si connette tramite socket al dispositivo • E’ possibile usare Eclipse o Visual Studio come front end per il debug Generazione header con javah Build e Deploy Debug A.A. 2016-2017 29