• 20 hours
  • Medium

Free online content available in this course.

Paperback available in this course

You can get support and mentoring from a private teacher via videoconference on this course.

Got it!

Last updated on 2/26/19

L'univers Android

Log in or subscribe for free to enjoy all this course has to offer!

Dans ce tout premier chapitre, je vais vous présenter ce que j'appelle l'« univers Android ». Le système, dans sa genèse, part d'une idée de base simple, et très vite son succès fut tel qu'il a su devenir un incontournable du monde mobile, bien qu'on retrouve ce système d'exploitation dans bien d'autres domaines que la mobilité.
Nous allons rapidement revenir sur cette aventure et sur la philosophie d'Android, puis je rappellerai rapidement les bases de la programmation en Java, pour ceux qui auraient besoin d'une petite piqûre de rappel.

La création d'Android

Quand on pense à Android, on pense immédiatement à Google, et pourtant il faut savoir que cette multinationale n'est pas à l'initiative du projet. D'ailleurs, elle n'est même pas la seule à contribuer à plein temps à son évolution. À l'origine, « Android » était le nom d'une PME américaine, Android Incorporated, créée en 2003 puis rachetée par Google en 2005, qui avait la ferme intention de s'introduire sur le marché des produits mobiles. L'objectif d'Android était de développer un système d'exploitation mobile plus intelligent, qui ne se contenterait pas uniquement de permettre d’envoyer des SMS et transmettre des appels, mais qui devait permettre à l'utilisateur d'interagir avec son environnement (notamment avec son emplacement géographique). Ses principaux concurrents à l'époque étaient Symbian et Windows Mobile. C'est pourquoi, contrairement à une croyance populaire, il n'est pas possible de dire qu'Android est une réponse de Google à l'iPhone d'Apple, puisque l'existence de ce dernier n'a été révélée que deux années plus tard.

C'est en 2007 que les choses s'envenimèrent. À cette époque, les constructeurs concevaient tous un système d'exploitation spécifique pour leurs téléphones, et il n'y avait aucune base commune entre les systèmes d'exploitation mobiles de deux constructeurs différents. Ce système entravait la possibilité de développer facilement des applications qui s'adapteraient à tous les téléphones, surtout entre constructeurs, puisque la base était complètement différente. Un développeur était plutôt spécialisé dans un système particulier et il devait se contenter de langages de bas niveaux comme le C ou le C++. De plus, les constructeurs faisaient en sorte de livrer des bibliothèques de développement très réduites de manière à dissimuler leurs secrets de fabrication. En janvier 2007, Apple dévoilait l'iPhone, un téléphone tout simplement révolutionnaire pour l'époque, capable d'aller sur internet, de lire des vidéos, etc. L'annonce est un désastre pour les autres constructeurs, qui doivent s'aligner sur cette nouvelle concurrence. Le problème étant que pour atteindre le niveau d'iOS (iPhone OS, le système d'exploitation pour iPhone), il aurait fallu des années de recherche et développement à chaque constructeur...

C'est pourquoi est créée en novembre de l'année 2007 l'Open Handset Alliance, et qui comptait à sa création 35 entreprises évoluant dans l'univers du mobile, dont Google. Cette alliance a pour but de développer un système open source (c'est-à-dire dont le code source est accessible à tous) pour l'exploitation sur mobile et ainsi concurrencer les systèmes propriétaires, en particulier iOS. Cette alliance a pour logiciel vedette Android, mais il ne s'agit pas de sa seule activité.

L'OHA compte à l'heure actuelle 80 membres.

Le logo de l'OHA, une organisation qui cherche à développer des standards open source pour les appareils mobiles
Le logo de l'OHA, une organisation qui cherche à développer des standards open source pour les appareils mobiles

Depuis sa création, la popularité d'Android a toujours été croissante. C'est au quatrième trimestre 2010 qu'Android devient le système d'exploitation mobile le plus utilisé au monde, devançant Symbian (le système d'exploitation de Nokia avant qu'ils optent pour Windows Phone). Désormais, on le retrouve non seulement dans les tablettes et smartphones, mais aussi dans les téléviseurs, les consoles de jeux, les appareils photos, etc.

La philosophie et les avantages d'Android

Open source

Le contrat de licence pour Android respecte les principes de l'open source, c'est-à-dire que vous pouvez à tout moment télécharger les sources et les modifier selon vos goûts ! Bon, je ne vous le recommande vraiment pas, à moins que vous sachiez ce que vous faites... Notez au passage qu'Android utilise des bibliothèques open source puissantes, comme par exemple SQLite pour les bases de données et OpenGL pour la gestion d'images 2D et 3D (pour faire des jeux !).

Gratuit (ou presque)

Android est gratuit, autant pour vous que pour les constructeurs. S'il vous prenait l'envie de produire votre propre téléphone sous Android, alors vous n'auriez même pas à ouvrir votre porte-monnaie (mais bon courage avec tout le travail à fournir !). En revanche, pour poster vos applications sur le Play Store, il vous en coûtera la modique somme de 25$. Ces 25$ (je donnerais bien la valeur équivalente en euro, mais je ne sais pas pourquoi, le taux de change change constamment) permettent de publier autant d'applications que vous le souhaitez, à vie ! :D

Facile à développer

Toutes les API mises à disposition facilitent et accélèrent grandement le travail. Ces APIs sont très complètes et très faciles d'accès. De manière un peu caricaturale, on peut dire que vous pouvez envoyer un SMS en seulement deux lignes de code (concrètement, il y a un peu d'enrobage autour de ce code, mais pas tellement).

Facile à vendre

Le Play Store (anciennement Android Market) est une plateforme immense et très visitée ; c'est donc une mine d'opportunités pour quiconque veut diffuser une application dessus.

Flexible

Le système est extrêmement portable, il s'adapte à beaucoup de structures différentes. Les smartphones, les tablettes, la présence ou l'absence de clavier ou de trackball, différents processeurs... On trouve même des fours à micro-ondes qui fonctionnent à l'aide d'Android ! ^^
Non seulement c'est une immense chance d'avoir autant d'opportunités, mais en plus Android est construit de manière à faciliter le développement et la distribution en fonction des composants en présence dans le terminal (si votre application nécessite d'utiliser le Bluetooth, seuls les terminaux équipés de Bluetooth pourront la voir sur le Play Store).

