Vous pouvez enregistrer plusieurs types de profils de performances dans Android. La collecte d'un profil vous aide à déboguer les problèmes liés à la vitesse d'exécution de votre application, à la quantité de mémoire qu'elle utilise, à la quantité d'énergie qu'elle consomme, etc.
Ce document décrit les types de profils les plus utiles et explique quand les utiliser pour déboguer les problèmes de performances courants.
Traces du système

Une trace système est un profil puissant qui contient des informations sur les processus, les threads, les informations de minutage, l'exécution du processeur et des tâches, ainsi que les événements système ou définis par l'utilisateur.
Du point de vue d'une application, la nature des informations contenues dans les traces peut couvrir un large éventail de domaines, y compris la latence, les saccades, la mémoire, la batterie, etc.
Les traces système contiennent les événements pilotés par le code suivants, qui peuvent être définis par le système ou par l'utilisateur. Les événements déclenchés par le code sont des événements que les utilisateurs peuvent déclencher par le biais d'appels de fonction.
- Tranches de trace : représentent le temps écoulé entre différents points de votre code. Ils peuvent être ajoutés avec les API
Trace.beginSection
etTrace.endSection
. - Compteurs de trace : valeurs numériques représentant des métriques, par exemple la taille du tas. Vous pouvez les ajouter avec l'API
Trace.setCounter
.
Les traces système contiennent également des métriques qui peuvent être créées à partir de requêtes PerfettoSQL et qui peuvent être utilisées pour effectuer des analyses ou comparer des traces.
Nous vous recommandons d'utiliser les traces système pour effectuer les tâches suivantes :
Diagnostiquez les problèmes de latence. Les traces système sont idéales pour identifier les problèmes de latence causés par des retards, des attentes ou des problèmes de planification. D'autres profileurs, comme les profileurs basés sur des échantillons, ne fournissent pas les informations de timing fournies par les traces système.
Recherchez les calculs en double. Le traçage peut révéler si certains calculs sont répétés, ce qui peut indiquer des opérations inutiles.
Diagnostiquez les problèmes de contention de verrouillage. Grâce aux informations sur les états des threads et aux tranches indiquant quand les ressources sont bloquées, vous pouvez identifier si les verrous (comme les blocs
synchronized
) entraînent des retards dans les parcours utilisateur.Comprenez le multithreading dans votre application. Les traces offrent une vue de plusieurs threads, en affichant l'état de chaque thread et les tranches de trace ajoutées par le système ou votre application. Cette vue multithread vous aide à comprendre quels threads sont actifs, en veille ou ce qu'ils exécutent et comment ils interagissent.
Effectuez des analyses complexes des performances. L'interface utilisateur puissante et la possibilité d'afficher différents types d'informations rendent les traces système utiles pour déboguer un large éventail de problèmes de performances, y compris la latence, la mémoire et l'utilisation de la batterie.
Les traces système sont également compatibles avec les requêtes PerfettoSQL. Cette fonctionnalité puissante vous permet d'effectuer les actions suivantes :
- Extrayez des données spécifiques.
- Transformez les données de trace en métriques personnalisées.
- Créez des pistes de débogage à partir de requêtes pour visualiser plus facilement les éléments qui vous intéressent le plus dans l'UI Perfetto.
- Effectuez des analyses complexes directement dans l'UI Perfetto.
Profils d'échantillons de pile

Les profils d'échantillons de pile fonctionnent en enregistrant des échantillons d'exécution de code et en stockant les informations de la pile d'appels à un taux défini lorsqu'un thread exécute des tâches sur le processeur. Cela vous permet de comprendre ce que fait votre code lors de l'exécution.
Nous vous recommandons d'utiliser des exemples de pile pour effectuer les opérations suivantes :
- Optimisez les points d'accès. Les exemples de pile permettent d'identifier les parties de votre code avec une forte activité du processeur, ce qui signifie que le thread est souvent dans un état "en cours d'exécution".
- Comprendre l'exécution du code Les exemples de pile peuvent vous aider à comprendre le comportement global de votre codebase.
- Identifiez le code qui ne doit pas s'exécuter. Vous pouvez trouver des piles d'appels qui n'étaient pas censées s'exécuter du tout, ce qui indique des possibilités d'optimisation immédiates.
Empreintes de la mémoire

Les empreintes de la mémoire Java affichent un instantané de la mémoire du segment de mémoire Java de votre application. Cet instantané inclut tous les objets et la façon dont ils se référencent les uns aux autres au moment où le dump a été effectué.
Nous vous recommandons de collecter des vidages de tas pour effectuer les opérations suivantes :
- Découvrez les objets en double. Les vidages de tas indiquent le nombre d'objets actifs, ce qui est utile pour suivre les objets en double. Ils fournissent également des références d'objet, ce qui vous aide à identifier l'emplacement du code où les objets ont été créés.
- Détectez les fuites de mémoire. Les empreintes de la mémoire peuvent révéler de la mémoire qui ne devrait plus être utilisée au moment de l'empreinte, ce qui indique des fuites de mémoire potentielles.
- Identifiez les objets qui pourraient être optimisés. En affichant les objets qui utilisent beaucoup de mémoire et leur nombre, les empreintes de la mémoire aident à identifier les schémas d'utilisation inefficaces de la mémoire.
Profils de segment de mémoire

Les profils de tas de mémoire sont disponibles en versions native et Java. Ils sont excellents pour déboguer les problèmes de mémoire. Ils sont semblables aux exemples de pile d'appels, mais au lieu de mesurer les cycles de processeur, ils prennent des échantillons lorsque de la mémoire est allouée.
Nous vous recommandons d'utiliser des profils de tas pour effectuer les opérations suivantes :
- Réduisez la saturation de la mémoire. Les profils de segment de mémoire fournissent des exemples avec des emplacements de code pour les allocations de mémoire. Cela vous aide à identifier les zones qui créent de nombreux objets temporaires, ce qui peut entraîner de fréquentes collectes de déchets (GC) dans votre application.
- Découvrez les fuites de mémoire. Les profils de tas peuvent être utilisés avec d'autres profils de mémoire pour diagnostiquer et corriger les fuites de mémoire. Elles vous aident à identifier les emplacements qui allouent beaucoup plus de mémoire que prévu.
Combiner des profils
Vous analyserez souvent les performances à l'aide d'un seul profil. Toutefois, la collecte de plusieurs profils ou d'un seul profil combiné peut souvent fournir une image plus complète et aider à diagnostiquer des problèmes complexes qu'un seul profil ne peut pas résoudre.
Voici quelques scénarios dans lesquels la combinaison de profils est avantageuse :
Scénario 1 : Examiner le code non instrumenté Une trace système peut indiquer une latence pour les opérations que vous avez déjà instrumentées. Toutefois, vous aurez peut-être besoin de plus d'informations sur les parties non instrumentées de votre code qui s'exécutent pendant ces périodes. Pour examiner le problème, créez un profil de pile d'appels afin de comprendre le code exécuté. Ces informations peuvent ensuite vous aider à améliorer votre traçage en ajoutant d'autres tranches de trace.
Scénario 2 : Analyser les fuites de mémoire et les récupérations de mémoire. Imaginez qu'une trace système montre une augmentation constante de la mémoire du tas Java en raison des allocations, ce qui déclenche de fréquentes récupérations de mémoire. Pour comprendre les objets alloués, effectuez un profil de tas ou un vidage de tas. Cette approche combinée vous aide à identifier les moyens de réduire l'utilisation de la mémoire. Par exemple, la réduction des allocations inutiles ou optimisables à l'aide de la mise en cache peut empêcher les GC de se produire.