Visualiser les profils dans l'UI de Perfetto

Après avoir récupéré un profil à partir d'un appareil de test ou l'avoir téléchargé depuis votre backend, vous pouvez ouvrir le fichier dans l'interface utilisateur de Perfetto pour inspecter les chronologies, les états des threads et les graphiques de rétention de la mémoire. Cette page explique comment parcourir les traces système masquées et les empreintes de la mémoire Java capturées avec ProfilingManager.

Visualiser les traces système

Ouvrez votre fichier .perfetto-trace dans l'interface utilisateur de Perfetto pour inspecter l'activité du processeur et des threads au fil du temps.

Chronologie d'une trace système masquée dans l'UI de Perfetto
Figure 1. Exemple de trace masquée.

Pour protéger la confidentialité des utilisateurs, ProfilingManager masque les traces système en combinant l'activité du processeur de tous les autres processus dans une seule piste OtherProcesses. L'inspection de cette piste combinée vous permet toujours de déterminer si la lenteur de votre application est due à un goulot d'étranglement interne ou à la charge globale de l'appareil.

La figure 2 met en évidence les principales sections d'une trace système masquée :

Sections numérotées d'une trace système masquée dans l'interface utilisateur de Perfetto
Figure 2. Sections d'une trace masquée.
  1. Liste des processeurs : affiche tous les processeurs disponibles sur votre appareil.
  2. Tâches du processeur : indique les threads exécutés par chaque processeur.
  3. Vue "Autres processus" : affiche les ressources de processeur consommées par d'autres processus.
  4. Process View (Vue des processus) : affiche le processus de votre application.
  5. Threads View (Vue "Threads") : affiche les threads en cours d'exécution dans votre processus et leurs états (Exécutable (R), En cours d'exécution (R), En veille (S), Veille ininterrompue (D)), qui correspondent directement aux états du processus Linux.
  6. Tranches de trace : cette section affiche les annotations de trace ajoutées par les développeurs d'applications ou le framework. Ces annotations englobent les calculs entre Trace.beginSection et Trace.endSection.

Pour en savoir plus sur l'UI de Perfetto et la visualisation des traces, consultez la documentation de Perfetto.

Visualiser les empreintes de la mémoire Java

Une fois que vous avez capturé une empreinte de la mémoire Java à l'aide de PROFILING_TYPE_JAVA_HEAP_DUMP, ouvrez le fichier .perfetto-java-heap-dump obtenu dans l'UI Perfetto pour identifier les fuites de mémoire ou optimiser l'utilisation de la mémoire. Dans l'explorateur de vidages de tas, vous pouvez explorer le graphique de tas, inspecter les graphiques de type "flamme" des tailles d'objets cumulées, et parcourir les classes, les objets et les dominateurs, comme illustré dans la figure 3.

Explorateur de vidage de tas de mémoire de l'UI Perfetto affichant un graphique de type "flamme" des tailles d'objets du tas de mémoire Java.
Figure 3. Graphique de type "flamme" de l'empreinte de la mémoire Java dans l'interface utilisateur de Perfetto.

Différences entre les empreintes de la mémoire ProfilingManager et les empreintes HPROF

Contrairement aux empreintes de la mémoire .hprof standards (comme celles capturées avec Debug.dumpHprofData ou dans Android Studio), ProfilingManager capture une empreinte de la mémoire ART Perfetto (.perfetto-java-heap-dump). Au lieu de vider le contenu de la mémoire brute, ProfilingManager enregistre le graphique de conservation des objets et les métadonnées de dimensionnement, tout en omettant les données brutes stockées dans les objets :

  • Données collectées :
    • Classes et types : noms de classe, hiérarchies de superclasses, chargeurs de classe, tailles d'instance et types de référence (tels que les classes normales, les tableaux, les chaînes ou les références faibles, logicielles, de finalisation et fantômes).
    • Instances et tailles d'objets : taille superficielle de chaque objet (self_size), sa région de tas de mémoire (HEAP_TYPE_APP, HEAP_TYPE_ZYGOTE ou HEAP_TYPE_BOOT_IMAGE) et la mémoire native associée enregistrée via NativeAllocationRegistry.
    • Références et racines de récupération de mémoire : racines de récupération de mémoire (telles que les variables globales et locales JNI, les blocs de pile Java et les objets de thread) et chaînes de référence au niveau du champ indiquant quel objet en conserve un autre et via quel nom de champ.
    • Sélectionner les métadonnées de dimensionnement : métadonnées non sensibles pour des types de frameworks spécifiques, tels que les dimensions Bitmap (mWidth et mHeight).
  • Éléments omis : valeurs réelles des champs primitifs, contenu des caractères String et charges utiles de tableaux bruts (byte[], char[] et autres tableaux primitifs). L'omission du contenu brut des objets protège la confidentialité des utilisateurs sur les appareils de production et réduit considérablement la taille des fichiers de dump.

Étapes suivantes

Au-delà de l'inspection visuelle dans l'UI Perfetto, vous pouvez interroger des profils avec PerfettoSQL, analyser des traces de manière groupée ou analyser des profils avec l'IA.