Complémentaire

L'architecture d'Android est inspirée par les applications composites, et encourage par ailleurs leur développement. Ces applications se trouvent essentiellement sur internet et leur principe est que vous pouvez combiner plusieurs composants totalement différents pour obtenir un résultat surpuissant. Par exemple, si on combine l'appareil photo avec le GPS, on peut poster les coordonnées GPS des photos prises.

Le langage Java

Cette petite section permettra à ceux fâchés avec le Java de se remettre un peu dans le bain et surtout de réviser le vocabulaire de base. Notez qu'il ne s'agit que d'un rappel, il est indispensable de bien connaître le Java (ou au moins la notion de programmation orientée objet) avant de pouvoir développer pour Android.

Les variables

La seule chose qu'un programme sait faire, c'est des calculs. Il arrive qu'on puisse lui faire afficher des formes et des couleurs, mais pas toujours. Pour faire des calculs, on a besoin de variables. Ces variables permettent de conserver dans la mémoire de l'appareil des informations avec lesquelles on va pouvoir faire des opérations. Ainsi, on peut avoir une variableradisqui vaut 4 pour indiquer qu'on a quatre radis. Si on a une variablecarottequi vaut 2, on peut faire le calculradis + carottede manière à pouvoir déduire qu'on a six légumes.

En Java, il existe deux types de variable : les primitives et les objets.

Les primitives

Ces primitives permettent de retenir des informations simples telles que des nombres sans virgule (auquel cas la variable est un entier,int), des chiffres à virgule (des réels,float) ou des booléens (variable qui ne peut valoir que vrai (true) ou faux (false), avec lesboolean).

int legumes = 6; // int est pour les nombres entiers
// boolean peut valoir vrai ou faux
boolean plusDeSixLegumes = true; // true veut dire vrai
boolean moinsDeSixLegumes = false; // false veut dire faux
float prixLegume = 1.5; // float est pour les nombres à virgule
Les objets

