38
1 Android pour l’industrie Android pour l’industrie Pierre Ficheux ([email protected]) Octobre 2013

Android pour l'industrie

Embed Size (px)

DESCRIPTION

Après avoir conquis le marché des smartphones et tablettes, Android devient incontournable dans le domaine industriel. Son utilisation pour la conception de solutions embarquées industrielles soulève toutefois des problématiques techniques spécifiques : customisation de l'OS, développement de pilotes de périphériques, capacité à répondre à des contraintes temps réel. S'appuyant sur son expertise des technologies Linux embarqué, Open Wide Ingénierie a accompagné avec succès la réalisation de nombreux systèmes sur mesure. Les experts du pôle Mobilité et Multimédia partage leur expérience à travers cette présentation en abordant les sujets techniques indispensables avant de migrer vers Android.

Citation preview

Page 1: Android pour l'industrie

1Android pour l’industrie

Android pour l’industrie

Pierre Ficheux ([email protected])

Octobre 2013

Page 2: Android pour l'industrie

2Android pour l’industrie

Ecosystème

● Environ 1,5 M d'activations par jour, plus d’un milliard de téléphones depuis l’été 2013 !

● 1M d'applications sur Google Play (Android market)● 75 % du marché des smartphones (17% pour iOS)● Répartition des versions :

Page 3: Android pour l'industrie

3Android pour l’industrie

Android et l'industrie ?

● Android est conçu pour la téléphonie + tablettes● Les projets industriels abandonnent les RTOS

propriétaires pour Linux (embarqué)● Le développement sous Linux (embarqué) est

complexe – Souvent C/C++ (Qt)

– Outils hétérogènes

● Android nécessite (souvent) une adaptation pour l’utilisation industrielle

● Typologie des projets– Avec ou sans temps réel « dur »

– Avec ou sans interfaces graphique (headless)

● Android n’est pas une solution universelle !

Page 4: Android pour l'industrie

4Android pour l’industrie

Android, open source project ?● Le monde de la téléphonie est peu enclin à utiliser du

logiciel libre● Les sources d'Android sont disponibles via AOSP →

adaptation possible ou BSP constructeur :)● En pratique, Android ne suit pas les règles de

fonctionnement des projets libres– Développements réalisés « behind de doors »

– Nombreux projets « non officiels », comme Android-x86

– Nombreux développements spécifiques (et propriétaires) réalisés par/pour les constructeurs

– Si possible, Google évite les composants sous GPL → ré-écriture + licence Apache 2

● Départ à l’été 2013 du leader du projet (JBQ) !!

Page 5: Android pour l'industrie

5Android pour l’industrie

Licences

● Android est constitué de nombreux composants– Noyau Linux (GPL)

– Composants Google (Apache 2)

– Composants externes (user space) souvent GPL

– Propriétaires (pilotes binaires)

● Les applications de Google Play (Android Market) sont pour la plupart propriétaires (idem AppStore) → non disponibles dans les sources d’Android

Page 6: Android pour l'industrie

6Android pour l’industrie

La licence GPL en bref

● La GPL a pour origine le projet GNU de la Free Software Foundation (Richard M. Stallman)

● GPL = General Public License ● Intègre la notion de « copyleft » (vs « copyright »)● La GPL v2 (1991) est la plus répandue (exemple :

noyau Linux)● Principes :

1. La licence s'applique uniquement en cas de redistribution

2. Un code source utilisant du code GPL est du travail dérivé et doit être publié (i.e. celui qui reçoit la version binaire peut obtenir le code source)

3. Pas de lien (ld) possible entre du code GPL et du code « propriétaire » !

Page 7: Android pour l'industrie

7Android pour l’industrie

Licence Apache 2

● Fournie par ASF en 2004● Proche des licences BSD et MIT● Principale différence avec la GPL/LGPL : pas de

« copyleft » (dérivation) → pas de publication du code● Pour plus d'information voir :

– http://source.android.com/source/licenses.html

– http://www.apache.org/licenses/LICENSE-2.0.html

Page 8: Android pour l'industrie

8Android pour l’industrie

Architecture générale (Google)

Page 9: Android pour l'industrie

9Android pour l’industrie

Le noyau Linux (rouge)

● Assure l'interface matérielle● Différent du noyau standard nommé « mainline » et

disponible sur http://www.kernel.org– Nouveau système d'IPC (Inter Process Comm.)

– Gestion d'énergie améliorée

– Système trace (logs)

● Initialement (et toujours) un « fork » du noyau● Pilotes retirées du noyau officiel en 2009● De retour sur drivers/staging/android depuis le

3.3● Convergence (partielle) avec le mainline en cours● Google est contributeur par nécessité, choix

pragmatique● Noyau binaire fourni par défaut dans AOSP

Page 10: Android pour l'industrie

