Sunteți pe pagina 1din 37

Android Introduzione allarchitettura, alla programmazione e alla sicurezza

Alessandro Tanasi - http://www.tanasi.it - alessandro@tanasi.it

Fun & profit

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

Alessandro Tanasi - alessandro@tanasi.it

LUGTrieste

Architettura

Android

Software stack per device mobili


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

Alessandro Tanasi - alessandro@tanasi.it

LUGTrieste

Kernel

Linux kernel e driver che fanno da hardware abstraction layer Core system services per security, memory management, process management, network stack

Alessandro Tanasi - alessandro@tanasi.it

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

Alessandro Tanasi - alessandro@tanasi.it

LUGTrieste

Application framework

API ad alto livello Le applicazioni native Android e quelle di terze parti usano le stesse API

Alessandro Tanasi - alessandro@tanasi.it

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

Alessandro Tanasi - alessandro@tanasi.it

Dalvik Virtual Machine

Bytecode interpreter (no JIT)


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

Dalvik Executable Format


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

Alessandro Tanasi - alessandro@tanasi.it

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

Native Development Kit (NDK)


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

Android Scripting Environment


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

Eclipse Plugin: Andreoid Dev 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

Alessandro Tanasi - alessandro@tanasi.it

LUGTrieste

Esempio

Alessandro Tanasi - alessandro@tanasi.it

LUGTrieste

Anatomia di un'app

Lego per costruzioni


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

Alessandro Tanasi - alessandro@tanasi.it

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.*

Alessandro Tanasi - alessandro@tanasi.it

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

Alessandro Tanasi - alessandro@tanasi.it

LUGTrieste

AndroidManifest.xml

Ogni applicazione deve avere un AndroidManifest.xml file Descrive l'applicazione:


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

Alessandro Tanasi - alessandro@tanasi.it

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

Le applicazioni running sono gestite in una gerarchia:


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

Alessandro Tanasi - alessandro@tanasi.it

Life cycle in dettaglio

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

Alessandro Tanasi - alessandro@tanasi.it

LUGTrieste

Sicurezza

Android Security Model


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

Alessandro Tanasi - alessandro@tanasi.it

LUGTrieste

Android Permissions

Limite alle funzionalit di un software: android.permission Granularit sulle azioni e sull'accesso ai dati Specificate nel file manifest

<uses-permission android:name="android.permission.READ_CONTACTS"> </uses-permission> <uses-permission android:name="android.permission.WRITE_CONTACTS"> </uses-permission>

Alessandro Tanasi - alessandro@tanasi.it

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

Alessandro Tanasi - alessandro@tanasi.it

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

Alessandro Tanasi - alessandro@tanasi.it

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

Alessandro Tanasi - alessandro@tanasi.it

LUGTrieste

Domande

S-ar putea să vă placă și