Esercitazione sul Sistema Android...• Create una cartella jni dentro app/main (ATTENZIONE: La...
Transcript of Esercitazione sul Sistema Android...• Create una cartella jni dentro app/main (ATTENZIONE: La...
Pattern Recognition and Applications Lab
Università di Cagliari, Italia
Dipartimento di Ingegneria Elettrica
ed Elettronica
Esercitazione sul Sistema Android
Davide Maiorca, Ph.D.
Corso di Sistemi Operativi– A.A. 2016/2017
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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