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