Introduzione ad Android
Docente: Gabriele Lombardi
[email protected]
© 2012 - CEFRIEL
The present original document was produced by CEFRIEL and the Teacher for the benefit and internal use of this
course, and nobody else may claim any right or paternity on it. No right to use the document for any purpose other than
the Intended purpose and no right to distribute, disclose, release, furnish or disseminate it or a part of it in any way or
form to anyone without the prior express written consent of CEFRIEL and the Teacher.
© copyright Cefriel and the Teacher-Milan-Italy-23/06/2008. All rights reserved in accordance with rule of law and
international agreements.
© 2012 - CEFRIEL
Sommario
SLIDE
CONTENUTO
Perché Android
Problematiche delle apps su mobile.. Android
Strumenti
Setup dell’ambiente di sviluppo/emulazione
Background Java
Un po’ di ripasso… soprattutto sulla sintassi
Primo progetto
Creazione, test, analisi
Sul dispositivo reale
Installazione, marketplace
© 2012 - CEFRIEL
«Picard usa Android»
SMARTPHONES
© 2012 - CEFRIEL
Era del mobile

Evoluzione dei dispositivi mobili:
– furono telefoni.. Ora "a volte" sono anche telefoni;
– da dispositivi "sfortunati" (schermi microscopici a
cristalli liquidi, tastiera minimale)..
– ..a dispositivi «smart» e «phone», con schermo
(multi)touch, rete, GPS, …
– da sistemi embedded custom scritti dalle aziende
produttrici di dispositivi mobili…
– ..ad aziende che si preoccupano di supportare un
sistema operativo oramai standard de-facto (uno dei).

Il mobile, i tablet, i futuri dispositivi di uso
quotidiano, i «Very personal computers»…
– …promettono di divenire gli strumenti più diffusi per la
grande massa.. Avendo già oggi enorme diffusione.
© 2012 - CEFRIEL
Dal punto di vista dello sviluppatore

Cha sviluppato per dispositivi mobili di "vecchia"
generazione sa che:
– il panorama dei dispositivi mobili è enorme,
– testare una applicazione su tutti è un lavoro titanico,
– l’hw è svariato, ma anche i so/framework sono tanti e
molto diversi da utilizzare per sviluppare applicazioni,
– il supporto a java (JME) da parte del mobile ha
permesso l’esistenza di applicazioni (quasi) portabili..
– ..ma non del tutto e non sufficientemente robuste.

Cosa serve?
– un sistema operativo unico, modulare, customizzabile
dai produttori di dispositivi, che supporti tutte le
periferiche presenti su mobile, robusto, aperto, …
– un framework standard di sviluppo che permetta la
realizzazione di applicazioni portabili e "controllate".
© 2012 - CEFRIEL
Struttura di Android
© 2012 - CEFRIEL
Cosa fa Android

Ci fornisce:
– un framework comune programmabile in un linguaggio di
programmazione unico e portabile,
– strumenti di sviluppo (SDK) e di emulazione standard,
– librerie di utilità comune contenenti API di base,
– una «struttura» per le apps «incasellandole in un
framework comune», non disomogenee tra loro,
– strumenti per gestire periferiche, comunicazione,
sicurezza, storage, interazione fra apps…

Prevede la realizzazione/utilizzo di:
–
–
–
–
Attività  porzioni di GUI
Servizi  attività "di background"
Persistenza  astrazione sulla persistenza dei dati
Notifiche  da mostrare all’utente permettendo interazione
© 2012 - CEFRIEL
Cosa ci viene fornito

Storage:
– strumenti di gestione della persistenza, alcuni dati fissi
possono essere incorporati nell’applicazione come risorse,
altri possono essere scritti nel dispositivo, su sd-card o
quant’altro.

Networking:
– accesso alla rete indipendente dal canale (WiFi, GPRS,
…), a qualunque livello (socket utilizzabili).

Multimedia:
– dipendono dalle capability del dispositivo.. Che possono
essere verificate per adattare l’app.

Location access:
– tramite GPS o IP, per identificare la posizione del
dispositivo nel globo, si vedano navigatori, gmaps, …

Phone services:
– accesso alle funzionalità del telefono come la gestione di
chiamate, SMS, …
© 2012 - CEFRIEL
Background Java

Java è un linguaggio portabile:
– il codice sorgente (alto livello di astrazione) viene
compilato in linguaggio macchina (basso livello di
astrazione, bytecode) per una macchina virtuale il cui
microprocessore non esiste;
– una macchina virtuale (JVM) interpreta il bytecode
per la CPU su cui la JVM viene eseguita;
– il Just In Time compiler (JIT) traduce «al volo» (e
ottimizza) il bytecode, fornendo performance migliori
rispetto alla compilate per CPU «generiche».

