Percez le mystère du démarrage du système Android

Lorsque quelqu'un nous pose des questions sur le processus de démarrage d'une application sous Android, nous mentionnons toujours zygote. Mais d’où vient le zygote ? À partir de cette question, j'ai pensé au processus de démarrage du système Android, et le zygote doit être un processus créé lors de l'initialisation du système. Avec cette question à l'esprit, j'ai recherché des informations et des codes sur le processus de démarrage du système Android. Ce qui suit est un schéma simplifié du processus de démarrage. Ensuite, nous analyserons ce que fait chaque étape.

1. Appuyez sur le bouton d'alimentation du téléphone

Lorsque nous appuyons sur le bouton d'alimentation du téléphone Android, le "code de démarrage ROM (mémoire en lecture seule) " (code de démarrage du chargeur de démarrage) sera lu à partir d'un emplacement codé en dur et commencera à s'exécuter. L'objectif principal de l'exécution de ce programme est de charger le code du chargeur de démarrage (chargement de démarrage) en mémoire et de l'exécuter.

2.Bootloader (commencer le chargement)

Le chargeur de démarrage s'exécute avant l'initialisation du système Android et ne fait pas partie du système d'exploitation Android. Habituellement, les fabricants effectuent certaines fonctions liées au cryptage et à la sécurité dans le chargeur de démarrage.

Le programme du chargeur de démarrage est exécuté en deux phases. Dans un premier temps, il détecte la RAM externe et charge le programme auxiliaire dans un deuxième temps. Dans la deuxième étape, le chargeur de démarrage définit le réseau, la mémoire, etc., et définit les paramètres de fonctionnement du noyau, etc., qui doivent préparer le fonctionnement du noyau.

Vous pouvez retrouver cette partie de code dans aosp (Android version 2.xx, il y a des changements plus tard),

aosp/bootable/bootloader/legacy/usbloader (vous devez passer par-dessus le mur pour voir le code source)

Il contient deux fichiers importants,

  1. Init.s est responsable de l'initialisation de la pile, de l'effacement du BSS (Block Started by Symbol segment) et enfin de l'appel de la méthode _main() dans main.c.
  2. main.c, responsable de l'initialisation du matériel (horloge, carte mère, clavier, console) et de la création des étiquettes Linux.

3. Le démarrage du noyau Android (noyau) est similaire à celui de Linux, comme la configuration du cache, la mémoire protégée, la planification et le chargement des pilotes. Lorsque le noyau a fini de configurer le système, il recherche dans le dossier système les services qui doivent être initialisés.

Quelles sont les différences entre le démarrage Android et Linux ?

  • Binder : Il s'agit d'un mécanisme de communication inter-processus spécifique à Android et d'un système d'appel de méthode à distance.
  • ashmem (Android Shared Memory) : il s'agit d'un nouvel allocateur de mémoire partagée similaire à POSIX SHM mais avec un comportement différent et prend en charge une API basée sur des fichiers plus simple.
  • pmem (allocateur de mémoire de processus) : il est utilisé pour gérer de grandes régions de mémoire physiquement contiguës (1 à 16 + Mo) partagées entre l'espace utilisateur et les pilotes du noyau.
  • logger : il s'agit du support du noyau pour la commande logcat.
  • wakelocks : pour les fichiers de gestion de l'alimentation. Il maintient la machine éveillée événement par événement jusqu'à ce que le verrou de réveil soit libéré.
  • Gestion oom : il tue les processus lorsque la mémoire disponible devient trop faible.
  • gestionnaire d'alarmes : avertit le noyau de se réveiller du mode utilisateur.
  • RAM_CONSOLE : autorise l'enregistrement des messages printk du noyau dans un tampon de la RAM afin qu'ils puissent être visualisés lors du prochain appel du noyau après une panique du noyau.
  • Pilote de gadget USB pour ADB
  • Système de fichiers flash yaffs2 ( l'auteur ne sait pas ce que c'est )

4. Processus d'initialisation

Init est le premier processus du système et c'est le processus parent de tous les processus. Il a deux missions principales,

  1. Répertoire de montage, tel que /sys , /dev ou /proc.
  2. Exécutez le script init.rc

Les règles spécifiques à la langue dans init.rc peuvent être trouvées ici, community.nxp.com/t5/i-MX-Pro…

Au cours de ce processus, vous pouvez voir l'écran de démarrage d'Android.

