1 lucido x pagina - Università di Bologna

Sistemi Mobili M
Università di Bologna
CdS Laurea Magistrale in Ingegneria Informatica
II Ciclo - A.A. 2010/2011
Corso di Sistemi Mobili M (6 cfu)
04 – Piattaforme di Sviluppo (e non solo):
Panoramica, J2ME e Android
Docente: Paolo Bellavista
[email protected]
http://lia.deis.unibo.it/Courses/sm1011-info/
http://lia.deis.unibo.it/Staff/PaoloBellavista/
Piattaforme di Sviluppo - Sistemi Mobili M
1
Panoramica su
Piattaforme di Sviluppo
Molte soluzioni possibili oggi per fare sviluppo di middleware
e applicazioni per sistemi mobili. Perché?
Eterogeneità e frammentazione
Scelta market-driven
Caratteristiche molto differenziate dispositivi disponibili,
“piattaforme” e requisiti applicativi
Pletora di soluzioni: Symbian, Palm, RIM, Maemo/Meego, iOS,
Android, Java Mobile Edition (J2ME), .NET Compact Framework (CF),
Python, Lazarus, Brew, Flash Lite, Web runtime environment (microbrowser, HTML5, XHTML/CSS, JavaScript, Mobile Ajax, …), …
Proviamo a mettere un po’ d’ordine…
Quali livelli coinvolti?
Piattaforme di Sviluppo - Sistemi Mobili M
2
Panoramica su
Piattaforme di Sviluppo
Livello di sistema operativo (ad es. Android è un sistema
operativo?)
Livello di supporto runtime all’esecuzione (framework,
container, macchine virtuali, …)
Livello di supporto allo sviluppo - SDK (librerie,
componenti di supporto, container, …)
Ancora una volta livelli NON con contorni netti e NON
facilmente separabili…
Prevalentemente a livello di SO: Symbian, Palm, RIM
(BlackBerry), Maemo/Meego, iOS, …
Prevalentemente a livello di supporto runtime
all’esecuzione: Kernel-based Virtual Machine (KVM) o Dalvik Virtual
Machine per Java, Common Language Runtime (CLR) per .NET, Flash
Lite, Web runtime environment
Piattaforme di Sviluppo - Sistemi Mobili M
3
Panoramica su
Piattaforme di Sviluppo
Prevalentemente a livello di supporto allo sviluppo: mondo
J2ME, mondo .NET CF, ActionScript per Flash Lite, mondo Android,
Web runtime environment
Due principali categorie di approccio:
Basato su applicazioni native
Basato su integrazione con Web (specie vedi sforzo di
standardizzazione legato a HTML5)
Partiamo dal primo approccio, scegliendo di dare un’occhiata
a 4 famiglie di soluzioni principali: J2ME, .NET CF, Flash
Lite, Android
Piattaforme di Sviluppo - Sistemi Mobili M
4
Panoramica su
J2ME, .NET CF, Flash Lite, Android
Piattaforme di Sviluppo - Sistemi Mobili M
5
J2ME in una Slide
Edizione del mondo Java per dispositivi a risorse limitate
(smart phone, set-top box) – http://java.sun.com/j2me/
Bytecode messo in esecuzione su Kernel-based Virtual
Machine (KVM), indipendenza da SO
Concetto di configurazione: minime caratteristiche VM e
insieme librerie supporto per una famiglia orizzontale di dispositivi
Connected Limited Device Configuration (CLDC)
Concetto di profilo: librerie specializzate per le caratteristiche di
una specifica tipologia/classe di dispositivi
Mobile Information Device Profile (MIDP), sopra CLDC
Applicazioni Java su CLDC/MIDP vengono chiamate
MIDlet
Avete già visto che cosa si intende per Java Community Process (JCP) e
Java Specification Request (JSR)?
Piattaforme di Sviluppo - Sistemi Mobili M
6
.NET CF in una Slide
Sottoinsieme di piattaforma .NET (circa 30% classi e
funzionalità) per dispositivi con MS Windows Mobile
uso di Common Language Runtime (CLR); in linea di
principio, supporto per differenti SO e differenti linguaggi
(ancora solo WinMobile, C# e VB.NET)
Idea di transizione morbida da sviluppo applicazioni
desktop a sviluppo per mobile, comunque spinto da un grande
vendor e comunità di sviluppatori
Costo correlato a esecuzione di codice intermedio
(Common Intermediate Language – CIL)
Costo relativamente alto in termini di memory footprint
Non ha problemi di “frammentazione” come nel caso
J2ME
Piattaforme di Sviluppo - Sistemi Mobili M
7
Adobe Flash Lite in una Slide
Tecnologia proprietaria popolare per sviluppo di
contenuto multimediale e giochi
Di base, supporto a grafica vettoriale e animazioni;
aggiunta di logica applicativa e di presentazione tramite
linguaggio ad-hoc, chiamato ActionScript, che esegue in un
supporto runtime
Transizione morbida per sviluppatori esperti in Flash
Soluzione incompleta per applicazioni stand-alone fullfledged; soluzione non-general purpose
Integrazione forte con caratteristiche di basso livello dei
dispositivi, con conseguente buona efficienza
Performance limitate per costo gestione grafica vettoriale
Vedi tentativo analogo del mondo Java con JavaFX Mobile –
http://javafx.com
Piattaforme di Sviluppo - Sistemi Mobili M
8
Android in una Slide
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
9
Un Confronto su un’Applicazione Giocattolo
(Gavalas et al, IEEE Software, 2011)
Piattaforme di Sviluppo - Sistemi Mobili M
10
Un Primo Confronto
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
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
16
JSR 248:
Mobile Service Architecture (MSA)
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
17
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
18
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
19
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
20
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
21
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
Fattore forma pixel (aspect ratio) = 1:1
Periferiche di Input (una o più)
One-handed keypad
Two-handed keypad
Touch screen
Networking
Two-way
Wireless
Gestione intermittenza
Banda limitata
Piattaforme di Sviluppo - Sistemi Mobili M
22
Architettura MIDP
Original Equipment Manufacturer (OEM)
Applicazioni
OEM-Specific
Applicazioni
MIDP
MIDP
Applicazioni
Native
Classi
OEM-Specific
CLDC
SO Nativo + Software di Sistema
Mobile Information Device (MID)
Piattaforme di Sviluppo - Sistemi Mobili M
23
Libreria di Classi
CLDC
java.lang
java.io
java.util
javax.microedition.io
MIDP
javax.microedition.lcdui
javax.microedition.midlet
javax.microedition.rms
Piattaforme di Sviluppo - Sistemi Mobili M
24
Modello Applicazioni MIDP
Java Application Manager (JAM) per
gestione ciclo di vita MIDlet
Piattaforme di Sviluppo - Sistemi Mobili M
Active
destroyApp
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à
startApp
Ciclo di vita MIDlet descritto da transizioni di
stato in stato, come indicato a fianco:
destroyApp
Anche supporto a sicurezza per applicazioni che
condividono risorse/dati (tramite MIDlet Suite)
Pause
pauseApp
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
Destroyed
25
Tipico Stack Supporto J2ME
KVM + CLDC + MIDP: si realizzano applicazioni on top di questo
stack standardizzato, indipendenti da SO e dettagli hw
Your
MIDlet
Mobile
Information
Device
Profile
Pagine gialle, orario
treni e biglietteria,
giochi, …
UI, HTTP
networking, ...
J2ME core APIs
CLDC = KVM
+ J2ME Core
API
in questo
esempio
KVM
DSP chip
(e.g., ARM)
Supporto threads,
no floating point…
32-bit RISC, 256K ROM,
256K Flash, 64K RAM
Piattaforme di Sviluppo - Sistemi Mobili M
26
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
27
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
28
MIDlet:
Gestione Semplice GUI
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class HelloWorld extends MIDlet implements
CommandListener {
private
private
private
private
private
private
Form mainscreen;
Form detailsscreen;
Display myDisplay;
Command exitCommand;
Command resetCommand;
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
29
MIDlet:
Gestione Semplice GUI
StringItem strItem = new StringItem("Hello", " World");
mainscreen.addCommand(detailsCommand);
mainscreen.addCommand(resetCommand);
mainscreen.addCommand(exitCommand);
mainscreen.append(strItem);
mainscreen.setCommandListener(this);
public void startApp() {
myDisplay.setCurrent(mainscreen); }
protected void pauseApp() { }
protected void destroyApp(boolean unconditional) { }
Piattaforme di Sviluppo - Sistemi Mobili M
30
MIDlet:
Gestione Semplice GUI
public void commandAction(Command c, Displayable s) {
if (c == exitCommand) {
destroyApp(false);
notifyDestroyed(); }
else if (c == detailsCommand) {
detailsscreen = new Form("Details");
detailsscreen.addCommand(resetCommand);
detailsscreen.setCommandListener(this);
myDisplay.setCurrent(detailsscreen); }
else if (c == resetCommand) {
myDisplay.setCurrent(mainscreen); }
}
}
Piattaforme di Sviluppo - Sistemi Mobili M
31
MIDlet:
un Esempio più Realistico
import
import
import
import
java.io.*;
javax.microedition.io.*;
javax.microedition.midlet.*;
javax.microedition.lcdui.*;
public class PrimitiveMIDlet extends MIDlet
implements CommandListener {
private Display mDisplay;
private Form mMainForm;
private Command mExitCommand, mConnectCommand;
public void startApp() {
mDisplay = Display.getDisplay(this);
if (mMainForm == null) {
mMainForm = new Form("PrimitiveMIDlet");
mMainForm.append(new StringItem("", "Select Connect to
make a network connection"));
mExitCommand = new Command("Exit", Command.EXIT, 0);
mConnectCommand = new Command("Connect",
Command.SCREEN, 0);
Piattaforme di Sviluppo - Sistemi Mobili M
32
MIDlet:
un Esempio più Realistico
mMainForm.addCommand(mExitCommand);
mMainForm.addCommand(mConnectCommand);
mMainForm.setCommandListener(this);
mDisplay.setCurrent(mMainForm);
}
}
public void commandAction(Command c, Displayable s) {
if (c == mExitCommand) notifyDestroyed();
else if (c == mConnectCommand) connect();
}
private void connect() {
String url = getAppProperty("NetworkThreading.URL");
try { //interroga server e riceve risposta
HttpConnection hc = (HttpConnection)Connector.open(url);
InputStream in = hc.openInputStream();
int contentLength = (int)hc.getLength();
if (contentLength == -1) contentLength = 255;
byte[] raw = new byte[contentLength];
int length = in.read(raw);
Piattaforme di Sviluppo - Sistemi Mobili M
33
MIDlet:
un Esempio più Realistico
in.close();
hc.close();
// Show the response to the user.
String s = new String(raw, 0, length);
Alert a = new Alert("Response", s, null, null);
a.setTimeout(Alert.FOREVER);
mDisplay.setCurrent(a, mMainForm);
}
catch (IOException ioe) { Alert a = new Alert(
"Exception", ioe.toString(), null, null);
a.setTimeout(Alert.FOREVER);
mDisplay.setCurrent(a, mMainForm); }
}
public void pauseApp() {}
public void destroyApp(boolean unconditional) {}
}
Quali potenziali problemi in uno scenario reale di utilizzo?
Piattaforme di Sviluppo - Sistemi Mobili M
34
MIDlet:
un Esempio più Realistico
Quali potenziali problemi in uno scenario reale di utilizzo?
Nessun feedback GUI durante intervallo di tempo richiesto per
connessione => utente “spazientito” che genera altri comandi…
Più importante: modello di threading
thread di sistema “prestati” all’esecuzione di una MIDlet
i soli thread di appartenenza della MIDlet sono quelli che
MIDlet esplicitamente istanzia
Come in altre tecnologie, ad es. per gestione GUI: thread di
sistema che si occupa di fare da event dispatcher; gestori
eventi devono restituire controllo rapidamente per non
bloccare interfaccia MIDlet
La soluzione più sensata sarebbe quindi…
Piattaforme di Sviluppo - Sistemi Mobili M
35
MIDlet:
un Esempio più Realistico
public void commandAction(Command c, Displayable s) {
if (c == mExitCommand)
notifyDestroyed();
else if (c == mConnectCommand) {
Thread t = new Thread() {
public void run() {
connect(); }
};
t.start(); }
}
Quali potenziali problemi in questo caso?
Piattaforme di Sviluppo - Sistemi Mobili M
36
MIDlet:
un Esempio più Realistico
Classe SingleWorker
…
public synchronized void run() {
while (mTrucking) {
try { wait(); }
catch (InterruptedException ie) {}
if (mTrucking) connect(); }
}
public synchronized void go() {
notify(); }
Classe SingleMIDlet
import java.io.*;
…
public class SingleMIDlet extends MIDlet implements CommandListener {
private Display mDisplay;
private Form mMainForm, mWaitForm;
private SingleWorker mWorker;
private Command mExitCommand, mConnectCommand, mCancelCommand;
…
Piattaforme di Sviluppo - Sistemi Mobili M
37
MIDlet:
un Esempio più Realistico
public void startApp() {
mDisplay = Display.getDisplay(this);
if (mMainForm == null) {
//preparazione form
…
mWorker = new SingleWorker(this, url);
mWorker.start(); }
mDisplay.setCurrent(mMainForm); }
public void commandAction(Command c, Displayable s) {
if (c == mExitCommand) notifyDestroyed();
else if (c == mConnectCommand) {
mDisplay.setCurrent(mWaitForm); mWorker.go(); }
else if (c == mCancelCommand) {
mDisplay.setCurrent(mMainForm); mWorker.cancel(); }
}
public void pauseApp() {}
public void destroyApp(boolean unconditional) {
mWorker.stop();
} …
Piattaforme di Sviluppo - Sistemi Mobili M
38
J2ME: Tipologie di
Connessione Web Supportate
HTTP/HTTPS
Semplice da utilizzare
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: prima di tutto, JSR82 (Bluetooth),
JSR179 (Location), JSR135 (Mobile Media), JSR180
(SIP), JSR172 (Web Services)
Piattaforme di Sviluppo - Sistemi Mobili M
39
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/
Piattaforme di Sviluppo - Sistemi Mobili M
40
Ad es. Nokia J2ME SDK
Piattaforme di Sviluppo - Sistemi Mobili M
41
Ricordatevi:
Processo Caricamento MIDlet
Advertise
App on
Web Page
User
Selects
App
JAM
Downloads
App
Web Page
(Name,
Version,
Size,
…)
Descriptor
File
Network Transfer
Java Application
Manager
Jar File
Piattaforme di Sviluppo - Sistemi Mobili M
42
Esercitazione su J2ME:
Come si Progetta Applicazione MIDlet
Realizzare una piccola MIDlet context-dependent (ad
esempio, capace di fare playing di suoni o video differenti a seconda
della locazione corrente dell’utente), sfruttando funzionalità
definite in JSR 135 (nota anche come Mobile Media API,
http://java.sun.com/products/mmapi/) e JSR 179 (nota anche
come Location API, diverse implementazioni più o meno
“facilmente” disponibili, ad es. http://code.google.com/p/openlapi/)
Utilizzare, a propria scelta, strumenti di sviluppo come J2ME
Wireless Toolkit oppure Eclipse ME
Può essere anche il seme iniziale per una possibile attività
progettuale…
Piattaforme di Sviluppo - Sistemi Mobili M
43
Cenni sul Modello di Sicurezza
J2ME non può supportare l’usuale modello di
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
44
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
45
Sicurezza:
Verificatore di Class File a 2 Fasi
Stack map
attribute
accresce
dimensione
di classfile di
circa 5%
Piattaforme di Sviluppo - Sistemi Mobili M
46
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
47
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
48
Android: Architettura
Kernel Layer
basato su classico kernel
Linuxv2.6
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
49
Android:
SO Kernel Layer
Kernel Linux 2.6
Hardware Abstraction
Layer (HAL)
Gestione memoria
Gestione processi
Network stack
Power management
standard Linux
…
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
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
50
50
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:
… @Override
protected void onCreate(Bundle savedInstanceState) {
PowerManager pm = (PowerManager)
getSystemService(Context.POWER_SERVICE);
wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK,
"DoNotDimScreen"); }
@Override
protected void onPause() { super.onPause(); wl.release(); }
Piattaforme di Sviluppo - Sistemi Mobili M
51
Android:
Librerie Native e Dalvik VM
Librerie native per
grafica e multimedia
3D Surface
Surface
Flinger
2D Surface
App
Frame
Buffer
Media Server
Media
Player
Service
Vorbis
Media
Recorder
Service
MIDI
OpenCORE
Camer
a
Service
Audio
Flinger
Camera
Surface Manager + Media Framework
Dalvik VM
progettata per dispositivi mobili: registry-based (sfrutta l’architettura
ARM). Perché, invece, com’è organizzata JVM tradizionale?
interpreta ed esegue i file dex, ottenuti dalla trasformazione dei file class
(riduzione 30% istruzioni necessarie e incremento prestazioni runtime)
supporto a garbage collector
Piattaforme di Sviluppo - Sistemi Mobili M
52
Android:
Application Framework
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
Service
In esecuzione in background (no
interazione con utente come activity)
Utilizzabile da 1+ componenti
No processo/thread dedicato in
background
Broadcast Receiver
Massima riusabilità delle activity
Richiesta di compiere un’operazione
(ad es. selezione numero telefonico)
Raccolta da un componente che ha
un Intent Filter compatibile
Risponde agli Intent compatibili
eseguendo le operazioni previste
In genere, azioni di notifica
(chiamata, sms)
Ciclo di vita limitato alla risposta
Piattaforme di Sviluppo - Sistemi Mobili M
53
Android:
Application Framework
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)
Resource Manager e Content Provider
Gestione risorse (tutti file eccetto codice) e accesso
condiviso a dati locali (RDBMS SQLite e persistenza
tramite file)
Applications
Telephony, Notification, Location
Manager
Consentono di accedere alle funzionalità telefoniche, di
notifica e di localizzazione
Piattaforme di Sviluppo - Sistemi Mobili M
54
Android:
Core Application
Core Application
Applicazioni vere e proprie (stesso modello di esecuzione che per
applicazioni sviluppate da terze parti e scaricate in secondo momento),
installate a default su macchine Android
pre-
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
Applications
Browser Web: browser engine WebKit
(open-source); utilizzato anche in Safari
e Google Chrome
Solo browser engine (parser HTML +
renderer + motore JavaScript)
Piattaforme di Sviluppo - Sistemi Mobili M
55
Ciclo di Vita di una Activity
L’activity torna in
primo piano
Bundle
È 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
OnCreate()
OnStart()
OnRestoreInstanceState(Bundle)
OnRestart()
OnResume()
INACTIVE
INACTIVE
(KILLED)
(KILLED)
RUNNING
RUNNING
a) Nuova activity
b) Tasto back
L’activity torna
in primo piano
L’activity torna in
primo piano
OnSaveInstanceState(Bundle)
OnPause()
Risorse di
memoria scarse
Piattaforme di Sviluppo - Sistemi Mobili M
PAUSED
Activity non più
visibile
OnStop()
STOPPED
STOPPED
OnDestroy()
INACTIVE
INACTIVE
56
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
Contatti
Dialer
…
processo Dialer
App Dialer
una conversazione complessa con utente
(come per pagine Web)
TASK
MyActivity
processo
it.mypackage
Contatti
top dello
stack
MyActivity
root activity
MyFirstProject
Un task modella una conversazione
contiene stack di activity, anche di
app diverse: in cima c’è activity del task
attiva
Apertura di un’activity la pone in cima
allo stack, chiusura la rimuove dallo
stack
può essere in foreground o in
background
Piattaforme di Sviluppo - Sistemi Mobili M
57
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 pouò gestire) dichiarati nel manifest, secondo un
algoritmo di Intent Resolution
Intent repository su www.openintents.org
Piattaforme di Sviluppo - Sistemi Mobili M
58
Intent e Intent Filter
<activity android:name="IntentActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.
LAUNCHER" />
<category android:name="it.mypackage.intent.
category.CAT_NAME" />
<data android:mimeType="vnd.android.cursor.item/
vnd.mytype" />
</intent-filter>
</activity>
Esempio
di file
manifest
protected void onCreate(Bundle savedInstanceState) {
...
Intent intent = new Intent(); intent.setAction(MY_ACTION);
intent.addCategory(Intent.CATEGORY_ALTERNATIVE);
intent.addCategory(Intent.CATEGORY_BROWSABLE);
Uri uri = Uri.parse("content://it.mypackage/items/");
intent.setData(uri);
intent.setType("vnd.android.cursor.item/vnd.mytype");
startActivity(intent); ... }
Piattaforme di Sviluppo - Sistemi Mobili M
59
Modello di Threading in Android
Ogni processo ha un thread singolo (a default) =>
semplice modello single-threaded (1 processo: 1 thread)
1 applicazione: 1 processo: 1 thread: più activity
Possibilità di salvare stato in info bundle (non troppo dissimile da
modello di esecuzione stateful session bean in J2EE)
Ogni thread ha un Looper per la gestione di coda di messaggi
Piattaforme di Sviluppo - Sistemi Mobili M
60
Modello di Threading in Android
Possibile sia lanciare applicazioni diverse in unica Dalvik VM (unico
processo), sia avere una Dalvik VM (processo) dedicata per ogni
singola applicazione
Default è la seconda opzione: ogni applicazione viene messa in VM
separata (processo separato), anche quando si effettua
startActivity(intent) o startService(intent)
Come è possibile? Quali potenziali problemi?
Ad es. come realizzare restituzione di risposta da activity all’invocante?
startActivityForResult(Intent, int)
secondo parametro identifica chiamata
funzione di callback onActivityResult(int, int, Intent)
Se si desidera risparmiare in utilizzo risorse di sistema, occorre forzare
che differenti applicazioni condividano stesso userID
Android.sharedUserId=“PaoloBellavista” in file manifest
Quali potenziali problemi di sicurezza?
Piattaforme di Sviluppo - Sistemi Mobili M
61
Esempio: Sviluppo di un Launcher
Sostitutivo di Home
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
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
Piattaforme di Sviluppo - Sistemi Mobili M
62
Esempio: Sviluppo di un Launcher
Sostitutivo di Home
// 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);
…
Piattaforme di Sviluppo - Sistemi Mobili M
63
Esempio: Sviluppo di un Launcher
Sostitutivo di Home
…
for (ResolveInfo resolveInfo : activities) {
final ResolveInfo ri = resolveInfo;
Button button = new Button(this); //Passo5: un bottone per app
button.setText(resolveInfo.loadLabel(pkgManager));
// Passo 7: associazione evento-view
button.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(); //Passo6: lancio intent
ComponentName cn = new ComponentName(ri.
activityInfo.packageName, ri.activityInfo.name);
intent.setComponent(cn);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
startActivity(intent);}});
activitiesList.addView(button);}}}
Piattaforme di Sviluppo - Sistemi Mobili M
64
Esempio: Sviluppo di un Launcher
Sostitutivo di Home
<manifest xmlns:android=“...” package="it.mypackage">
<application android:label="@string/app_name">
<activity android:name=".HomeActivity"
android:label="@string/app_name">
<intent-filter> <!-- Passo 2 -->
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.
HOME"> </category>
<category android:name="android.intent.category.
DEFAULT"></category>
</intent-filter>
</activity>
</application>
</manifest>
Piattaforme di Sviluppo - Sistemi Mobili M
65
Sicurezza in Android
(in una slide)
Classiche linee guida per sicurezza in Linux
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
<manifest
<manifest xmlns:android="http://schemas.android.com/apk/res/
xmlns:android="http://schemas.android.com/apk/res/
android“
android“ package="com.google.android.app.myapp"
package="com.google.android.app.myapp" >>
<uses-permission
<uses-permission id="android.permission.RECEIVE_SMS"
id="android.permission.RECEIVE_SMS" />
/>
</manifest>
</manifest>
Piattaforme di Sviluppo - Sistemi Mobili M
66
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…
Piattaforme di Sviluppo - Sistemi Mobili M
67
Numerose Sorgenti Disponibili
per Info Addizionali
Numerosi libri su Android:
R. Meier, “Professional Android 2 Application Development”,
Wrox, Marzo 2010
M. Gargenta, “Learning Android”, O’Reilly, Marzo 2011
F. Ableson, R. Sen, “Android in Action”, Manning, Feb. 2011
…
Android SDK ha una buona documentazione, ad es. di descrizione
delle API disponibili, di applicazioni di esempio, …
http://developer.android.com/sdk/index.html
Altra documentazione è disponibile alla descrizione degli strumenti di
sviluppo
http://developer.android.com/guide/developing/projects/projectscmdline.html
http://developer.android.com/sdk/eclipse-adt.html
Piattaforme di Sviluppo - Sistemi Mobili M
68
iOS (o iPhoneOS):
una Velocissima Panoramica
Approccio per molti versi simile ad Android in termini di
realizzazione di ampio ecosistema con modello di
sviluppo + API di supporto:
iOS utilizza una variante del kernel XNU alla base di MacOSX
Catena di strumenti per lo sviluppo è similmente basata su Xcode
SDK contiene API a vari livelli per supporto a:
Eventi e controlli multi-touch
Accelerometro
Localization (i18n)
Fotocamera e media in generale (audio
mixing&recording, video playback, vari formati di
file immagine, OpenGL ES …)
Networking
Embedded SQLite database
Core Location (GPS, Skyhook WiFi, …)
Thread
Power management
File system
Security
SDK contiene anche iPhone Simulator, uno strumento per emulare look&feel
di iPhone su desktop sviluppatore. Non è un emulatore vero e proprio:
esegue codice generato per altro target (x86)
SDK richiede macchina con Mac OS X Leopard (o più recenti)
Piattaforme di Sviluppo - Sistemi Mobili M
69
iOS (o iPhoneOS):
Regole Regole Regole…
3.3.1 — Applications may only use Documented APIs in the manner
prescribed by Apple and must not use or call any private APIs.
Applications must be originally written in Objective-C, C, C++, or
JavaScript as executed by the iOS WebKit engine, and only code written in
C, C++, and Objective-C may compile and directly link against the
Documented APIs
3.3.2 — An Application may not itself install or launch other executable
code by any means, including without limitation through the use of a plug-in
architecture, calling other frameworks, other APIs or otherwise. No
interpreted code may be downloaded or used in an Application except for
code that is interpreted and run by Apple’s Documented APIs and built-in
interpreter(s)
Lo stesso SDK può essere scaricato gratuitamente ma richiede
iscrizione a iPhone Developer Program se si vuole rilasciare
software (pagamento + approvazione Apple)
Apple non ha annunciato nessun piano per piattaforma Java su iPhone;
parziale supporto invece per J2ME su iOS
Piattaforme di Sviluppo - Sistemi Mobili M
70
iOS Multitasking
Multitasking
Prima di iOSv4, multitasking limitato a un sottoinsieme di
applicazioni fornite dal produttore. Apple temeva eccessivo consumo
di batteria dovuto a esecuzione simultanea di applicazioni third-party
A partire da iOSv4, multitasking supportato tramite 7 API per
esecuzione background :
–
–
–
–
Audio in background
Servizio di locazione in background
Notifiche locali
Switching veloce fra applicazioni
- Voice over IP
- Notifiche push
- Terminazione task
iOS come sistema aperto?
iOS
Android
Open Source
NO
YES
Write anything you want
NO
YES
Device Homogeneity
YES
NO
Piattaforme di Sviluppo - Sistemi Mobili M
71
Sviluppare per iOS:
Primi Passi
Per cominciare:
http://developer.apple.com/iphone/
Effettuare download di iOS SDK, che include :
Xcode
Strumento di emulazione iPhone
Strumenti di monitoraggio
Interface builder
Nota: applicazioni sono soggette all’approvazione di Apple (parte
integrante dell’accordo per SDK download) al fine di fare test di
affidabilità e altre analisi…
Applicazioni possono essere rifiutate se giudicate di "limited utility"
Piattaforme di Sviluppo - Sistemi Mobili M
72
Alternative per Sviluppo su iOS
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
73
iOS:
AJAX & JavaScript
AJAX (“forse” Asynchronous JavaScript and XML): insieme di
tecniche interrelate per sviluppo di applicazioni Web altamente
interattive (rich Internet application)
Possibilità di data retrieval asincrono in background, senza
interferire con comportamento e visualizzazione pagina corrente
Applet come precursori di AJAX
Con browser Safari, possibilità di applicazioni Web fortemente
interattive e “native looking”
Domanda: quali vantaggi nell’utilizzare applicazioni Web invece
di applicazioni native?
AJAX plugin per Eclipse (anche in versione standalone):
http://www.aptana.com/
Piattaforme di Sviluppo - Sistemi Mobili M
74
iOS:
AJAX & JavaScript
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:
http://www.damonkohler.com/2008/12/javascript-painting-withcanvas.html
http://www.benjoffe.com/code/demos/canvascape/
Piattaforme di Sviluppo - Sistemi Mobili M
75
J2ME su iPhone:
alcheMo
Abbiamo già detto NO supporto ufficiale a Java
Comunque possibile eseguire applicazioni Java su iPhone, dopo
jailbreaking, installazioni varie, ...
Ad esempio, alcheMo è in grado di convertire automaticamente
applicazioni J2ME per iPhone, utilizzando un ampio sottoinsieme di
funzionalità J2ME CLDC1.1 e MIDP2.0 (incluso supporto per touch
screen)
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
http://www.innaworks.com/alcheMo-for-iPhone.html
Piattaforme di Sviluppo - Sistemi Mobili M
76
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:
PwnageTool, QuickPwn, Yellowsn0w http://blog.iphone-dev.org/
Pusher - http://ripdev.com/pusher/
Linux on iPhone - http://www.iphonelinux.org/index.php/Main_Page
ZIPhone - http://www.ziphone.org/
Piattaforme di Sviluppo - Sistemi Mobili M
77
HTML5 in una Slide
Ancora, la questione fondamentale è vantaggi&svantaggi di
Applicazioni Web vs. applicazioni native
HTML5
Nulla di sconvolgente, riprende classico modello di applicazioni Web a
ricca interattività
HTML5 = HTML + CSS + JavaScript
W3C, tramite il suo Web Hypertext Application Technology Working Group
(WHATWG) ha annunciato che standard sarà definitivo per 2014!
Più in dettaglio:
Nuovi tag per AJAX e DHTML
Nuovi tag per gestione embedded audio e video (ad es. <video> tag)
Quanto supportati al momento attuale?
Migliore gestione struttura documenti
Provate a guardare:
http://dev.w3.org/html5/spec/ (draft 21 Aprile 2011)
http://slides.html5rocks.com/
Piattaforme di Sviluppo - Sistemi Mobili M
78