Piattaforme di Sviluppo - Sistemi Mobili M 1 1 Sistemi Mobili M Alma Mater Studiorum - Università di Bologna CdS Laurea Magistrale in Ingegneria Informatica II Ciclo - A.A. 2014/2015 Corso di Sistemi Mobili M (8 cfu) 04 – Piattaforme di Sviluppo (e non solo): Panoramica, J2ME e Android Docente: Paolo Bellavista [email protected]http://lia.disi.unibo.it/Courses/sm1415-info/ http://lia.disi.unibo.it/Staff/PaoloBellavista/
90
Embed
04 Piattaforme di Sviluppo (e non solo) Panoramica, …lia.deis.unibo.it › Courses › sm1415-info › lucidi › 04...Panoramica su Piattaforme di Sviluppo Prevalentemente a livello
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Lanciato da Google nel 2007 come piattaforma Apache free-software, basato su Linux
Applicazioni sviluppate in linguaggio Java e compilate in Dalvik Executable format (DEX – bytecode di tipo custom, ad es. più compatto di usuali .class)
Sottoinsieme abbastanza ampio di J2SE + ricca libreria di funzionalità di supporto (Android SDK) a disposizione della comunità di sviluppatori Gestione touch screen, sensori locali (accelerometri, GPS, …),
grafica 3D, supporto per location-based service, …
Anche qui problemi di frammentazione fra versioni diverse di SO e utilizzo di estensioni dello stack di supporto (data la apertura della soluzione)
Piattaforme di Sviluppo - Sistemi Mobili M 10
Un Confronto su un’Applicazione Giocattolo
(Gavalas et al, IEEE Software, 2011)
Piattaforme di Sviluppo - Sistemi Mobili M 11
Un Primo Confronto
Piattaforme di Sviluppo - Sistemi Mobili M 12
Un Primo Confronto
Piattaforme di Sviluppo - Sistemi Mobili M 13
Un Primo Confronto
Piattaforme di Sviluppo - Sistemi Mobili M 14
Un Primo Confronto
Piattaforme di Sviluppo - Sistemi Mobili M 15
Un Primo Confronto
Piattaforme di Sviluppo - Sistemi Mobili M 16
Scendiamo maggiormente nel dettaglio:
Java 2 Micro Edition
In termini generali, diverse edizioni di “distribuzioni” Java
Ruolo centrale
dello stack
KVM +
CLDC +
MIDP
Piattaforme di Sviluppo - Sistemi Mobili M 17
JSR 248:
Mobile Service Architecture (MSA)
17
In realtà, situazione più
complicata e
articolata
Importanti problemi di
frammentazione
MSA, in due
versioni:
full (17/14) o
subset (8/9)
Piattaforme di Sviluppo - Sistemi Mobili M 18
J2ME: Configurazioni e Profili
Una configurazione definisce una piattaforma minima
per un raggruppamento orizzontale di dispositivi
Requisiti analoghi su memoria e capacità computazionali
Definisce caratteristiche linguaggio Java e virtual machine
disponibile su tale gruppo di dispositivi
“A Configuration is a specification that defines a minimum Java Platform
functionality for a family of devices. It defines the minimum number of Java
libraries, VM capabilities, Security specification, and a Generic Connection
Framework.”
Profilo come insieme di API aggiuntive che estendono una
configurazione con capacità utili per un gruppo specifico
di dispositivi “A Profile is a collection of Java APIs that supplement a Configuration to
provide capabilities for a specific device group or market type.”
Piattaforme di Sviluppo - Sistemi Mobili M 19
J2ME: Configurazioni Disponibili
Connected Device Configuration (CDC)
Tipicamente per dispositivi con maggiori risorse computazionali che non low-end device come telefoni (ancora valido oggi?)
Ad esempio set-top box, inizialmente alcuni tipi di PDA, …
Connected, Limited Device Configuration (CLDC)
Per dispositivi con risorse particolarmente limitate
Macchina virtuale per CLDC: Sun’s Kilo Virtual Machine (KVM) Piccolo footprint di memoria (60K)
Memoria minima totale = 160K
Processori 16/32-bit
Velocità processore = da 8 a 32MHz
Hardware tipico configurazione CLDC
Per CLDC l’unico requisito forte è dimensione di memoria disponibile: Almeno 128K non-volatile per KVM e librerie CLDC
Almeno 32K volatile per KVM runtime
Piattaforme di Sviluppo - Sistemi Mobili M 20
Profili J2ME
Ogni profilo definisce requisiti per una famiglia di
dispositivi associati a uno specifico mercato verticale
Estende (con un layer superiore) una configurazione. Sempre on
top di una delle configurazioni previste
Definisce una piattaforma Java standardizzata per una famiglia di
dispositivi a fini di interoperabilità (tentativo di ridurre problema di
frammentazione)
Include librerie di classi con granularità più fine che non in una
configurazione
Profili disponibili:
Mobile Information Device Profile (MIDP)
on top of CLDC. Include funzionalità GUI aggiuntive, supporto
multimedia e gaming, sicurezza end-to-end, supporto esteso a
connettività di rete per telefoni mobili e PDA entry-level
Piattaforme di Sviluppo - Sistemi Mobili M 21
Profili J2ME Disponibili
(continua…)
…
Foundation Profile on top of CDC. Insieme di API Java di base per dispositivi con
capacità limitate; punto cruciale è mancanza di supporto GUI standard
Personal Profile
on top of CDC. Assieme a Foundation Profile, Personal Profile realizza l’ambiente per sviluppo di applicazioni adatto a PDA high-end. Personal Profile include l’insieme completo di API AWT, supporto per applet e Xlet
Personal Basis Profile
on top of CDC. Fornisce un ambiente di sviluppo per applicazioni con connettività di rete e un livello elementare di supporto grafico alla presentazione contenuti
Piattaforme di Sviluppo - Sistemi Mobili M 22
MIDP: Requisiti Hardware
Memoria (in aggiunta a quella per CLDC)
128K non-volatile per componenti MIDP
8K non-volatile per dati persistenti delle applicazioni
32K volatile per KVM
Display
Schermo almeno 96x54 pixel
Display depth (o color depth o bit per pixel) almeno pari a 1-bit
Applicazioni MIDP vengono indicate con il termine “MIDlet”
Modello MIDlet è per molti versi simile al modello applet in J2SE: modello componente-container e gestione ciclo di vita
Anche supporto a sicurezza per applicazioni che condividono risorse/dati (tramite MIDlet Suite)
Ciclo di vita MIDlet descritto da transizioni di stato in stato, come indicato a fianco: Start – acquisizione risorse e inizio esecuzione Pause – rilascio risorse e ingresso stato di
“quiescenza” (wait) Destroy – rilascio risorse, distruzione thread e
fine di tutte le attività
Java Application Manager (JAM) per gestione ciclo di vita MIDlet
Pause
Active
Destroyed
sta
rtA
pp
d
es
tro
yA
pp
pa
us
eA
pp
de
str
oyA
pp
Piattaforme di Sviluppo - Sistemi Mobili M 26
Tipico Stack Supporto J2ME
Mobile Information
Device Profile
KVM
CLDC = KVM + J2ME Core
API in questo esempio DSP chip
(e.g., ARM)
J2ME core APIs
Your
MIDlet Pagine gialle, orario treni e biglietteria, giochi, …
UI, HTTP networking, ...
Supporto thread,
no floating point…
32-bit RISC, 256K ROM, 256K Flash, 64K RAM
KVM + CLDC + MIDP: si realizzano applicazioni on top di questo
stack standardizzato, indipendenti da SO e dettagli hw
Piattaforme di Sviluppo - Sistemi Mobili M 27
CLDC/MIDP:
qualche Dettaglio su Package Principali Package
javax.microedition.io
javax.microedition.lcdui (user interface per display lcd)
javax.microedition.midlet
javax.microedition.rms (persistent storage)
Supporto a widget per GUI utente Form, TextField, TextBox, DateField, List, Image, Gauge, Alert,
Canvas, Graphics, Display
Due differenti tipologie di API (livello di astrazione più alto e più basso) per gestione GUI
High level per widget, scrolling, ...
Low level per grafica e controllo GUI fine-grained
Classi per gestione eventi – Command e CommandListener
Più importante: è per tutti ovvio, vero , qual è il modello di threading sottostante?
Piattaforme di Sviluppo - Sistemi Mobili M 28
Solito “Hello World”
in forma di MIDlet
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
public class HiMIDlet extends MIDlet {
private TextBox textbox;
public HiMIDlet() {
textbox = new TextBox ("", "Hello World!", 20, 0);
}
public void startApp() {
Display.getDisplay(this).setCurrent(textbox);
}
public void pauseApp() {}
public void destroyApp(boolean unconditional) {}
}
Piattaforme di Sviluppo - Sistemi Mobili M 29
MIDlet:
Gestione Semplice GUI import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class HelloWorld extends MIDlet implements
CommandListener { private Form mainscreen; private Form detailsscreen; private Display myDisplay; private Command exitCommand; private Command resetCommand; private Command detailsCommand; public HelloWorld(){ myDisplay = Display.getDisplay(this); mainscreen = new Form("Hello World"); detailsCommand = new Command("Details",Command.SCREEN, 1); resetCommand = new Command("Reset",Command.SCREEN,1); exitCommand = new Command("Exit", Command.EXIT, 1); }
Piattaforme di Sviluppo - Sistemi Mobili M 30
StringItem strItem = new StringItem("Hello", " World"); mainscreen.addCommand(detailsCommand);
XML over HTTP/HTTPS Uso più diffuso di recente grazie a disponibilità di vari parser
Model: crea rappresentazione a oggetti di documento in memoria, ad es. DOM
Push: fa parsing di un intero documento, distribuendo eventi ai listener registrati, ad es. SAX
Pull: fa parsing di una porzione di documento alla volta, restituendo singolo elemento o tag
Inoltre, molto spesso, sfruttamento funzionalità fornite da JSR addizionali: fra tutte, JSR82 (Bluetooth), JSR179 (Location), JSR135 (Mobile Media), JSR180 (SIP), JSR172 (Web Services)
Piattaforme di Sviluppo - Sistemi Mobili M 40
Esercitazione su J2ME: Come si Progetta Applicazione MIDlet
Identificare i dispositivi target
Identificare i profili supportati da quei dispositivi
Sviluppare applicazione Ad esempio, se in forma di MIDlet perché supportato
CLDC/MIDP, applicazione adatta per cellulari e piccoli pager
Richiede che l’ambiente di sviluppo sia integrato con ambiente CLDC/MIDP: MIDP reference implementation http://www.oracle.com/technetwork/java/index-jsp-138820.html
Possibilità di esecuzione per validazione e testing su emulatori MIDP Ad esempio si può utilizzare J2ME Wireless Toolkit e ktoolbar
per creare un progetto, progettare, implementare, configurare e validare la MIDlet
Probabilmente sarete più comodi a utilizzare Eclipse ME http://eclipseme.org/
sicurezza completo di J2SE Implementazione dei soli domini di protezione J2SE è più
grande dell’intera implementazione CLDC
Quindi, come implementare una qualche soluzione di
sicurezza per J2ME?
Linea guida - dividere il problema in due parti:
Sicurezza a livello VM (low-level)
Garantita dal verificatore a due fasi per class file inserito
in CLDC
Sicurezza a livello applicativo
Modello sandbox
Piattaforme di Sviluppo - Sistemi Mobili M 45
Sicurezza:
Verificatore di Class File a 2 Fasi
Verifica off-device Strumento per pre-verifica aggiunge un attributo “stack map” a
ogni metodo nel file class Java per facilitare verifica in-device
Processo di pre-verifica (oneroso computazionalmente) è eseguito su
un sistema server o desktop prima che class file sia scaricato sul
dispositivo mobile
“stack map” aiuta poi a rendere più efficiente verifica in-device
più veloce
minore codice in VM e minore consumo memoria
Verifica in-device Verifica ambiente (ad es. requisiti memoria per esecuzione)
Bytecode check
Type check
Terminazione “propria”, ovvero opportuna (ad es. no istruzioni di
salto incondizionato)
Piattaforme di Sviluppo - Sistemi Mobili M 46
Stack map attribute accresce dimensione di classfile di circa 5%
Sicurezza:
Verificatore di Class File a 2 Fasi
Piattaforme di Sviluppo - Sistemi Mobili M 47
Sicurezza a Livello Applicativo:
Modello Sandbox
Applicazioni (MIDlet ma non solo) devono eseguire in un
ambiente chiuso da cui possono avere accesso solo alle
API definite da configurazione, profilo e da classi licenziate
supportate dal dispositivo Vi ricordate, vero, il modello di esecuzione in sandbox delle applet?
Più specificamente modello sandbox per MIDlet prevede: Class file devono essere stati adeguatamente verificati (garanzia
di essere validi)
Garanzia che sono disponibili all’applicazione solo le API definite da
CLDC, profilo e classi di estensione licenziate
Download applicazione avviene a livello cosiddetto nativo
(native code level) tramite Java Application Manager (JAM)
Vietato fare overriding del meccanismo di class loading standard
Vietato l’accesso a insieme di funzioni native che VM può utilizzare
Piattaforme di Sviluppo - Sistemi Mobili M 48
Android: Architettura
Classica architettura di tipo gerarchico, strutturata a layer (a
complessità crescente dal basso verso l’alto)
Livelli:
Linux kernel
Librerie (native Linux)
+ Android runtime
(Dalvik VM + librerie
core)
Application
Framework
Applicazioni
Piattaforme di Sviluppo - Sistemi Mobili M 49
Android: Architettura
Kernel Layer basato su classico kernel Linux
v3.x ed evoluzioni
introduce Hardware Abstraction Layer (HAL)
Libraries in linguaggio nativo (C/C++)
Android Runtime ambiente di esecuzione delle
applicazioni, scritte in Java
basato su Dalvik VM
Application Framework fornisce servizi evoluti, sempre
incapsulati in oggetti Java, alle applicazioni
Application Core App: fornite dal sistema
App scritte dagli sviluppatori…
Piattaforme di Sviluppo - Sistemi Mobili M
Android:
curiosità su evoluzione versioni
Ice Cream Sandwich 4.0.1 (Ottobre 2011) Linux kernel 3.0.1; launcher personalizzabile; App "Contatti" con integrazione social network; Android Beam (scambio di dati tramite NFC); Wi-Fi Direct, etc. etc.
Piattaforme di Sviluppo - Sistemi Mobili M
Android:
curiosità su evoluzione versioni Jelly Bean 4.1.1 (Luglio 2012) Linux kernel 3.1.10; nuove funzionalità per condivisione foto/video tramite NFC; riconoscimento vocale avanzato; abbandono ufficiale al supporto Adobe Flash, etc. etc.
Kit Kat 4.4 (Ottobre 2013) Supporto per 3 nuovi tipi di sensore (vettore di rotazione geomagnetica, rilevatore e contatore di passi), aggiunta funzione contapassi; diminuito consumo batteria durante riproduzione audio; Android RunTime (ART) e nuovo compilatore, in via sperimentale, attivabile dalle Opzioni Sviluppatore (non su tutti dispositivi); ottimizzato funzionamento su dispositivi con poca RAM, …
Key Lime Pie 5.0 (Novembre 2014) Introduzione di Google Fit per attività fisiche; nuovo kernel Linux 3.10.x.; eliminazione della runtime Dalvik in favore di ART; supporto nativo a 64 bit; Bluetooth 4.1; miglioramento prestazioni grafiche grazie supporto OpenGL ES 3.1; miglioramento fotocamera grazie ad API dedicate; aggiunto multi-utente su smartphone; …
Piattaforme di Sviluppo - Sistemi Mobili M 52
Kernel Linux 3.x
Hardware Abstraction Layer (HAL)
Gestione memoria
Gestione processi
Network stack
Power management standard Linux
…
52
Estensioni kernel Ashmem: gestore della memoria
condivisa; reference counting e deallocazione automatica da parte del kernel
Binder IPC: minimo overhead grazie all’uso di Ashmem (maggiore disciplina di accesso tramite descrittore di blocco di memoria)
Power Management avanzato: uso di varie politiche di gestione energia attraverso i WakeLock
Android:
SO Kernel Layer
Non è un vero e proprio SO kernel Linux. Mancano: Sistema gestione finestre nativo
Completo supporto GNU C library
Completo supporto utility standard Linux
Piattaforme di Sviluppo - Sistemi Mobili M 53
Power Management
e WakeLock
Esempio evidente di cross-layering
Applicazione Android (con permessi di accesso a Power Manager) può ottenere controllo consumi energetici imponendo politica desiderata:
CPU sempre attiva, anche con display spento
CPU prioritaria con display almeno retroilluminato
…
Tramite WakeLock: lock di accesso alle funzionalità di Power Manager (diverse tipologie di WakeLock). Ad es:
Activity Una singola azione che l’utente può compiere attraverso una finestra (corrisponde di solito ad una schermata) È componente fondamentale in Android
Ad es. home activity
Intent Massima riusabilità delle activity Richiesta di compiere un’operazione (ad es. selezione numero telefonico) Raccolta da un componente che ha un Intent Filter compatibile
Service In esecuzione in background (no interazione con utente come activity) Utilizzabile da 1+ componenti No processo/thread dedicato in background
Broadcast Receiver Risponde agli Intent compatibili eseguendo le operazioni previste In genere, azioni di notifica (chiamata, sms) Ciclo di vita limitato alla risposta
Android:
Application Framework
Piattaforme di Sviluppo - Sistemi Mobili M 56
Package e Activity Manager Gestiscono cicli di vita delle Activity e delle app, contenute in Android Package
(APK). Ogni APK contiene un descrittore (manifest), l’eseguibile dex e le risorse (xml, png, …), secondo una struttura di file system fissa e predefinita
Window Manager e View System Offrono servizi grafici evoluti impiegati direttamente dalle app. View System si basa
su classe View, ovvero componenti grafici che interagiscono con l’utente e responsabili della gestione degli eventi (no Java Swing e AWT)
Applications
Resource Manager e Content Provider Gestione risorse (tutti file eccetto codice) e accesso
condiviso a dati locali (RDBMS SQLite e persistenza tramite file)
Telephony, Notification, Location Manager
Consentono di accedere alle funzionalità telefoniche, di notifica e di localizzazione
Android: Application Framework
Piattaforme di Sviluppo - Sistemi Mobili M 57
Core Application
Applicazioni vere e proprie (stesso modello di esecuzione che per
applicazioni sviluppate da terze parti e scaricate in secondo momento), pre-installate a default su macchine Android
Home application (e activity correlata): applicazione manager da cui è possibile lanciare esecuzione di altre applicazioni. Quale modello di threading?
Gestione messaggistica
Applicativo cliente per email
Rubrica contatti
Gestione mappe
Browser Web: browser engine WebKit
(open-source); utilizzato anche in Safari
e Google Chrome
Solo browser engine (parser HTML +
renderer + motore JavaScript)
Applications
Android: Core Application
Piattaforme di Sviluppo - Sistemi Mobili M 58
Ciclo di Vita di una Activity
È il componente attraverso cui avviene
l’interazione con l’utente Estende classe Java Activity
In genere sono in esecuzione tante
activity in contemporanea: quella attiva
(in RUNNING) è però unica. Se è
visibile ma non attiva, è PAUSED,
altrimenti STOPPED
Per gestire il ciclo di vita è possibile
ridefinire i metodi di callback
OnCreate, OnStart, OnResume,…
Le activity impegnano risorse: una
activity può essere deallocata per
mancanza di risorse→ stato KILLED
Android dispone di un contenitore di
informazioni Bundle, con cui è
possibile salvare lo stato da ripristinare
alla riallocazione
STOPPED
OnCreate()
OnStart()
OnResume()
RUNNING
a) Nuova activity b) Tasto back
OnPause()
PAUSED
Activity non più visibile
OnStop()
OnDestroy()
INACTIVE
L’activity torna in primo piano
L’activity torna in primo piano
OnRestart()
Risorse di memoria scarse
INACTIVE
(KILLED)
L’activity torna in primo piano
OnRestoreInstanceState(Bundle)
OnSaveInstanceState(Bundle)
Bundle
Piattaforme di Sviluppo - Sistemi Mobili M 59
Concetto di Conversazione:
Android Task Una App può contenere più activity:
indipendenti e disgiunte
fra loro correlate
Activity sono diverse dalle form
devono essere semplici
devono essere usabili e riusabili
→ è necessario strutturare activity a formare
una conversazione complessa con utente
(come per pagine Web)
Un task modella una conversazione
contiene stack di activity, anche di
app diverse: in cima c’è activity del task
attiva
Apertura di una activity la pone in cima
allo stack; sua chiusura la rimuove dallo
stack
può essere in foreground o in
background
MyFirstProject
processo
it.mypackage
MyActivity
App Dialer
processo Dialer
Contatti
Dialer
…
MyActivity
Contatti
TASK
root activity
top dello
stack
Piattaforme di Sviluppo - Sistemi Mobili M 60
Intent e Intent Filter
Attivazione di un componente avviene tramite un Intent (di solito per passare da una activity alla successiva)
esplicito: componente da attivare è noto a compile time; necessita del descrittore Class del componente
implicito: componente da attivare non è noto a compile time; necessita che vengano specificate le seguenti informazioni
action e category: descrivono il tipo e l’azione che l’applicazione vorrebbe essere eseguita
url: specifica i dati che il componente attivato deve elaborare
mime type: specifica il tipo di dati Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(“http://www.unibo.it”));
Componente viene scelto in base a Intent Filter (descrizione di quali intent una activity può gestire) dichiarati nel manifest, secondo un algoritmo di Intent Resolution
Cannot work directly on external User Interface objects (throw the Exception CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views”)
Cannot be stopped by executing destroy() nor stop(). Use instead interrupt() or join() (by case)
As usual, two main ways of having a Thread execute application code: Providing a new class that extends Thread and
overriding its run() method
Providing a new Thread instance with a Runnable object during its creation. In both cases, start() method must be explicitly called to actually execute the new Thread
Piattaforme di Sviluppo - Sistemi Mobili M
Android Handler
Associated with a single thread and that thread's message queue
Bound to the thread/message queue of the thread that is creating it
Deliver messages and runnables to that message queue
Execute them as they come out of the message queue
Two main uses for a Handler:
To schedule messages and runnables to be executed as some point in the future
To add an action into a queue performed on a different thread
Piattaforme di Sviluppo - Sistemi Mobili M
Handler Example
Piattaforme di Sviluppo - Sistemi Mobili M
Android AsyncTask
Created on the UI thread and can be executed only once
Run on a background thread and result is published on the UI thread
The three parameters of an AsyncTask are: Params, the type of the parameters sent to the task upon
execution
Progress, the type of the progress units published during the background computation
Result, the type of the result of the background computation
Go through 4 steps: onPreExecute(): invoked on the UI thread immediately after task
is executed
doInBackground(Param ...): invoked on the background thread immediately after onPreExecute() finishes executing
onProgressUpdate(Progress...): invoked on the UI thread after a call to publishProgress(Progress...)
onPostExecute(Result): invoked on the UI thread after background computation finishes
Piattaforme di Sviluppo - Sistemi Mobili M
AsyncTask Example
Piattaforme di Sviluppo - Sistemi Mobili M
Violate the single thread model: the Android UI toolkit is not
thread-safe and must always be manipulated on the UI thread
In this piece of code, ImageView is manipulated on a worker
thread, which can cause really weird problems. Tracking down
and fixing such bugs can be difficult and time-consuming
To Summarize: Pay Attention…
Piattaforme di Sviluppo - Sistemi Mobili M
Classes and methods also tend to make the code more complicated and more difficult to read
It becomes even worse when implementing complex operations that require frequent UI updates
To Summarize: Pay Attention…
Piattaforme di Sviluppo - Sistemi Mobili M
To Summarize: Pay Attention…
Piattaforme di Sviluppo - Sistemi Mobili M 74
Esempio: Sviluppo di un Launcher
Sostitutivo di Home
Una home custom si crea nel modo seguente:
1. Definizione di una nuova Activity
2. Dichiarazione nell’Intent Filter
dell’action MAIN di launcher
3. Ricerca app installate attraverso Package
Manager
4. Scelta delle sole app che presentano un
Intent Filter relativo a launch
5. Creazione di una View di selezione
(Button) per ogni app adatta
6. Definizione dell’evento di click: lancio di un
Intent
7. Associazione dell’evento alla View
Come già detto, home consente avvio di tutte le app, fungendo da launcher
Android piattaforma aperta – “All Apps are created equal” → possibile
personalizzare il sistema con la propria home
Piattaforme di Sviluppo - Sistemi Mobili M 75
// Passo 1: definizione di nuova activity
public class CategoryTestActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
LinearLayout activitiesList;
activitiesList = (LinearLayout)
findViewById(R.id.activitiesList);
// Passi 3 e 4: ricerca app e selezione su IntentFilter
Intent intent = new Intent();
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
PackageManager pkgManager = getPackageManager();
List<ResolveInfo> activities =
pkgManager.queryIntentActivities(intent, 0);
…
Esempio: Sviluppo di un Launcher
Sostitutivo di Home
Piattaforme di Sviluppo - Sistemi Mobili M 76
…
for (ResolveInfo resolveInfo : activities) {
final ResolveInfo ri = resolveInfo;
Button button = new Button(this); //Passo5: un bottone per app
A default ogni applicazione esegue in Dalvik VM dedicata e
con suo proprio processo separato. Quale PID/GID?
Identificatori di processo e gruppo assegnati da intervallo definito a
livello di sistema - FIRST_APPLICATION_UID, LAST_APPLICATION_UID
Permessi a livello di processo sono assegnati e controllati
in dipendenza da user ID & group ID assegnati ai
processi. Usualmente che cosa vi aspettate?
Permessi a grana più fine sono assegnabili (revocabili) anche per
singola operazione tramite file manifest
Piattaforme di Sviluppo - Sistemi Mobili M 79
Esercitazione su Android
Realizzare una piccola Android App context-dependent (ad esempio, capace di fare playing di brani audio/video differenti a
seconda della locazione corrente dell’utente), sfruttando le API della libreria Media Framework (libreria nativa) e le API del Location Manager (Java-based, a livello di application framework)
Utilizzare, a propria scelta, strumenti di sviluppo come:
il semplice Android SDK - http://developer.android.com/sdk/index.html
oppure Android Development Tools (ADT) per Eclipse http://developer.android.com/sdk/eclipse-adt.html
Può essere anche il seme iniziale per una possibile attività progettuale…
Come ulteriore esempio di utilizzo di Android e di attività progettuale, si veda la pagina del sito Web del corso - http://lia.disi.unibo.it/Courses/sm1415-info/esercizi.html
Strada primaria: utilizzo di Xcode e Objective C, come su
piattaforma MacOSX più tradizionale
Alternative:
Web application che utilizzano tecnologie AJAX/Javascript; possibilità di accesso tramite Safari
Utilizzo di Java
J2ME e AlcheMo per iPhone
Xmlvm
Installazione di Java su iPhone “unlocked” e “jailbroken”
By the way, sapete che cosa si intende in gergo per “unlocking” e “jailbreaking”?
Piattaforme di Sviluppo - Sistemi Mobili M 86
Unlocking & Jailbreaking
Strettamente parlando, unlocking e jailbreaking sono processi diversi e distinti
Unlocking è il processo tramite cui dispositivo è reso compatibile con reti telefoniche per cui non era stato specificatamente licenziato (superamento locking con operatore dedicato)
Jailbreaking è il processo tramite cui si esce dalla propria “cella” in SO UNIX-like e/o si infrange il sistema di Digital Right Management (DRM). Forma specifica di crescita di privilegi di esecuzione
Per iOS, permette all’utente di eseguire codice e applicazioni arbitrarie, passando sopra al meccanismo usuale di distribuzione di codice di Apple (basato su iTunes App Store e iTunes Application)
Per chi si voglia divertire con proprio iPhone, strumenti:
Anche proposte che hanno avuto successo in termini di standardizzazione. Ad esempio:
Elemento canvas come estensione JavaScript third-party che permette rendering dinamico di immagini bitmap
Introdotto da Apple per utilizzo nel componente Webkit di MacOSX (alla base di browser Safari), poi adottato da Mozilla e Firefox
Standardizzato da WHATWG (vedi ultimo lucido) per le nuove proposte di specifica verso HTML5
Canvas è una regione “disegnabile” definita in codice HTML con attributi di altezza e larghezza. Codice JavaScript può usare un set ampio di funzioni di disegno, permettendo così grafica generata dinamicamente (grafici, animazione, composizione di immagini, …)
In competizione e concorrenza con Macromedia Flash/FlashLite. Vedi due esempi demo:
alcheMo Abbiamo già detto NO supporto ufficiale a Java
Comunque possibile eseguire applicazioni Java su iPhone, dopo
jailbreaking, installazioni varie, ...
Strumenti di conversione sorgente:
ad esempio, alcheMo è in grado di convertire automaticamente applicazioni JavaME per iPhone, utilizzando un ampio sottoinsieme di funzionalità J2ME CLDC1.1 e MIDP2.0 (incluso supporto per touch screen) – comunque non troppo di successo nella comunità
Supporta diverse JSR aggiuntive, inclusa la recente JSR-256 (Mobile Sensor API), ma anche JSR-135 MMAPI, JSR-179 LBS, JSR-75
File Connection & Personal Info Management, JSR-120 Wireless Messaging
Supporta API addizionali per multi-touch e look&feel nativo iPhone
Processo di traduzione automatica rapido, senza requisiti di skill specifici ed esperienza di sviluppo su iPhone