Documente Academic
Documente Profesional
Documente Cultură
Fun
Sviluppo applicazioni Invenzione di nuove applicazioni per soddisfare vecchie e nuove esigenze Attivit di ricerca
Profit
Vendita delle applicazioni Sviluppo applicazioni su commissione Vendita o abuso dei risultati di ricerca
LUGTrieste
Architettura
Android
Sistema operativo Linux con kernel 2.6 Driver per l'hardware (GPS, accelerometri, ..) Librerie Android runtime Application framework Native: telefono, contatti, browser, Di terze parti
Middleware
Applicazioni
LUGTrieste
Kernel
Linux kernel e driver che fanno da hardware abstraction layer Core system services per security, memory management, process management, network stack
LUGTrieste
Librerie e runtime
Librerie (per la gran parte in linguaggio nativo) esposte attraverso l'application framework Android runtime: Dalvik Virtual Machine e sue librerie core
LUGTrieste
Application framework
API ad alto livello Le applicazioni native Android e quelle di terze parti usano le stesse API
LUGTrieste
Sequenza di avvio
Il bootloader carica il kernel Demoni per la gestione low level dell'hardware Zygote e Dalvik VM Il service manager viene avviato (binders e comunicazioni IPC) Altri manager App rimanenti
LUGTrieste
Lente CPU (250-500 MHz), poca RAM (64MB) Senza swap Alta densit semantica Istruzioni speciali
Register based
Ottimizzata per istanze multiple Ottimizzata per avere un memory footprint minimale Esegue file .dex su OS POSIX compliant Si appoggia al kernel per threading e memory management di basso livello
Alessandro Tanasi - alessandro@tanasi.it
LUGTrieste
Riduzione delle dimensioni Sostanziale differenza semantica con il bytecode Java Nessuna compressione
Comunque minori di un JAR nel caso medio Vengono gestiti in modo efficace da mmap()
Dexdump, undx
http://www.dalvikvm.com/ http://sites.google.com/site/io/dalvik-vm-internals
Alessandro Tanasi - alessandro@tanasi.it
LUGTrieste
Compilazione e building
Compilazione con il compilatore standard Java Conversion in .dex con l'utility dx Nel caso si usino IPC, processing AIDL Le risorse sono incluse nel package apk
LUGTrieste
Sviluppo
Android SDK
Android API Development tools Emulatore Android Dalvik Debug Monitoring Service (DDMS) Documentazione ed esempi
http://developer.android.com/sdk/1.6_r1/index.html
Alessandro Tanasi - alessandro@tanasi.it
LUGTrieste
Permettono l'utilizzo di componenti in codice nativo ( C o C++) Cross-toolchains (compilatori, linkers, etc..) per generare binari ARM Libc, libm, OpenGL ES 1.1, JNI interface, libz Non permette di creare applicazione nativeonly Il runtime applicativo rimane la Dalvik VM
http://developer.android.com/sdk/ndk/1.6_r1/index.html
Alessandro Tanasi - alessandro@tanasi.it
LUGTrieste
Programmare in Python, Perlm, Jruby, BeanShell, Lua.. Per casi particolare in cui bisogna adottare paradigmi di programmazione diversi da quelli imposti dall'SDK Accesso semplificato e non completo alle API Es: web server in 4 righe di python
http://code.google.com/p/android-scripting/
Alessandro Tanasi - alessandro@tanasi.it
LUGTrieste
Development Tools
Compila e crea il pacchetto automaticamente Lancia l'emulatore in debugging mode Genere la struttura del progetto Ant build.xml file IntelliJ project files
CLI: activityCreator.py
DroidDraw, SensorSimulator
LUGTrieste
Esempio
LUGTrieste
Anatomia di un'app
Activity: Componente UI (tipicamente una schermata, presentation layer) Service: Task in background Content Provider: Gestisce e condivide dati tra applicazioni Intent: Messaggistica asincrona Intent filter: Dichiarazione XML dei messaggi che possono essere gestiti Broadcast Receiver: attende intents broadcast che corrispondono a certi criteri (Intent filter) Manifest: Propriet dell'applicazione
Alessandro Tanasi - alessandro@tanasi.it
LUGTrieste
User interface
Composta da oggetti View e ViewGroup (vari tipi) Layout definito in file XML Stringhe memorizzate separatamente Sottoscrizione agli eventi dell'UI tramite listener o overriding callback Definizione dei menu e loro creazione automatica Notifiche Adapter per le viste dinamicamente Stili e temi
Alessandro Tanasi - alessandro@tanasi.it
LUGTrieste
Esempio
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello, I am a TextView" /> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello, I am a Button" /> </LinearLayout>
Alessandro Tanasi - alessandro@tanasi.it
LUGTrieste
Resource e asset
Generalmente sono elementi esterni referenziati dall'applicazione Immagini, audio, video, stringhe di testo, layout, temi Directory per resource (res/) e directory per asset (assets/) La differenza nel metodo di accesso I18n
LUGTrieste
Data Storage
Tecniche differenti per memorizzare dati Shared preferences: meccanismo per memorizzare strutture chiavi-valore SQLite: DBMS relazionale per memorizzare dati articolati Files: RW di file sulla memoria locale ed SD card Network: Utilizzando java.net.* e android.net.*
LUGTrieste
Multimedia
Grafica 2D e grafica 3D con OpenGL ES API Offre funzioni built-in di encoding/decoding per alcuni media types MediaPlayer e MediaRecorder android.location e Google Maps library Accelerometro, bussola
LUGTrieste
AndroidManifest.xml
Nome del package Java Descrive i suoi componenti Permessi richiesti dall'applicazione Permessi richiesti per interagire con i suoi componenti Opzionali informazioni per testing (profiling) Dipendenza dalla versione delle android API Librerie utilizzate
LUGTrieste
Esempio di manifest
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.sipdroid.sipua" android:versionName="1.1.3 beta" android:versionCode="32"> <uses-sdk android:minSdkVersion="3" /> <application android:icon="@drawable/icon64" android:label="@string/app_name"> <activity android:name=".ui.Sipdroid" android:label="@string/app_name" android:launchMode="singleInstance" android:configChanges="orientation|keyboardHidden"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <receiver android:name=".ui.Caller"/> <receiver android:name=".ui.Receiver" android:enabled="true"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> </application> <uses-permission android:name="android.permission.INTERNET"></usespermission>
Alessandro Tanasi - alessandro@tanasi.it
LUGTrieste
Life Cycle
foreground process (priorit critica) visible process (alta priorit) service process (bassa priorit) background process empty process
Le Activity sono mantenute in un activity stack (LIFO) Un activity ha tre stati: running o active, paused, stopped
LUGTrieste
http://code.google.com/android/reference/android/app/Activity.html#ActivityLifecycle
Alessandro Tanasi - alessandro@tanasi.it
LUGTrieste
Pubblicare un'applicazione
Iscriversi al market come sviluppatore (25) Dare un numero di versione Firmare il pacchetto Pubblicare l'applicazione Google trattiene il 30% degli incassi
LUGTrieste
Sicurezza
Ogni processo viene eseguito in una DVM separata File non condivisi tra applicazioni Linux + Android permission model UID e GID distinti assegnati all'installazione Stack address randomization
LUGTrieste
Android Permissions
Limite alle funzionalit di un software: android.permission Granularit sulle azioni e sull'accesso ai dati Specificate nel file manifest
LUGTrieste
Ma ...
Bypass memory protections Vunerabilit riscontrate La sandbox abbastanza granulare per far girare applicazioni non trusted? Marketing profiling, E.T. chiama sempre casa Non conoscenza del funzionamento interno di un'applicazione (client HTTP o HTTPS?) Rootkit, managed code rootkit
LUGTrieste
Conclusioni
Conclusioni
L'architettura disegnata pensando anche allo sviluppatore Lo sviluppo semplice e veloce Sistemi di security granulari allo scopo di isolare le applicazioni in una sandbox Lo sviluppo pu essere divertente e redditizio C' ampio spazio per la ricerca
LUGTrieste
Approfondimenti
http://code.google.com/android/ http://developer.android.com/index.html http://source.android.com/ http://www.blackhat.com/presentations/bh-usa-09/BURNS/BHUSA09-Burns-AndroidSurgery-PAPER.pdf http://jon.oberheide.org/files/cansecwest09-android.pdf http://groups.google.com/group/android-internals
LUGTrieste
Domande