5. Zygote et Dalvik (enfin arrivés jusqu'ici)

En Java, chaque programme s'exécute dans une instance de machine virtuelle distincte isolée en mémoire, et chaque instance de machine virtuelle consomme une partie de la mémoire. Nous savons qu'Android est généralement un appareil portable avec une mémoire limitée. Si la même stratégie est adoptée, la machine virtuelle Les instances consomment beaucoup de mémoire.

Afin de surmonter le problème de mémoire, le zygote est apparu dans Android. zygote réalise le partage de code entre les machines virtuelles Dalvik, réduisant ainsi l'utilisation de la mémoire et le temps de démarrage. zygote est un processus de machine virtuelle qui démarre au démarrage du système. zygote précharge et initialise les classes de bibliothèque principales.

Le processus de chargement du zygote est le suivant,

  1. Chargez la classe d'initialisation zygote, aosp/frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
  2. registerZygoteSocket(), enregistre un service socket pour le canal de commande zygote.
  3. preloadClasses(), initialise le processus zygote, charge et initialise les classes communes.
  4. preloadResources(), charge les ressources qui peuvent être partagées entre les processus.

Pendant ce processus, vous pouvez voir l'animation de démarrage.

6. Service système

Après avoir terminé le travail ci-dessus, zygote lancera un nouveau processus pour démarrer le service système.

Les services de base sont les suivants :

  • Démarrage du gestionnaire d'alimentation
  • Création du gestionnaire d'activités
  • Démarrage du registre de téléphonie
  • Démarrage du gestionnaire de paquets
  • Définir le service de gestion d'activités en tant que processus système
  • Démarrage du gestionnaire de contexte
  • Fournisseurs de contacts du système de démarrage
  • Démarrage du service de batterie
  • Démarrer le gestionnaire d'alarmes
  • Démarrage du service de capteur
  • Démarrer le gestionnaire de fenêtres
  • Démarrage du service Bluetooth
  • Démarrage du service de montage

Les autres services sont les suivants :

  • Démarrage du service de barre d'état
  • Démarrage du service matériel
  • Démarrage du service NetStat
  • Démarrage du service de connectivité
  • Démarrage du gestionnaire de notifications
  • Démarrage du service DeviceStorageMonitor
  • Démarrage du gestionnaire d'emplacement
  • Démarrage du service de recherche
  • Démarrage du service Presse-papiers
  • Démarrage du service d'enregistrement
  • Démarrage du service Fond d'écran
  • Démarrage du service audio
  • Démarrage de HeadphoneObserver
  • Démarrage d'AdbSettingsObserver

Nous avons enfin terminé le processus de démarrage (les services système sont opérationnels en mémoire).

Si vous ne maîtrisez pas encore le Framework et souhaitez en avoir une compréhension approfondie dans les plus brefs délais, vous pouvez vous référer aux "Points de connaissances de base du Framework Android" , qui comprennent : Init, Zygote, SystemServer, Binder, Handler, AMS. , PMS, Launcher... ... et autres enregistrements de points de connaissance.

"Manuel de synthèse des points de connaissances de base du cadre" :https://qr18.cn/AQpN4J

Une partie du principe de mise en œuvre du mécanisme Handler :
1. Analyse macro-théorique et analyse du code source du message
2. Analyse du code source MessageQueue
3. Analyse du code source du Looper
4. Analyse du code source du gestionnaire
5. Résumé

Principe de Binder :
1. Points de connaissance qui doivent être compris avant d'apprendre Binder
2. Mécanisme de Binder dans ServiceManager
3. Processus d'enregistrement du service système
4. Processus de démarrage de ServiceManager
5. Processus d'acquisition du service système
6. Initialisation de Java Binder
7. Java Le processus d'enregistrement du système services dans classeur

Zygote :

  1. Le processus de démarrage du système Android et le processus de démarrage de Zygote
  2. Le processus de démarrage du processus de candidature

Analyse du code source AMS :

  1. Gestion du cycle de vie des activités
  2. Processus d'exécution onActivityResult
  3. Explication détaillée de la gestion de la pile d'activités dans AMS

Code source PMS détaillé :

1. Processus de démarrage et d'exécution du PMS
2. Analyse du code source d'installation et de désinstallation de l'APK
3. Structure de correspondance du filtre d'intention dans le PMS

WMS :
1. La naissance de WMS
2. Les membres importants de WMS et le processus d'ajout de Window
3. Le processus de suppression de Window

"Manuel d'étude du framework Android":https://qr18.cn/AQpN4J

  1. Processus d'initialisation du démarrage
  2. Démarrez le processus Zygote au démarrage
  3. Démarrez le processus SystemServer au démarrage
  4. Pilote de reliure
  5. Processus de démarrage d'AMS
  6. Le processus de démarrage du PMS
  7. Processus de démarrage du lanceur
  8. Les quatre composants majeurs d'Android
  9. Service système Android - processus de distribution de l'événement d'entrée
  10. Analyse du code source du mécanisme de rafraîchissement de l'écran de rendu sous-jacent à Android
  11. Analyse du code source Android en pratique

Je suppose que tu aimes

Origine blog.csdn.net/weixin_61845324/article/details/132460904
conseillé
Classement