10Android pour l’industrie

Bibliothèques + HAL (vert)● Bibliothèques spécifiquesGoogle ou externes● Spécifiques :

– Bionic, libC « allégée » sous licence BSD, partiellement POSIX → difficulté de portage de code « legacy »

– Surface Manager, Audio Manager, ...

● Externes (sources fournies par Google dans AOSP) :– Webkit

– OpenSSL

– …

● Hardware abstraction layer → accès aux pilotes noyau– Graphique, audio, Wi-Fi, ...

– Pas d'accès direct au noyau (différent de GNU/Linux)

Page 11: Android pour l'industrie

11Android pour l’industrie

HAL

● Pour chaque « service » on a– Un System service (Java)

– Une définition dans la HAL (interface matérielle) + pilote noyau

● Le constructeur doit fournir une bibliothèque (.so) externe à AOSP (sous licence propriétaire) → à ajouter au répertoire /device

● Le pilote noyau – également fourni par le constructeur - reste sous GPL

● Voir un exemple sur http://www.opersys.com/blog/extending-android-hal

Page 12: Android pour l'industrie

12Android pour l’industrie

Architecture HAL

/frameworks/base/services/java/

/frameworks/base/services/jni/

/hardware/libhardware/

/device/[MANUF.]/[DEVICE]

/sdk/emulator/

Noyau ou module

/frameworks/base/core/

AOSP-providedASL

Manuf.-providedManuf. license

Manuf.-providedGPL-license

Schéma K. Yaghmour

Répertoires AOSP

Page 13: Android pour l'industrie

13Android pour l’industrie

Android runtime (jaune)

● Dalvik, LA JVM de Google– Grosse valeur ajoutée au niveau performances

– Syntaxe Java

– Optimisée pour l'embarqué

– Non compatible avec JDK Oracle, utilise des fichier .dex

– .dex produit à partir du .class par dex → encombrement divisé par 2

● Les « core libraries » venant du projet Apache Harmony remplacent les « JDK libs » pour le runtime

● Contient également des scripts et binaires nécessaires au démarrage (ramdisk initial) dont Zygote qui démarre Dalvik

Page 14: Android pour l'industrie

14Android pour l’industrie

Android framework (bleu)

● Correspond à l'API fournie aux développeurs pour écrire les applications

● Majoritairement écrit en Java● Utilisation de JNI pour l'accès aux couches basses

(C/C++) depuis une application● La communication utilise Binder, une couche IPC

écrite par Google en remplacement des IPC UNIX/POSIX

Page 15: Android pour l'industrie

15Android pour l’industrie

Architecture générale (K. Yaghmour)

Schéma K. Yaghmour

Page 16: Android pour l'industrie

16Android pour l’industrie

AOSP, introduction● AOSP = Android Open Source Project● Accessible sur http://source.android.com● Sources pour les plate formes de référence

– Émulateur goldfish

– Nexus 4, 7, 10

– Pandaboard (carte ARM)

– Certains Galaxy Nexus

→ http://source.android.com/source/building-devices.html ● Bonne documentation● AOSP utilise aussi des composants propriétaires

(exemple : pilotes graphiques)https://developers.google.com/android/nexus/drivers

● Les sources représentent plusieurs centaines de dépôts Git (1 par projet) et plus de 16 Go !

Page 17: Android pour l'industrie

17Android pour l’industrie

AOSP, pré-requis

● Nombreux pré-requis pour la compilation AOSP (rien à voir avec Linux embarqué)

● Machine (puissante) 64 bits sous Linux ou Mac OS X (pas de Windows !)

● 4 Go de RAM, 100 Go de disque● SMP conseillé● Distribution Ubuntu 10.04 LTS ou éventuellement 12.04● Quelques paquets à installer● Utilisation de VM déconseillée (mais fonctionne)● Java 6 → JDK 6.1● Largement basé sur GNU Make● La procédure d'initialisation est décrite sur :

http://source.android.com/source/initializing.html

Page 18: Android pour l'industrie

18Android pour l’industrie

AOSP « in a nutshell »

● Google fournit l'outil repo (un script Python) afin de gérer les nombreux dépôts Git

● Cet outil utilise un fichier manifest pour indexer les dépôts$ mkdir work && cd work

$ repo init -u https://android.googlesource.com/platform/manifest [-b <branch>]

$ repo sync [-j N]

● Sélection de la cible, compilation et test$ source build/envsetup.sh

$ lunch aosp_arm-eng

$ make -j N

$ emulator [-show-kernel -shell] &

synchronisation avec le dépôt, N jobs

chargement des variables

cible émulateur (goldfish) + mise au point (eng)

sélection de la branche, exemple android-4.3_r2

Page 19: Android pour l'industrie

19Android pour l’industrie

