Android: Sicurezza, Permessi, SDK, NDK - SisInf Lab

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