États d'alimentation du SoC
Les états d'alimentation du système sur puce (SoC) sont : allumé, inactif et suspendu. « On » correspond au moment où le SoC est en cours d'exécution. « Idle » est un mode de puissance moyenne dans lequel le SoC est alimenté mais n'effectue aucune tâche. « Suspend » est un mode de faible consommation dans lequel le SoC n'est pas alimenté. La consommation électrique de l'appareil dans ce mode est généralement 100 fois inférieure à celle du mode « On ».
Capteurs sans réveil
Les capteurs sans réveil sont des capteurs qui n'empêchent pas le SoC de passer en mode suspension et ne réveillent pas le SoC pour rapporter des données. En particulier, les conducteurs ne sont pas autorisés à détenir des wake-locks. Il est de la responsabilité des applications de conserver un wakelock partiel si elles souhaitent recevoir des événements provenant de capteurs non-réveil lorsque l'écran est éteint. Pendant que le SoC est en mode suspension, les capteurs doivent continuer à fonctionner et générer des événements, qui sont placés dans une FIFO matérielle. (Voir Traitement par lots pour plus de détails.) Les événements du FIFO sont transmis aux applications lorsque le SoC se réveille. Si la FIFO est trop petite pour stocker tous les événements, les événements les plus anciens sont perdus ; les données les plus anciennes sont supprimées pour accueillir les données les plus récentes. Dans le cas extrême où le FIFO est inexistant, tous les événements générés pendant que le SoC est en mode suspension sont perdus. Une exception concerne le dernier événement de chaque capteur en cas de changement : le dernier événement doit être enregistré en dehors de la FIFO afin qu'il ne puisse pas être perdu.
Dès que le SoC sort du mode suspension, tous les événements du FIFO sont signalés et les opérations reprennent normalement.
Les applications utilisant des capteurs sans réveil doivent soit maintenir un wakelock pour garantir que le système ne se suspend pas, se désinscrire des capteurs lorsqu'elles n'en ont pas besoin, soit s'attendre à perdre des événements lorsque le SoC est en mode suspension.
Capteurs de réveil
Contrairement aux capteurs sans réveil, les capteurs de réveil garantissent que leurs données sont délivrées indépendamment de l'état du SoC. Lorsque le SoC est réveillé, les capteurs de réveil se comportent comme des capteurs de non-réveil. Lorsque le SoC est endormi, les capteurs de réveil doivent réveiller le SoC pour délivrer des événements. Ils doivent toujours laisser le SoC passer en mode suspension, mais doivent également le réveiller lorsqu'un événement doit être signalé. Autrement dit, le capteur doit réveiller le SoC et transmettre les événements avant que la latence maximale de rapport ne soit écoulée ou que la FIFO matérielle ne soit pleine. Voir Traitement par lots pour plus de détails.
Pour garantir que les applications ont le temps de recevoir l'événement avant que le SoC ne se rendorme, le pilote doit maintenir un « timeout wake lock » pendant 200 millisecondes à chaque fois qu'un événement est signalé. Autrement dit, le SoC ne devrait pas être autorisé à se rendormir dans les 200 millisecondes suivant une interruption de réveil. Cette exigence disparaîtra dans une future version d'Android, et nous avons besoin de ce timeout wakelock d'ici là.
Comment définir les capteurs de réveil et de non-réveil ?
Jusqu'à KitKat, le fait qu'un capteur soit un capteur de réveil ou un capteur de non-réveil était dicté par le type de capteur : la plupart étaient des capteurs de non-réveil, à l'exception du capteur de proximité et du détecteur de mouvement significatif .
À partir de L, le fait qu'un capteur donné soit un capteur de réveil ou non est spécifié par un indicateur dans la définition du capteur. La plupart des capteurs peuvent être définis par des paires de variantes de réveil et de non-réveil d'un même capteur, auquel cas ils doivent se comporter comme deux capteurs indépendants, n'interagissant pas entre eux. Voir Interaction pour plus de détails.
Sauf indication contraire dans la définition du type de capteur, il est recommandé d'implémenter un capteur de réveil et un capteur de non-réveil pour chaque type de capteur répertorié dans Types de capteurs . Dans chaque définition de type de capteur, voyez quel capteur (réveil ou non-réveil) sera renvoyé par SensorManager.getDefaultSensor(sensorType)
. C'est le capteur que la plupart des applications utiliseront.