Les cibles AOSP● Différentes cibles dans le menu lunch (4.3)

Lunch menu... pick a combo:

1. aosp_arm-eng

2. aosp_x86-eng

3. aosp_mips-eng

4. vbox_x86-eng

5. aosp_deb-userdebug

6. aosp_flo-userdebug

7. ...

12. full_mako-userdebug

13. full_maguro-userdebug

14. full_manta-userdebug

15. full_arndale-userdebug

16. full_toroplus-userdebug

17. full_toro-userdebug

18. full_panda-userdebug

● Différents type de build– user (production)

– userdebug (production + accès root + debug)

– eng (développement)

Nexus 4

Goldfish

Pandaboard

x86

Page 20: Android pour l'industrie

20Android pour l’industrie

Écran de l'émulateur

● Déverrouiller l'écran en « tirant » le cadenas vers l'extérieur

Page 21: Android pour l'industrie

21Android pour l’industrie

Remarques sur AOSP

● Les sources occupent environ 16 Go (pour JB) car Google fournit l'intégralité, y compris les composants externes

● Grosse différence avec GNU/Linux (Buildroot, OE, …) qui obtiennent les paquets à partir des dépôts et appliquent des « patch »

● Le système de construction est rudimentaire, rien à voir avec GNU/Linux !

● Après compilation, le répertoire occupe 40 Go● Les binaires sont produits sur le répertoire out et

indexés sur le nom de la cible$ ls -1 out/target/product

generic

panda

cible émulateur (goldfish)

Page 22: Android pour l'industrie

22Android pour l’industrie

Noyau Linux/Android

● Le noyau Linux n'est pas conçu au départ pour la téléphonie

– Gestion d'énergie :-(

– Mise en veille

– IPC System V → « old style »

– Gestion de mémoire / processus (context switch)

● Modifications par Google– Wakelocks

– Binder

– Klogger

– Ashmem

– Alarm timers

– Low memory killer

Page 23: Android pour l'industrie

23Android pour l’industrie

Noyau Linux/Android, suite.

● Les pilotes Android sont dans drivers/staging → pas intégrés au mainline

● Retirés en décembre 2009, ré-intégrés dans la version 3.3

● Effort de convergence sur les versions récentes● Bonne compatibilité de l’API noyau Linux (modules)● Rappel : un module noyau ne suffit pas à piloter un

périphérique sous Android (HAL)

Page 24: Android pour l'industrie

24Android pour l’industrie

SDK

● La plupart des développements Android se font en Java

– Langage « simple », très répandu

– Très bonne performances de Dalvik

● Google fournit un SDK basé sur Eclipse → ADT (Android Developer Tools)

– Simple à utiliser pour les développeurs Java/Win$ (mais pas forcément pour les autres)

– Approche « Visual Machin » → New Project, Next, Next, … , Finish

● Test de l'application directement sur émulateur● Création d'un fichier .apk installable sur n'importe

quelle cible Android

Page 25: Android pour l'industrie

25Android pour l’industrie

Diagramme de création

Page 26: Android pour l'industrie

26Android pour l’industrie

NDK

● Les développements C/C++ sont fait avec le NDK (pour Native Development Kit)

– Portage de code existant, proche de POSIX

– Possibilité de développer uniquement avec NDK (mais pas conseillé par Google)

– Plus souvent, interfaçage avec SDK par JNI (Java Native Interface)

● Android utilise des fichiers Makefile dédiés et assez basiques → Android.mk

● Pas de support officiel Autotools/CMake● Le NDK contient principalement les chaînes croisées

dans toolchains et les bibliothèques (Bionic, …) dans platforms

Page 27: Android pour l'industrie

27Android pour l’industrie

NDK et POSIX

● La plupart des RTOS ont une API POSIX (VxWorks, RTEMS, QNX, ...)

● Android n'est pas totalement un système POSIX car la libC (Bionic) est simplifiée par rapport à GNU-libC

● Souvent nécessaire d'importer du code (POSIX) existant (propriétaire ou libre) dans Android

– Porter le code en Java ?

– Utiliser NDK (plus simple en général)

● Le cas le plus fréquent est l'utilisation d'une bibliothèque C/C++ depuis une application Java (ex : accès pilote noyau JNI)

● Exemples fournis dans le NDK

Page 28: Android pour l'industrie

28Android pour l’industrie

Bionic

● La libC Bionic est volontairement beaucoup plus légère que la Glibc

The core idea behind Bionic's design is: KEEP IT REALLY SIMPLE.

● Pas de support IPC System V (Android utilise Binder) !● Quelques limites dans le support PThread● Pas de support des exceptions C++● Pas de compatibilité binaire avec la Glibc● Support ARM et x86 uniquement● Nécessite l'utilisation du compilateur Android (NDK)● Voir android-ndk-rX/docs/system/libc