A l'opposé des primitives (variables simples), les objets sont des variables compliquées.
En fait, une primitive ne peut contenir qu'une information, par exemple la valeur d'un nombre ; tandis qu'un objet est constitué d'une ou plusieurs autres variables, et par conséquent d'une ou plusieurs valeurs. Ainsi, un objet peut lui-même contenir un objet ! Un objet peut représenter absolument ce qu'on veut : une chaise, une voiture, un concept philosophique, une formule mathématique, etc. Par exemple, pour représenter une voiture, je créerais un objet qui contient une variablerouequi vaudrait 4, une variablevitessequi varierait en fonction de la vitesse et une variablecarrosseriepour la couleur de la carrosserie et qui pourra valoir « rouge », « bleu », ou « rose et verte à petits pois » pour les fans de Dorothée ! D'ailleurs, une variable qui représente une couleur ? Ça ne peut pas être une primitive, ce n'est pas une variable facile ça, une couleur ! Donc cette variable sera aussi un objet, ce qui nous ramène au fait qu'un objet peut contenir des primitives, mais aussi d'autres objets.

Mais dans le code, comment représenter un objet ? Pour cela, il va falloir déclarer ce qu'on appelle une classe. Cette classe aura un nom, pour notre voiture on peut simplement l'appelerVoiture, comme ceci :

// On déclare une classe Voiture avec cette syntaxe
class Voiture {
    // Et dedans on ajoute les attributs qu'on utilisera, par exemple le nombre de roues
    int roue = 4;
    // On ne connaît pas la vitesse, alors on ne la déclare pas
    float vitesse;
    // Et enfin la couleur, qui est représentée par une classe de nom Couleur
    Couleur carrosserie;
}

Les variables ainsi insérées au sein d'une classe sont appelées des attributs.

Il est possible de donner des instructions à cette voiture, comme d'accélérer ou de s'arrêter. Ces instructions s'appellent des méthodes. Au sein d'une méthode, pour faire appelle à un attribut de la classe, on peut utiliser le mot-cléthis afin de différentier l'attribut des variables locales. Le code d'une méthode doit être écrit dans une classe.

Par exemple, voici une méthode qui permet d'arrêter mon véhicule :

class Voiture {
    int roue = 4;
  
    float vitesse;
    
    Couleur carrosserie;
  
    //Je déclare une méthode qui s'appelle "arreter"
    void arreter() {
        int vitesse = 0;
        //Pour s'arrêter, je passe la vitesse à 0 
        this.vitesse = vitesse;
    }
}

En revanche, pour changer de vitesse, il faut que je dise si j'accélère ou décélère et de combien la vitesse change. Ces deux valeurs données avant l'exécution de la méthode s'appellent des paramètres. De plus, je veux que la méthode rende à la fin de son exécution la nouvelle vitesse. Cette valeur rendue à la fin de l'exécution d'une méthode s'appelle une valeur de retour. Par exemple :

// Je n'écrirai pas toujours tout le contenu de la classe, juste la méthode

// On dit ici que la méthode renvoie un float et qu'elle a besoin d'un float et d'un boolean pour s'exécuter
float changerVitesse(float facteurDeVitesse, boolean acceleration) {
    // S'il s'agit d'une accelération
    if (acceleration == true) {
        // On augmente la vitesse
        vitesse = vitesse + facteurDeVitesse;
    } else {
        // On diminue la vitesse
        vitesse = vitesse - facteurDeVitesse;
    }
    
    // La valeur de retour est la nouvelle vitesse
    return vitesse;
}

Parmi les différents types de méthode, il existe un type particulier qu'on appelle les constructeurs. Ces constructeurs sont des méthodes qui construisent l'objet désigné par la classe. Par exemple, le constructeur de la classeVoiturerenvoie un objet de typeVoiture:

// Ce constructeur prend en paramètre la couleur de la carrosserie
Voiture(Couleur carrosserie) {
    // Quand on construit une voiture, elle a une vitesse nulle
    vitesse = 0;
    this.carrosserie = carrosserie;
}