Java è Object Oriented:
– esistono i concetti di classe, interfaccia, oggetto,
enumerazione, annotazione, package, polimorfismo
riferimento, composizione, meccanismo, pattern, …
© 2012 - CEFRIEL
Riguardiamo assieme alcuni concetti

Classi, classi astratte, interfacce:
– diversi livelli di astrazione:
• classi  implementazione concreta
• classi astratte  implementazione parziale
• interfacce  dichiarazione di capacità
– beata ignoranza… e indipendenza:
• in una architettura SW le dipendenze
devono essere minimizzate.
– un occhio all’ereditarietà e al polimorfismo:

• ereditarietà = riciclo del codice
• polimorfismo = riciclo con modifiche
Facciamo un esempio assieme!
© 2012 - CEFRIEL
Classi innestate e anonime

A cosa serve il class nesting?
– In qualunque architettura SW viene l’ora di
implementare una classe concreta, solo metodi e
niente classi innestate porta al procedurale!
– Le classi anonime permettono il lambda-calcolo:
porzioni di codice viene passato come parametro.

Che differenza c’è tra nesting e nesting statico?
– il nesting statico altera il naming e permette hiding;
– Il nesting mantiene riferimento all’oggetto di classe
esterna generatore dell’istanza (ci può accedere).

In quale caso si trovano le classi anonime?
– nesting NON statico, possono accedere agli attributi
della classe esterna e alle variabili locali final.

Vediamo un esempio di nesting NON statico.
© 2012 - CEFRIEL
Esempio di nesting NON statico

L’albero di mele può produrre mele:
– le mele SONO SUE e non di un altro albero;
– le mele sanno a che albero appartengono;
– senza albero non si producono le mele.
public class AlberoDiMele {
private String varieta;
public class Mela { public String getVarieta() {
return varieta; } }
public AlberoDiMele(String v) { varieta = v; }
public Mela getMela() { return new Mela(); }
public String getVarieta() { return varieta; }
public static void main(String[] args) {
AlberoDiMele adm = new AlberoDiMele("renetta");
AlberoDiMele.Mela mela = adm.getMela();
AlberoDiMele.Mela mela2 = adm.new Mela();
}
© 2012 - CEFRIEL
La classe Mela è
innestata NON statica
L’albero crea le mele
con l’operatore new
Gli altri creano mele
tramite un albero
usando l’operatore:
albero.new Mela()
La mela si riferisce al
proprio albero dicendo
AlberoDiMele.this
Classi astratte e interfacce

Classi astratte:
– permettono di definire un’implementazione parziale;
– consentono di forzare il polimorfismo;
– tramite l’ereditarietà divengono uno strumento
formidabile per il riciclo del codice.

Interfacce:
– NON descrivono l’implementazione ma solamente
l’interfaccia di chi dichiara di implementarle;
– rappresentano delle capacità o un tipo;
– clonabile, eseguibile, ascoltatore, esecutore, …

Come scegliere?
– Separare i concetti astratti dalle problematiche
implementative concrete, utilizzare il proprio
framework per poterne valutare la correttezza.
© 2012 - CEFRIEL
Cenni sull’XML

eXtendible:
– l’XML è un meta-linguaggio, è quindi possibile
definirne istanze proprietarie che lo “estendano”;
– nuovi tag e nuovi attributi possono essere definiti,
assieme alle regole grammaticali per utilizzarli.
– esempio: XHTML e RSS sono due diverse
applicazioni XML, con scopi e gramatiche differenti.

Markup:
– “come per le bustine da congelatore”, l’XML ha lo
scopo di contenere e conservare… dati etichettati;
– i tag sono i contenitori, gli attributi sono le etichette.

Language:
– sarebbe più corretto meta-language, solo la sintassi è
definita, la grammatica dei tag è definita nelle istanze.
© 2012 - CEFRIEL

Un documento XML è:
Cenni sull’XML
– un albero radicato in un nodo di tipo Document;
– formato differenti tipologie di nodi;
– la radice deve contenere uno e un solo sotto-nodo di tipo di tipo
Element (spesso chiamati tag);
– case-sensitive e normalmente indipendente dall’indentazione
(eccetto i nodi di testo);
– ma soprattutto… è testo “umanamente” leggibile!

Un esempio:
Direttiva
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<vcards>
<vcard surname="Lombardi" name="Gabriele">
<addresses>
<address>[email protected]</address>
<address>[email protected]</address>
</addresses>
<telephone>
<number>0234567890</number>
<number>+39340340340</number>
</telephone>
</vcard>
<vcard surname="test" name="test"/>
</vcards>
© 2012 - CEFRIEL
Root element
Element con attributi
Element connsotto-element
Element con testo
Chiusura di un element
Element vuoto (con attributi)
Come iniziare a sviluppare

Strumenti:
–
–
–
–
kit di sviluppo applicazioni in java (JDK JSE),
un ambiente di sviluppo (noi useremo NetBeans),
Android SDK tools (gestione SDK e AVD),
SKD per una specifica piattaforma Android, da installare
tramite SDK Manager dei tools,
– Android Virtual Devices da installare tramite AVD Manager
(emulazione dispositivi hardware),
– plug-in per l’ambiente di sviluppo (ADT per Eclipse,
Android di kenai per NetBeans), eventuali altri plug-in (ad
esempio per lo unit testing di applicazioni).

Per iniziare:
– installato il SW richiesto, creare un dispositivo virtuale (e
configurarne l’hardware), avviarlo (e giocarci un po’),
creare un primo progetto di prova (hello world), e provarlo.
© 2012 - CEFRIEL
Primo esempio: avviamo l’emulatore



da AVD Manager,
creare un dispositivo…
selezionare l’hardware
di interesse
(periferiche come l’SD
e il touch screen sono
in generale utili),
Start! Il dispositivo
avrà a bordo un SO
(Linux) e una versione
di Android,
nell’esempio 2.3.3.
Eventi (Intent)
mostrati qui
Schermo (touch)
© 2012 - CEFRIEL
Attenzione, i
dispositivi
non sempre
hanno la
tastiera
Periferiche di input
Un primo progetto

Creare un nuovo progetto Android in NetBeans
– installato il plugin, filenuovo progettoAndroid…
– …ERRORI… di già! Perché?
– Gli strumenti di Android autogenerano parte di codice,
in particolare la classe R delle risorse (vedremo),
– compilare per ottenere le classi autogenerate in gen.

Struttura dell’applicazione impacchettata:
–
–
–
–
–
–
in un file apk.. Che è un file zip «camuffato»,
all’interno un android manifest in XML,
la directory delle risorse con un layout in XML,
le classi, le risorse,
un certificato firmato per lo sviluppo,
META-INF con manifest.. con l’SHA delle risorse.
© 2012 - CEFRIEL
Un primo progetto

L’attività è una porzione di interfaccia utente:
public class BaseActivity extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}

