PROGRAMMATION ANDROID
1 Ahcène Bounceur
Université de Bretagne Occidentale
2
La plate-forme mobile la plus
utilisée au monde
3
PLAN DU COURS
¢ Présentation de la plateforme Android
¢ Android Studio et les éléments d’un projet Android
¢ L’émulateur
¢ La distribution (APK)
¢ Le site
4
Chapitre 1
PARTIE 1
5 Plateforme Android
Débuter sur une nouvelle plate-forme
n'est jamais évident.
6
NOKIA 9000
1996
7
LA PLATEFORME MOBILE LA PLUS UTILISÉE AU MONDE
Montre (wear) Smartphone
Tablette
Auto TV
8
LA PLATEFORME MOBILE LA PLUS UTILISÉE AU MONDE
9
PLATEFORME ANDROID
¢ Points clés
Innovante :
¢ elle intègre toutes les nouvelles technologies (écran tactile,
accéléromètre, GPS, appareil photo, etc.)
Accessible :
¢ aucun matériel spécifique n'est nécessaire pour le
développement
¢ le langage de programmation utilisé est le Java (pas nouveau),
le C/C++ aussi.
Ouverte :
¢ Licence Open Source
10
ANDROID VS IOS
11
D'OÙ VIENT L'IDÉE DE L'ANDROID ?
¢ L'arrivée de l'iPhone
A bouleversée le paysage des systèmes d'exploitation
mobiles
Ergonomie, écran tactile, simplicité, connexion internet,
applications
Devenu un véritable standard pour les utilisateurs
¢ Lacunes des offres des constructeurs historiques
¢ Création de : Open Handset Alliance 12
D'OÙ VIENT L'IDÉE DE L'ANDROID ?
¢ Open Handset Alliance*
Coalition : 87 acteurs
Créée fin 2007
Mettre au point et promouvoir un système d'exploitation
mobile concurrent
¢ Complet
¢ Ouvert Android
¢ Gratuit
Licence Apache
13
*www.openhandsetalliance.com
14
En 2016
ANDROID VS IOS
15
Ref : http://www.zdnet.fr/
En 2018
ANDROID VS IOS
Global mobile OS market share in sales to end users from 1st quarter 2009 to
2nd quarter 2018
88%
12%
16
Ref : https://www.statista.com
LES VERSIONS DE LA PLATEFORME
Version Évolutions
Android 1.0 Début de l'aventure Android
Septembre 2008
Android 1.1 - Beaucoup de corrections de bogues (alarme,
Février 2009 Gmail...)
- Amélioration des fonctionnalités MMS
- Introduction des applications payantes sur l'Android
Market
Android 1.5 dit - Nouveau clavier avec autocomplétion
Cupcake - Support Bluetooth
Avril 2009 - Enregistrement de vidéos
- Widgets et Live Folders
- Animations changées
Android 1.6 dit Android 2.0 dit
Donut Eclair
… 17
Septembre 2009 Octobre 2009
LES VERSIONS DE LA PLATEFORME
2014
18
3.x 2015
LES VERSIONS DE LA PLATEFORME
Lollipop (5.0)
KitKat (4.4)
Jelly Bean (4.3)
19
LES VERSIONS DE LA PLATEFORME
Le mode DOZE
Marshmallow
6
20
LES VERSIONS DE LA PLATEFORME
21
LES VERSIONS DE LA PLATEFORME
Notifications 22
Permissions
LES VERSIONS DE LA PLATEFORME
PIE 9 23
LES VERSIONS DE LA PLATEFORME
10
Q
QUICHE
QUIK
QUALITY STREET
QUAKER OATS
QUESITO
QUINDIM
QUEEN OF PUDDINGS
QOTTAB
24
La prochaine version s’appellera ? QUEIJADAS
L’ARRIVÉE DU KOTLIN
JetBrains : entreprise née en 2000
En 2012 : elle a reçu le prix JAX L'Entreprise la plus innovante Java
Les développeurs de IntelliJ
Kotlin est un langage de programmation orienté objet et fonctionnel, avec un typage statique
qui permet de compiler pour la machine virtuelle Java et JavaScript. Son développement
provient principalement d'une équipe de programmeurs chez JetBrains basée à Saint-
Pétersbourg en Russie (son nom vient de l'île de Kotline, près de St. Pétersbourg).
Google annonce pendant la conférence Google I/O 2017 que Kotlin devient le second langage
de programmation supporté officiellement sur Android2 après Java.
25
L’ARRIVÉE DU KOTLIN
public class Personne { class Personne {
private String nom = "" ; var nom: String = ""
private Integer age = 0 ; var age: Int = 0
public Personne() {} constructor() {}
public Personne(String nom) { constructor(nom: String) {
this.nom = nom ; this.nom = nom ;
} }
public Personne(String nom) { constructor(nom: String, age: Int) : this(nom) {
this(nom); this.age = age
this.age = age;
} }
public void modifier(String nom, Integer age) { fun modifier(nom: String, age: Int) {
this.nom = nom ; this.nom = nom
this.age = age ; this.age = age
} }
public void afficher() { fun afficher() {
System.out.println("L'age de "+nom+" est "+ println("L'age de $nom est $age ans")
age+" ans");
} }
} }
Personne personne1 = new Personne(); var personne1 : Personne = Personne()
personne1.modifier("Jean", 24); personne1.modifier("Jean", 24)
personne1.afficher(); personne1.afficher() 26
ARCHITECTURE DE LA PLATEFORME
¢ Autour de Linux
Android est conçue pour des appareils mobiles au sens
large : tablettes, ordinateurs portables, bornes interactives,
baladeurs …
¢ La plate-forme Android est composée de différentes
couches :
un noyau Linux (multitâches)
des bibliothèques graphiques, multimédias ;
une machine virtuelle Java adaptée : la Dalvik Virtual
Machine ;
un framework applicatif proposant des fonctionnalités de
gestion de fenêtres, de téléphonie, de gestion de contenu... ;
des applications dont un navigateur web, une gestion des
27
contacts, un calendrier…
LES COMPOSANTS MAJEURS DE LA PLATE-FORME
ANDROID
28
LES COMPOSANTS
MAJEURS DE LA
PLATE-FORME
ANDROID
29
Embedded Android (opersys)
LE KIT DE DÉVELOPPEMENT ANDROID
¢ Le SDK Android est composé de plusieurs
éléments pour aider les développeurs à créer et à
maintenir des applications :
des API (interfaces de programmation) ;
des exemples de code ;
de la documentation ;
des outils – parmi lesquels un émulateur – permettant
de couvrir quasiment toutes les étapes du cycle de
développement d'une application.
¢ Le SDK Android est disponible gratuitement sur le
site de Google.
http://developer.android.com 30
INSTALLATION
¢ Recommandation Eclipse
Installer le JDK
¢ http://develooppers.sun.com/downloads
Installer le kit de développement Android
¢ http://developer.android.com/sdk/index.html Eclipse
Installer l'IDE Eclipse
¢ http://www.eclipse.org/downloads
Installer le module ADT (Android Development Tools) dans
Eclipse
¢ Passer par Help -> Updates
¢ Ou Help -> Install new software (sous macOS) Android Studio
31
IDE (INTELLIJ IDEA) : ANDROID STUDIO
32
IDE (INTELLIJ IDEA) : ANDROID STUDIO
33
IDE (INTELLIJ IDEA) : ANDROID STUDIO
34
IDE (INTELLIJ IDEA) : ANDROID STUDIO
35
Menu
Projet
Ré-Exécution dans (version, SDK, compilation, etc.)
le même AVD
Configuration
(émulation, Ré-Exécution
exécution etc.) sans recompilation
Arrêter l’exécution
Recherche
Exécution Debug Synchronisation
Projet/Ressources
SDK Manager
Préférences
AVD Manager
Profiler 36
Make
Menu
Projet
Ré-Exécution dans (version, SDK, compilation, etc.)
le même AVD
Configuration
(émulation, Ré-Exécution
exécution etc.) sans recompilation
Arrêter l’exécution
Recherche
Exécution Debug Synchronisation
Projet/Ressources
SDK Manager
Préférences
AVD Manager
Profiler 37
Make
Menu
Projet
Ré-Exécution dans (version, SDK, compilation, etc.)
le même AVD
Configuration
(émulation, AVD en Ré-Exécution
exécution etc.) cours sans recompilation
Arrêter l’exécution
Recherche
Exécution Debug
Synchronisation
Projet/Ressources SDK Manager
Préférences
AVD Manager
Profiler 38
Make
CONFIGURATION D'UN APPAREIL VIRTUEL
¢ Le développement sous Android nécessite la
création d'un profil d'appareil afin de pouvoir lancer
des applications. Un profil d'appareil permet de
spécifier à l'émulateur la version du SDK que ce
dernier doit lancer ainsi que le type d'écran, la taille
de la carte SD, etc.
AVD Manager
39
CONFIGURATION D'UN APPAREIL VIRTUEL
40
CONFIGURATION D'UN APPAREIL VIRTUEL
Dupliquer l’émulateur
Réinitialiser l’émulateur
(supprimer les applis, les paramètres, …)
Peut redémarrer
Montrer les fichiers, de l’émulateur, sur le
disque
Voir la liste des configuration de
l’émulateur
Supprimer l’émulateur
Stop
41
CONFIGURATION D'UN APPAREIL VIRTUEL
42
CONFIGURATION D'UN APPAREIL VIRTUEL
43
CONFIGURATION D'UN APPAREIL VIRTUEL
44
Projet Android
45
Projet Android
46
Projet Android
47
Projet Android
48
Projet Android
49
Projet Android
50
Projet Android
51
Projet Android
Sur le disque
52
Projet Android
53
MainActivity
package fr.univ_brest.bounceur.projet_cours;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i("ABCD", "Mon Message");
System.out.println("Bonjour");
}
public void maMethode() {
// TODO: 14/10/2016
}
} 54
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
Projet Android xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.bounceur.servicelooper.Main2Activity">
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView"
tools:layout_editor_absoluteX="48dp"
tools:layout_editor_absoluteY="16dp" />
</android.support.constraint.ConstraintLayout>
55
Les ressources (Dossier res)
¢ Les ressources sont des fichiers externes – ne
contenant pas d'instruction – qui sont utilisés par le
code et liés à votre application au moment de sa
construction. Android offre un support d'un grand
nombre de fichiers ressources comme les fichiers
images JPEG et PNG, les fichiers XML, etc.
56
Les ressources (Dossier res)
¢ Le répertoire res est composé de différents sous-
répertoires :
res/drawable : contient les ressources de type image
(PNG, JPEG et GIF) ;
res/layout : contient les descriptions des interfaces
utilisateur ;
res/values : contient les chaînes de caractères, les
dimensions, etc. ;
res/xml : contient les fichiers XML supplémentaires
(préférences, etc.) ;
res/menu : contient la description des menus ;
res/raw : contient les ressources autres que celles
décrites ci-dessus qui seront empaquetées sans aucun
traitement. 57
LES RESSOURCES : types majeurs
Type de ressource Répertoire Description
associé
Valeurs simples res/values Fichiers XML convertis en différents types de ressources. Ce
répertoire contient des fichiers dont le nom reflète le type de
ressources contenues :1. arrays.xml définit des tableaux ; 2.
string.xml définit des chaînes de caractères ; etc.
Drawables res/drawable Fichiers .png, .jpeg qui sont convertis en bitmap, etc.
Layouts res/layout Fichiers XML convertis en mises en page d'écrans (gabarits).
Animations res/anim Fichiers XML convertis en objets animation.
Ressources XML res/xml Fichiers XML qui peuvent être lus et convertis à l'exécution par
la méthode resources.getXML
Ressources brutes res/raw Fichiers à ajouter directement à l'application compressée créée.
Ils ne seront pas convertis. 58
Les ressources (Dossier res)
Le ficher R.java
¢ Les ressources sont accessibles et utilisées depuis
le code grâce à la classe statique R. Cette classe
est automatiquement générée en fonction des
ressources présentes dans votre projet au moment
de la compilation et de la construction de
l'application.
Interfaces Graphiques
(XML)
Activités
(Java) R.java
Ressources
(images, audio, …)59
R (R.java): lien XML/Java
Project Files
60
LE FICHIER DE CONFIGURATION
¢ Chaque application Android nécessite un fichier de
configuration : AndroidManifest.xml
¢ Ce fichier est placé dans le répertoire de base du
projet, à sa racine.
¢ Il décrit le contexte de l'application, les activités, les
services, les récepteurs d'Intents (Broadcast
receivers), les fournisseurs de contenu et les
permissions.
61
AndroidManifest (Application)
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="fr.univ_brest.bounceur.projet_cours">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest> 62
AndroidManifest (Application)
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="fr.univ_brest.bounceur.projet_cours">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/Theme.Design.NoActionBar">
<activity
android:name=".MainActivity"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest> 63
Pour toutes les activités de l’application
AndroidManifest (Application)
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="fr.univ_brest.bounceur.projet_cours">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:theme="@style/Theme.Design.NoActionBar"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
64
</manifest> Uniquement pour l’activité MainActivity
AndroidManifest (permissions)
¢ Certaines opérations sont réalisables à condition
d'en obtenir la permission. Ces actions sont de
plusieurs formes :
opérations pouvant entraîner un surcoût (connexion,
échange de données, envoi de SMS par exemple) ;
utilisation de données personnelles (accès à vos
contacts, à votre compte Google, exploitation de vos
informations linguistiques entre autres) ;
accès au matériel du téléphone (prise de clichés,
écriture sur la carte mémoire, etc.).
65
AndroidManifest (permissions)
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
66
AndroidManifest (permissions)
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="fr.univ_brest.bounceur.projet_cours">
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest> 67
Les permissions (à partir de la version M)
Context
if (
ActivityCompat.checkSelfPermission(this,
Manifest.permission.SEND_SMS) !=
PackageManager.PERMISSION_GRANTED
) {
ActivityCompat.requestPermissions(
this,
new String[]{Manifest.permission.SEND_SMS},
Activity 1
);
return;
}
68
build.gradle (Projet : version de gradle)
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.4.2’
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
69
}
build.gradle (Module : compilation)
apply plugin: 'com.android.application'
android {
compileSdkVersion 28
buildToolsVersion "29.0.1"
defaultConfig {
applicationId "com.example.monappli"
minSdkVersion 15
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-
rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2' 70
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
build.gradle (Module : compilation)
apply plugin: 'com.android.application'
android {
compileSdkVersion 28
buildToolsVersion "29.0.1"
Unique
defaultConfig {
applicationId "com.example.monappli"
minSdkVersion 15
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-
rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
71
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
NEW …
72
NEW … (SUR LE DOSSIER DRAWABLE)
NOUVELLE IMAGE/VECTOR ASSET
Créer une
image de
grande taille
Pour créer :
• Une icône de notification
• Une icône de la barre d’action ou de
tabulation 73
• Icône pour l’application
NEW … (SUR LE DOSSIER RES)
NOUVEAU FICHIER RESSOURCE
74
NEW … (SUR LE DOSSIER RES)
NOUVEAU FICHIER RESSOURCE
75
Projet Android (structure du projet)
76
Projet Android (structure du projet)
77
Projet Android (structure du projet)
78
Projet Android (structure du projet)
79
Projet Android (structure du projet)
80
Projet Android (intégrer un JAR)
¢ Copier le Jar dans le dossier libs
81
Projet Android (intégrer un JAR)
¢ Aller dans Structure du Projet
82
Projet Android (intégrer un JAR)
¢ Aller dans Structure du Projet
83
Projet Android (intégrer un JAR)
¢ Aller dans Structure du Projet
84
PARTIE 2 : Exécution
85
L’ÉMULATEUR 1.5
86
L’ÉMULATEUR 2.2
87
L’ÉMULATEUR 3.0
88
L’ÉMULATEUR 4.0
89
L’ÉMULATEUR actuel
90
L’ÉMULATEUR actuel
91
L’ÉMULATEUR actuel
92
EXÉCUTION (Lancer un émulateur) : ligne de
commande
sdk/tools/emulator -avd nom_de_l’emulateur
sdk/tools/emulator -netdelay none -netspeed full -avd
nom_de_l’emulateur
93
EXÉCUTION (Lancer un émulateur) : directe
94
Activation du mode Développeur
Cliquez
plusieurs fois
95
Activation du mode Développeur
96
EXÉCUTION (Lancer un émulateur) : directe
97
EXÉCUTION DIRECTE SUR LE TÉLÉPHONE
98
LE FICHIER APK
¢ Toutes ces ressources sont placées, converties ou
non, dans un fichier de type APK qui constituera
le programme distribuable de votre application.
99
LE FICHIER APK
¢ La chaine de compilation Android :
javac dx
.java .class .dex
Ressources
100
LE FICHIER APK (signé)
101
LE FICHIER APK (signé)
102
Attention : ne pas oublier les mots de passe, surtout si l’application a
déjà été déployée.
LE FICHIER APK (signé)
103
MESSAGES
104
CONSOLE
Exemple : Redémarrer l’émulateur par ligne de commande :
adb -e reboot
105
ANDROID PROFILER
106
ANDROID PROFILER
107
ANDROID PROFILER
108
MONITEUR (LOGCAT) : MESSAGES
System.out.println("Bonjour");
Log.v("label", "Bonjour");
Log.d("label", "Bonjour");
Log.i("label", "Bonjour");
Log.w("label", "Bonjour");
Log.e("label", "Bonjour"); 109
Log.a("label", "Bonjour");
MONITEUR (LOGCAT) : APPAREIL CONCERNÉ
110
MONITEUR (LOGCAT) : LES PROCESSUS
111
RUN
112
TODO
//TODO
// Je dois terminer la fonction de rotation d'un point 113
// Penser à utiliser des floats
BUILD
Les erreurs liées à la construction du projet et à la compilation
114
BUILD
Les erreurs liées à la construction du projet et à la compilation
115
BUILD
Les erreurs liées à la construction du projet et à la compilation
116
VERSIONS D’ANDROID (CLASS BUILD)
public static class VERSION_CODES {
public static final int BASE = 1;
public static final int BASE_1_1 = 2;
public static final int CUPCAKE = 3;
public static final int CUR_DEVELOPMENT = 10000;
public static final int DONUT = 4;
public static final int ECLAIR = 5;
public static final int ECLAIR_0_1 = 6;
public static final int ECLAIR_MR1 = 7;
public static final int FROYO = 8;
public static final int GINGERBREAD = 9;
public static final int GINGERBREAD_MR1 = 10;
public static final int HONEYCOMB = 11;
public static final int HONEYCOMB_MR1 = 12;
public static final int HONEYCOMB_MR2 = 13;
public static final int ICE_CREAM_SANDWICH = 14;
public static final int ICE_CREAM_SANDWICH_MR1 = 15;
public static final int JELLY_BEAN = 16;
public static final int JELLY_BEAN_MR1 = 17;
public static final int JELLY_BEAN_MR2 = 18;
public static final int KITKAT = 19;
public static final int KITKAT_WATCH = 20;
public static final int LOLLIPOP = 21;
public static final int LOLLIPOP_MR1 = 22;
public static final int M = 23;
public static final int N = 24;
public static final int N_MR1 = 25;
public static final int O = 26; Build.VERSION_CODES.M
public VERSION_CODES() { 117
throw new RuntimeException("Stub!");
}
}
NOUVELLES ANNOTATIONS
@RequiresApi
@Override
@RequiresApi(api = Build.VERSION_CODES.N)
public void methode() {
...
118
NOUVELLES ANNOTATIONS
@RequiresApi
@Override
public void methode() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
...
}
else {
...
}
} 119
www.android.com
120
www.android.com
121
122