Pour offrir une expérience fluide, stable et économe en batterie, vous devez identifier et résoudre les goulots d'étranglement courants en termes de performances (stabilité, rendu de l'UI, consommation de mémoire, travail en arrière-plan, latence au démarrage et optimisation de la compilation).
Les guides de cette section expliquent le comportement sous-jacent de la plate-forme Android pour chaque type de problème. Ils vous expliquent également comment les diagnostiquer, les profiler et les résoudre à l'aide d'outils tels que le profileur Android Studio, Perfetto, Logcat et ApplicationExitInfo.
Stabilité
- ANR : diagnostiquez et corrigez les erreurs ANR (Application Not Responding) causées par des threads UI bloqués, des E/S du thread principal, des conflits de verrouillage ou des broadcast receivers lents.
- Plantages : lisez les traces de pile, inspectez la sortie Logcat et évitez les exceptions non gérées et les signaux natifs.
Rendu et démarrage
- Affichage lent : identifiez et corrigez les frames d'UI abandonnées ou figées (
>16mset>700ms) causées par des mises en page coûteuses, des passes de liaison ou des blocages du thread principal. - Sessions lentes (jeux uniquement) : mesurez le rythme des frames par seconde avec
SurfaceFlingeret optimisez la fréquence d'images des jeux à l'aide d'Android Frame Pacing (Swappy), de Vulkan et de l'Android Dynamic Performance Framework (ADPF). - Temps de démarrage de l'application : comprenez les mécanismes internes des démarrages à froid, tiède et à chaud, mesurez le délai d'affichage initial (TTID) et le délai d'affichage complet (TTFD), et optimisez le travail de démarrage.
Gestion de la mémoire
- Tueur de mémoire faible (LMK) : comprenez comment le daemon du tueur de mémoire faible Android (
lmkd) hiérarchise les processus viaoom_adj_scoreet profile l'espace mémoire utilisé dans Android Studio, Unity et Unreal Engine. - Utilisation de la mémoire (RSS anonyme + espace d'échange) : mesurez et réduisez l'espace mémoire utilisé de la taille de l'ensemble résident (RSS) anonyme et de l'espace d'échange de votre application dans les états de premier plan, de service et d'arrière-plan.
- Utilisation de la mémoire bitmap : diagnostiquez les allocations de bitmap surdimensionnées ou avec fuites, et libérez les tampons graphiques lorsque les composants d'UI passent en arrière-plan.
Batterie et travail en arrière-plan
- Wakelocks excessifs : évitez de conserver des wakelocks partiels pendant de longues périodes et migrez les tâches en arrière-plan vers
WorkManagerouJobScheduler. - Wakelocks partiels figés : assurez-vous que chaque wakelock partiel acquis est correctement libéré sur tous les chemins d'exécution et d'erreur.
- Réveils excessifs : réduisez les alarmes exactes et regroupez ou reportez les tâches planifiées en arrière-plan.
- Nombre excessif de recherches Wi-Fi en arrière-plan : réduisez la fréquence des recherches Wi-Fi en arrière-plan et utilisez des API de connectivité et de localisation passives ou par lot.
- Utilisation excessive du réseau en arrière-plan : mettez en lot et différer les transferts de réseau mobile en arrière-plan à l'aide des contraintes
WorkManager. - Utilisation excessive de la batterie : diagnostiquez une décharge rapide de la batterie sur les appareils mobiles et Wear OS en profilant l'activité du processeur, des capteurs et de la radio.
Autorisations et optimisation des builds
- Refus d'autorisation : demandez les autorisations d'exécution en contexte et expliquez clairement aux utilisateurs pourquoi vous avez besoin de ces autorisations.
- Optimisation du code DEX : configurez les règles de minification, d'obscurcissement et d'optimisation de R8 pour réduire la taille du DEX et améliorer les performances d'exécution.