Android
Fonctionnement
Démarrage
Comme tout système Linux, au démarrage le bootLoader charge le kernel et lance le processus init. Le père de tous les processus.
Ensuite un certain nombre de daemons sont lancés :
- USB daemon (usbd)
- Android Debug Bridge (adbd)
- Debugger Daemon (debuggerd); Il permet de gérer les requêtes de debug de processus (dump memory, etc.)
- Radio Interface Layer Daemon (rild)
Puis le processus init lance le processus zygote. Le processus zygote est le service le plus important. Le processus zygote :
- initialise une instance de Dalvik VM
- Pré charge les classes et écoute sur une socket pour créer des Dalvik VM
- Fork sur demande pour créer des instances de Dalvik VM pour chaque application
- Les VM créées partagent des zones mémoire communes ce qui permet de minimiser la mémoire utilisées
- Chaque VM créer par zygote est un fork d'une VM "mère", ce qui permet d'accélérer le démarrage d'une application.
Ensuite le processus init lance le processus runtime qui va à son tour
lancer le Service Manager ( "DNS" permettant d'enregistrer et de
récupérer des références vers des services) et enregistre ce Service
Manager comme le Context Manager par défaut.
Une fois tous cela de fait, le
processus runtime, envoie une requête au processus zygote lui demandant
de lancer le System Service. Zygote va forker une nouvelle instance de
Dalvik VM pour le processus System Service et démarrer le service.
Le System service va lancer à son tour l'Audio Flinger et le surface
Flinger qui vont ensuite s'enregistrer au près du Service Manager
Le System Manager lance ensuite les services d'Android. Ces services une
fois lancés vont s'enregistrer au près du Service Manager (en bleu), qui
fait office de proxy avec le Service Manager (en vert) faisant partie
des librairies C/C++.
Une fois tous les services chargés, le système est prêt. Des applications utilisateur peuvent être lancées.
Intéraction
L'application utilisateur récupère Location Manager Service en utilisant le Context Manager. Ensuite le Location Manager interroge le GpsLocationProvider qui lui même interroge en utilisant JNI (Java Native Interface) la librairie C/C++ GpsLocationProvider qui va charger la librairie dynamique libgps.so.