E’ una attività
Alla creazione si
inizializza
Ha uno stato salvato e
ripristinabile (vedremo)
Ha una vista del
contenuto attuale
Usa delle risorse (???)
Cosa è R???
– una classe contenente sole costanti…
– …organizzate in una struttura gerarchica…
– …generata automaticamente dal contenuto di
directory e file nel progetto, contenente "risorse".
© 2012 - CEFRIEL
Un primo progetto

Cosa rappresenta R.layout.main???
– una costante della classe R, vediamola:
public final class R {
public static final class attr {}
public static final class layout {
public static final int main=0x7f020000;
}
public static final class string {
public static final int app_name=0x7f030000;
}
}
Autogenerata, contiene
identificativi numerici
costanti rappresentanti
risorse dell’applicazione
Cosa rappresenta
R.layout.main?
L’aspetto grafico di una
porzione di interfaccia
descritto in XML
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent" android:layout_height="fill_parent">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Hello World, BaseActivity"/>
</LinearLayout>
© 2012 - CEFRIEL
Un primo progetto

Compilazione:
– Build… e lo script ant esegue:
• la generazione del codice (classe R)
• la compilazione del codice
• il packaging delle classi e delle risorse
• la firma digitale di sviluppo
• il packaging dell’applicazione in un file apk
(android package, file zip «camuffato»).
– Dare un occhio a tools/ant/build.xml nell’SDK.

Esecuzione:
– installazione nell’emulatore (deve essere avviato),
– esecuzione dell’applicazione con creazione attività.
© 2012 - CEFRIEL
Analizziamo la struttura dell’app

AndroidManifest.xml:
– meta-dati che descrivono l’applicazione:
– nome, icona, elenco delle attività, …

Struttura directory:
–
–
–
–

/res  risorse (immagini, layout in xml, valori, …)
/gen  codice generato a partire dal contenuto di res
/src  sorgenti java scritti da noi
/assets  se vi serve incapsulare file custom vostri
come risorse, da aprire come raw data…!
Classe R:
– la troviamo nello stesso package della main activity;
– nella radice dei package troviamo R.java.d
– elenco di file utilizzati per produrre il contenuto della classe R
© 2012 - CEFRIEL
Facciamo qualcosa di semplice