Page 29: Android pour l'industrie

29Android pour l’industrie

Utilisation d’une chaîne externe ?

● Le NDK a des limitations au niveau POSIX● Le noyau Android est un noyau Linux donc les appels

systèmes standards sont disponibles● Une solution est d'utiliser une chaîne croisée

« standard » (exemples : CodeSourcery, ELDK, …) → installer les bibliothèques sur la cible (en plus de Bionic)

● Problème : intégration dans SDK

Page 30: Android pour l'industrie

30Android pour l’industrie

Android et le temps réel

● Android n’est pas conçu au départ pour les applications TR

● L’API POSIX est cependant disponible dans le noyau Linux

● L’application de « patch » TR n’est pas triviale car ces patchs sont prévus pour un noyau « mainline »

● Tests réalisés sur des tâches périodiques avec PREEMPT-RT et Xenomai sous Android-x86 → résultats identiques à ceux de GNU/Linux

● Test directement en mode « console »● Voir la démonstration :)

Page 31: Android pour l'industrie

31Android pour l’industrie

PREEMPT-RT

● Branche expérimentale pour la version 2.6 et 3.x, voir https://rt.wiki.kernel.org

● Initié par Ingo Molnar, contributeur majeur du noyau● Aucun lien avec « preempt-kernel » !● Surtout utilisé sur x86 et des processeurs performants

(nécessite TSC = Time Stamp Counter)● Fonctionne également sur ARM (9 ou plus), Nios II,

Microblaze, ...● Nécessite un noyau « mainline » (ou proche) mais ne

sera probablement jamais intégré à la branche officielle● Mise en place très simple (application d'un patch)● Mêmes API de programmation que Linux standard

Page 32: Android pour l'industrie

32Android pour l’industrie

PREEMPT-RT, suite

● Threaded interrupt model → utilisation d'un thread noyau (donc interruptible) pour le traitement de chaque interruption 4 2 root SW< 0 0% 0% [sirq-high/0]

5 2 root SW< 0 0% 0% [sirq-timer/0]

...

6 2 root SW< 0 0% 0% [sirq-net-tx/0]

● Prévention des inversions de priorité (par héritage)● Timers noyau haute précision (API hrtimer)● Réécriture complète des mécanismes de

synchronisation (spinlock → mutex)● Le résultat est un noyau (presque) « préemptif », mais

reste un noyau Linux● Sections critiques avec des tâches non TR

Page 33: Android pour l'industrie

33Android pour l’industrie

Linux avec co-noyau

● Utilisation d’un noyau temps dans l’espace mémoire du noyau Linux

● Séparation entre le composant temps-réel et Linux– Ordonnanceur temps-réel spécifique

– Pas de dépendance sur les sections critiques Linux

● Virtualisation de la gestion d'interruptions Linux– Routage prioritaire des IRQs vers le co-noyau

● Linux comme tâche idle du co-noyau● Se rapproche de la technique de « para-virtualisation »

des hyperviseurs (adaptation de l'OS)● Extensions RTLinux, RTAI, Xenomai

Page 34: Android pour l'industrie

34Android pour l’industrie

Xenomai, architecture

● Xenomai utilise un micro-noyau (ADEOS) pour partager le matériel avec le noyau Linux

micro-noyau

noyau TR

API TR

pilote TR

noyau Linux

Page 35: Android pour l'industrie

35Android pour l’industrie

Domaines Xenomai

Hardware

VFS/FS ...

Pile réseau Xenomai RTOS

Adeos I-Pipe

Noyau

Code applicatif VxWorks

glibcXenomailibvxworks

Code applicatif POSIX

Xenomailibpthread

Appels système

glibc

Page 36: Android pour l'industrie

36Android pour l’industrie

Android industriel, avantages/inconvénients

● Avantages– Programmation Java (simple et répandue)

– IHM évoluée

– Communauté importante

– Fait rêver les managers et les comptables (tablette = grand public = bon marché)

● Inconvénients– Incompatibilité POSIX

– Système de « build » AOSP rudimentaire par rapport à GNU/Linux

– Pas réellement un projet libre ni communautaire

– Noyau Linux non standard (même si la situation évolue)

– Interfaces matérielles spéciales mal supportées !!

Page 37: Android pour l'industrie

37Android pour l’industrie

Conclusions

● Utiliser Android quand :– Le projet nécessite une IHM

– Le projet ne nécessite pas de TR dur (pour l’instant)

– L’utilisation de Java est un avantage

● Attention à la dépendance / Google → quelle part d’AOSP disponible et jusqu’à quand ?

● Android ne peut remplacer GNU/Linux embarqué– Développement communautaire

– Support matériel

– Système de construction bien plus avancé (Yocto)

Page 38: Android pour l'industrie

38Android pour l’industrie

Questions ?