Esercitazione sul Sistema Android...• Create una cartella jni dentro app/main (ATTENZIONE: La...

19
Pattern Recognition and Applications Lab Università di Cagliari, Italia Dipartimento di Ingegneria Elettrica ed Elettronica Esercitazione sul Sistema Android Davide Maiorca, Ph.D. [email protected] Corso di Sistemi Operativi– A.A. 2016/2017

Transcript of Esercitazione sul Sistema Android...• Create una cartella jni dentro app/main (ATTENZIONE: La...

Page 1: Esercitazione sul Sistema Android...• Create una cartella jni dentro app/main (ATTENZIONE: La locazione ed il nome della cartella non possono essere diversi da questi) • Create

Pattern Recognition and Applications Lab

Università di Cagliari, Italia

Dipartimento di Ingegneria Elettrica

ed Elettronica

Esercitazione sul Sistema Android

Davide Maiorca, Ph.D.

[email protected]

Corso di Sistemi Operativi– A.A. 2016/2017

Page 2: Esercitazione sul Sistema Android...• Create una cartella jni dentro app/main (ATTENZIONE: La locazione ed il nome della cartella non possono essere diversi da questi) • Create

http://pralab.diee.unica.it

Sommario

• Macchina Virtuale Android

• Android SDK (Emulatore Android)

• Android Studio – Prima App Android

• Android NDK: Uso Librerie Native su Android

• Operazioni con APK

• Riferimenti

2

Page 3: Esercitazione sul Sistema Android...• Create una cartella jni dentro app/main (ATTENZIONE: La locazione ed il nome della cartella non possono essere diversi da questi) • Create

http://pralab.diee.unica.it

Macchina Virtuale Esercitazione

• Link macchina virtuale per l’esercitazione: (Serve VirtualBox: https://docs.google.com/uc?id=0B6UbtYzkoH90aGZuclRUczhfa0k&export=download

• Ubuntu 16.04

• Interfaccia MATE

• Contiene numerosi strumenti per analizzare/sviluppare applicazioni Android

• Ricordatevi di impostare il layout da tastiera in Italiano

3

Page 4: Esercitazione sul Sistema Android...• Create una cartella jni dentro app/main (ATTENZIONE: La locazione ed il nome della cartella non possono essere diversi da questi) • Create

http://pralab.diee.unica.it

Android SDK

• Contiene le librerie e i tools necessari per sviluppare con Android

• Aprite terminale -> Digitate cd Android/Sdk

• Livello SDK fino al 23 (Android 6 Marshmallow).

• Livello SDK massimo: 25 (Android N 7.1)

• Noi usiamo livello 17 (Android 4.2)

4

Page 5: Esercitazione sul Sistema Android...• Create una cartella jni dentro app/main (ATTENZIONE: La locazione ed il nome della cartella non possono essere diversi da questi) • Create

http://pralab.diee.unica.it

Emulatore

• Ambiente in cui viene simulata l’esecuzione di Android

• Simula QUASI tutto...(ad es., manca l’emulazione del wi-fi)

• Potete emulare due architetture:

• ARM (Nativa Android)

• X86 (Molto più veloce, le istruzioni vengono convertite in un formato compatibile con istruzioni Intel)

• Noi useremo ARM

5

Page 6: Esercitazione sul Sistema Android...• Create una cartella jni dentro app/main (ATTENZIONE: La locazione ed il nome della cartella non possono essere diversi da questi) • Create

http://pralab.diee.unica.it

Emulatore – altri comandi

• Da terminale date android list targets per vedere i livelli di api disponibili (ordinati per ID)

• Per creare nuovo emulatore android create avd –n «Name» -t «ID» [- options] ...

• (Ricordatevi di fare «Refresh» dentro la schermata di selezione degli emulatori!)

6

Page 7: Esercitazione sul Sistema Android...• Create una cartella jni dentro app/main (ATTENZIONE: La locazione ed il nome della cartella non possono essere diversi da questi) • Create

http://pralab.diee.unica.it

Android Studio

• E’ l’IDE (ambiente di sviluppo) realizzato da Google appositamente per sviluppare app Android

• Nella macchina virtuale lo avete a disposizione

• Cliccate sulla grande «A» in basso fra le icone

• Selezionate File->New->New Project

• Sotto Application Name scegliete il nome dell’applicazione

• Andate avanti fino a quando non vi viene chiesto di scegliere l’attività

• Scegliete Basic Activity e premete Finish

7

Page 8: Esercitazione sul Sistema Android...• Create una cartella jni dentro app/main (ATTENZIONE: La locazione ed il nome della cartella non possono essere diversi da questi) • Create

http://pralab.diee.unica.it

Android Studio – Sviluppo Android

• Sotto app/src trovate il sorgente vero e proprio della vostra app

• In particolare, sotto app/src/main/java trovate il codice java dell’attività principale

• Sotto questo percorso trovate anzitutto una cartella (chiamato package) che ospita il codice delle attività

• Il package è caratterizzato da avere diverse parole separate da punti (esempio: com.example.andro…)

• Dentro il package trovate il file MainActivity.java

• Il codice contenuto è molto essenziale (il metodo che viene sempre eseguito per primo è OnCreate)

8

Page 9: Esercitazione sul Sistema Android...• Create una cartella jni dentro app/main (ATTENZIONE: La locazione ed il nome della cartella non possono essere diversi da questi) • Create

http://pralab.diee.unica.it

Android Studio – Sviluppo Android (2)

• Potete anche gestire graficamente gli elementi della vostra attività (widget, caselle di testo)

• Per farlo, doppio click su app/src/main/res/layout/activity_main.xml

• L’interfaccia è molto intuitiva, scegliete cosa volete inserire nella vostra attività e trascinatelo dentro

• Questi elementi verranno poi generati dinamicamente, a partire dai file .xml in una classe chiamata R

• Agendo su R, è sempre possibile modificare dinamicamente quello che inserite nell’xml

9

Page 10: Esercitazione sul Sistema Android...• Create una cartella jni dentro app/main (ATTENZIONE: La locazione ed il nome della cartella non possono essere diversi da questi) • Create

http://pralab.diee.unica.it

Android Studio – Sviluppo Android (3)

• Se il codice è corretto, potete compilare la vostra applicazione con Build->Build Apk dal menù di Android Studio

• Per eseguirla, invece Run->Run

• Vi verrà richiesto di scegliere l’emulatore dove installare ed eseguire l’applicazione.

• L’installazione e l’esecuzione sono automatiche!

• Durante la fase di build, la compilazione e la creazione dell’apk vengono automaticamente effettuate attraverso il plugin Gradle

• Quando l’applicazione viene eseguita, in basso potete osservare il log (logcat) delle attività dell’emulatore

10

Page 11: Esercitazione sul Sistema Android...• Create una cartella jni dentro app/main (ATTENZIONE: La locazione ed il nome della cartella non possono essere diversi da questi) • Create

http://pralab.diee.unica.it

Android Studio – Sviluppo con NDK

• Come sapete, è possibile usare delle librerie in C/C++ in una applicazione Android

• Per farlo, è necessario modificare prima di tutto alcune opzioni su Android Studio

• Installate l’NDK da File->Project Structure->Android NDK Location (dovreste vedere una opzione per il download)

• Una volta installato l’NDK, chiudete la finestra confermando con Ok

• A questo punto, bisogna modificare il plugin Gradle per poter operare con NDK

11

Page 12: Esercitazione sul Sistema Android...• Create una cartella jni dentro app/main (ATTENZIONE: La locazione ed il nome della cartella non possono essere diversi da questi) • Create

http://pralab.diee.unica.it

Android Studio – Modifica Gradle

• Aprite il file app/gradle/build.gradle

• Su classpath inserite ‘com.android.tools.build:gradle-experimental:0.7.2’

• Andate poi su gradle/wrapper e su gradle-wrapper.properties inserite: distributionUrl=https\://services.gradle.org/distribution/gradle-2.10-all.zip

• Ora andate su app/build.gradle e modificate i seguenti parametri:

• apply plugin: ‘com.android.model.application’

• Prima di android inserite model { , e mettete l’ultima graffa dopo quella che chiude il blocco android

12

Page 13: Esercitazione sul Sistema Android...• Create una cartella jni dentro app/main (ATTENZIONE: La locazione ed il nome della cartella non possono essere diversi da questi) • Create

http://pralab.diee.unica.it

Android Studio – Modifica Gradle (2)

• Sotto il blocco defaultConfig (cioè sotto la graffa che lo chiude) inserite: ndk { moduleName=«hello-android-jni» } (o il nome che preferite: ricordatevi che dovrà essere uguale al nome del file.c che andate a creare

• Il blocco buildTypes dovrà diventare: buildTypes{ release { } }

• Potete trovare tutto già configurato nella applicazione SisopTest che trovate nel sito del corso

13

Page 14: Esercitazione sul Sistema Android...• Create una cartella jni dentro app/main (ATTENZIONE: La locazione ed il nome della cartella non possono essere diversi da questi) • Create

http://pralab.diee.unica.it

Codice NDK

• L’obiettivo è quello di stampare a video una stringa creata attraverso le API native

• Per fare questo, trascinate una casella MediumText al centro della vostra attività

• Andate ora sul file MainActivity.java

• Subito sotto public class … inserite:

• public native String getMsgFromJni();

• static {System.loadLibrary(«hello-android-jni»)} (N.b. Deve essere LO STESSO nome usato su Gradle)

14

Page 15: Esercitazione sul Sistema Android...• Create una cartella jni dentro app/main (ATTENZIONE: La locazione ed il nome della cartella non possono essere diversi da questi) • Create

http://pralab.diee.unica.it

Codice NDK (2)

• Create una cartella jni dentro app/main (ATTENZIONE: La locazione ed il nome della cartella non possono essere diversi da questi)

• Create dentro la cartella un file hello-android-jni.c (NON .cpp)

• Il file dovrà essere organizzato così: • #include <jni.h> • #include <string.h> • JNIEXPORT jstring JNICALL

Java_NomePackage_NomeAttività_getMsgFromJni(JNIEnv * env, jobject instance) { return (*env)->NewStringUTF(env, msg) }, dove msg è una stringa a vostro piacimento da impostare

• TUTTO dovrà essere case sensitive. Nel nome del metodo, la parte Java_ è obbligatoria. Il resto dipende da voi…(vedi l’esempio su SisopTest)

15

Page 16: Esercitazione sul Sistema Android...• Create una cartella jni dentro app/main (ATTENZIONE: La locazione ed il nome della cartella non possono essere diversi da questi) • Create

http://pralab.diee.unica.it

Codice NDK (3)

• Torniamo al codice dell’attività

• Alla fine del metodo OnCreate inserite: ((TextView) findViewbyId(R.id.TextView)).setText(getMsgFromJni());

• In sostanza, il vostro codice C invoca una funzione nativa per Android che ritorna una stringa che può essere trattata come oggetto Java

• Tale stringa viene scritta nella TextView (cioè nel rettangolo che avete messo prima dentro l’attività) e sostituita dinamicamente con la precedente

• In caso di errori legati al plugin Gradle, Android Studio vi può chiedere di aggiornarlo o di scegliere il wrapper (fatelo!)

16

Page 17: Esercitazione sul Sistema Android...• Create una cartella jni dentro app/main (ATTENZIONE: La locazione ed il nome della cartella non possono essere diversi da questi) • Create

http://pralab.diee.unica.it

Operazioni con APK

• Trovate l’apk installata dentro la cartella del progetto creato con Android Studio, nella sottocartella app/build/outputs/apk. Il nome dell’apk è solitamente app-debug.apk

• Potete anche installarla senza usare Android Studio col comando adb install app-debug.apk (l’emulatore deve essere acceso)

• Potete disinstallare l’APK da terminale se, con emulatore acceso, date adb install nome_package (attenzione: NON il nome dell’apk – se avete dubbi guardate il manifest dentro del progetto Android Studio)

17

Page 18: Esercitazione sul Sistema Android...• Create una cartella jni dentro app/main (ATTENZIONE: La locazione ed il nome della cartella non possono essere diversi da questi) • Create

http://pralab.diee.unica.it

Operazioni con APK (2)

• E’ possibile disassemblare una app Android senza conoscerne il sorgente

• Questo viene fatto al fine di, per esempio, visualizzare il manifest o le classi

• Per disassemblare, usate apktool decode nome_apk –o CartellaOutput

• L’output verrà salvato in una cartella da voi scelta. All’interno trovate l’AndroidManifest.xml ed il codice delle classi in formato .smali

• Trovate anche eventuali librerie native (create con NDK) in formato .so

18

Page 19: Esercitazione sul Sistema Android...• Create una cartella jni dentro app/main (ATTENZIONE: La locazione ed il nome della cartella non possono essere diversi da questi) • Create

http://pralab.diee.unica.it

Riferimenti

• https://codelabs.developers.google.com/codelabs/android-studio-jni/index.html?index=..%2F..%2Findex#0

• http://tools.android.com/tech-docs/new-build-system/gradle-experimental

• https://codelabs.developers.google.com/codelabs/android-studio-jni/index.html?index=..%2F..%2Findex#0https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/functions.html#NewStringUTF

• https://developer.android.com/studio/index.html

19