Proviamo in maniera «rozza» a creare una
piccola applicazione che inverte una stringa:
– nuovo progetto «InvertiStringhe»,
– modifichiamo la onCreate dell’attività come segue:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout layout = new LinearLayout(this);
setContentView(layout);
final EditText text = new EditText(this);
text.setText("Ciao mondo!"); text.setEnabled(true);
layout.addView(text);
Button reverse = new Button(this); reverse.setText("Reverse");
layout.addView(reverse);
reverse.setOnClickListener(new OnClickListener() {
public void onClick(View me) { CharSequence txt = text.getText();
StringBuilder b = new StringBuilder();
for (int i=txt.length()-1; i>=0; i--) b.append(txt.charAt(i));
text.setText(b.toString()); } }); }
© 2012 - CEFRIEL

Esecuzione
In esecuzione otteniamo quanto segue:
Attività
Layout lineare
orizzontale


Al click si inverte
la stringa
Cosa non va bene?
EditText abilitato
Button con evento
onClick associato
– molto codice da scrivere per qualcosa di semplice,
– logica dell’applicazione scritta assieme alla
descrizione del layout grafico (quindi «incastrata»),
– testi scritti nel codice, devo ricompilare solo per
cambiare nomi, etichette, posizioni, …

Il layout DEVE essere separato dalla logica!
© 2012 - CEFRIEL
Debugging e controllo: ADB

Cos’è ADB?
– Android Debug Bridge
– Un tool per interagire da console con il dispositivo
fisico o emulato (leggere, scrivere, intallare, …).
– Utilizzato principalmente per un debug veloce su
dispositivi fisici (installazione molto più comoda).
– Già a disposizione con Android SDK (driver?)

Installare i driver USB:
– NON lasciate che windows installi i driver per voi (non
ci riuscirà) ma scaricate quelli del vostro device.
– Aggiungere al PATH: «…\android-sdk\platform-tools».

Sul dispositivo attivate l’opzione:
– Impostazioni  Applicazioni  Sviluppo  Debug USB
© 2012 - CEFRIEL
Debugging e controllo: ADB

Un primo test da cmd:
– da cmd: «adb devices»
– List of devices attached
– BC76704D2B24 device
– notare che anche l’emulatore, se avviato, viene rilevato e può
essere controllato tramite adb.

Copiare file:
– adb push miofile percorsoSulDevice
– adb pull percorsoSulDevice miofile

Installare applicazioni:
– adb –s BC76704D2B24 install –s -r miaApp.apk
– Installa miaApp sul dispositivo BC76704D2B24 reinstallandola (-r) e
scrivendo sulla SD invece che nel telefono (-s)

Accedere al sistema tramite una console (shell):
– adb shell  esegue /system/bin/sh, shell «base»
– provate con ls e cd a esplorare, ps, exit.

Altre funzionalità «di rete» le scopriremo «giocando» con
la rete per implementare applicazioni client/server:
– connessione PPP, port forwarding sul device, …
© 2012 - CEFRIEL
Installiamo e proviamo l’applicazione


Compilare in BetBeans per generare l’apk;
da riga di comando (cmd):
– entrare in Code\00_overview\InvertiStringhe\bin
– eseguire il seguente comando adb:
• per installare sul device (unico):
– adb –d install –s –r InvertiStringhe-debug.apk
• per installare sull’emulatore (unico):
– adb –s install –s –r InvertiStringhe-debug.apk
• se avete più dispositivi collegati:
– adb -s BC76704D2B24 install -s -r InvertiStringhe-debug.apk

• sostituendo il seriale col vostro.
Provate la vostra app! 
© 2012 - CEFRIEL
I marketplace

Preparazione della release:
– ogni applicazione installata in Android DEVE essere firmata
digitalmente (automatico con chiave di debug durante lo sviluppo);
– generiamo una nostra chiave con:
– keytool -genkey -v -keystore miaChiave.keystor
• ci chiederà password e altre info nostre;
– modifichiamo ant.properties (build properties):
– key.store=./miaChiave.keystor
– key.alias=mykey
• usate sempre lo stesso certificato, altrimenti:
– gli utenti non potranno fare update a nuove versioni dell’app;
– applicazioni/moduli diversi non potranno girare nello stesso processo;
– applicazioni interagenti non potranno condividere permessi.
• la procedura ant usa queste info per firmare
automaticamente l’applicazione, fine lavoro!
– ant release  il pacchetto di installazione apk viene generato 

Google Play:
–
–
–
–
registrarsi a https://market.android.com/publish;
richiesto la prima volta un pagamento di 25$;
occhio, una applicazione gratuita lo è permanentemente;
possibile aggiungere screen-shot, descrizioni, …
© 2012 - CEFRIEL
Da qui?



Approfondiremo l’analisi della struttura del
progetto e della classe R (più risorse!).
Passeremo dalla gestione «programmatica»
della GUI dell’ultimo esempio a MVC.
Molti strumenti NON sono stati nemmeno
menzionati, li scopriremo poco a poco!
© 2012 - CEFRIEL
Scarica

00_Overview