On peut ensuite construire une voiture avec cette syntaxe :

Voiture v = new Voiture(rouge);

Construire un objet s'appelle l'instanciation.

L'héritage

Il existe certains objets dont l'instanciation n'aurait aucun sens. Par exemple, un objet de typeVéhiculen'existe pas vraiment dans un jeu de course. En revanche il est possible d'avoir des véhicules de certains types, par exemple des voitures ou des motos. Si je veux une moto, il faut qu'elle ait deux roues et, si j'instancie une voiture, elle doit avoir 4 roues, mais dans les deux cas elles ont des roues. Dans les cas de ce genre, c'est-à-dire quand plusieurs classes ont des attributs en commun, on fait appel à l'héritage. Quand une classe A hérite d'une classe B, on dit que la classe A est la fille de la classe B et que la classe B est le parent (ou la superclasse) de la classe A.

// Dans le fichier vehicule.java
// Classe qui ne peut être instanciée
abstract class Vehicule {
    int nombre_de_roues;
    float vitesse;
}
// Dans le fichier voiture.java
// Une Voiture est un Vehicule
class Voiture extends Vehicule { }
// Dans un autre moto.java
// Une Moto est aussi un Vehicule
class Moto extends Vehicule { }

// Dans le même fichier, il s'agit seulement d'une petite classe
// Un Cabriolet est une Voiture (et par conséquent un Véhicule)
class Cabriolet extends Voiture { }
// Dans un autre fichier
// Un Cabriolet est une Voiture (et par conséquent un Véhicule)
class Cabriolet extends Voiture { }

Le mot-cléabstractsignifie qu'une classe ne peut être instanciée.

Pour contrôler les capacités des classes à utiliser les attributs et méthodes les unes des autres, on a accès à trois niveaux d'accessibilité :

  • public, pour qu'un attribut ou une méthode soit accessible à tous.

  • protected, pour que les éléments ne soient accessibles qu'aux classes filles.

  • Enfinprivate, pour que les éléments ne soient accessibles à personne si ce n'est la classe elle-même.

On trouve par exemple :

// Cette classe est accessible à tout le monde
public abstract class Vehicule {
  // Cet attribut est accessible à toutes les filles de la classe Vehicule
  protected roue;

  // Personne n'a accès à cette méthode.
  abstract private void decelerer();
}

Enfin, il existe un type de classe mère particulier : les interfaces. Une interface est impossible à instancier et toutes les classes filles de cette interface devront instancier les méthodes de cette interface — elles sont toutes forcémentabstract.

//Interface des objets qui peuvent voler
interface PeutVoler {
  void décoller();
}

class Avion extends Vehicule implements PeutVoler {
  //Implémenter toutes les méthodes de PeutVoler et les méthodes abstraites de Vehicule
}

La compilation et l'exécution

Votre programme est terminé et vous souhaitez le voir fonctionner, c'est tout à fait normal. Cependant, votre programme ne sera pas immédiatement compréhensible par l'ordinateur. En effet, pour qu'un programme fonctionne, il doit d'abord passer par une étape de compilation, qui consiste à traduire votre code Java en bytecode. Dans le cas d'Android, ce bytecode sera ensuite lu par un logiciel qui s'appelle la machine virtuelle Dalvik. Cette machine virtuelle interprète les instructions bytecode et va les traduire en un autre langage que le processeur pourra comprendre, afin de pouvoir exécuter votre programme.

Récapitulatif

  • Google n'est pas le seul à l'initiative du projet Android. C'est en 2007 que l'Open Handset Alliance (OHA) a été créé et elle comptait 35 entreprises à ses débuts.

  • La philosophie du système réside sur 6 points importants : il fallait qu'il soit open source, gratuit dans la mesure du possible, facile à développer, facile à vendre, flexible et ingénieux.

  • Il ne faut jamais perdre à l'esprit que vos smartphones sont (pour l'instant) moins puissants et possèdent moins de mémoire que vos ordinateurs !

  • Une bonne compréhension du langage Java est nécessaire pour suivre ce cours, et plus généralement pour développer sur Android.

Example of certificate of achievement
Example of certificate of achievement