Systrace est un outil de traçage système Android qui collecte des données sur le noyau Linux, le CPU, le GPU et tous les processus système sur une courte période. Contrairement à Traceview, qui se concentre sur les méthodes au sein de l’application, Systrace montre l’image système : charge de chaque cœur de CPU, fonctionnement de SurfaceFlinger, appels Binder et cycles GC. Selon Google, 2024, l’outil est indispensable pour diagnostiquer les images perdues, les collectes de déchets fréquentes et les anomalies dans le thread UI.
Points clés
Systrace est un utilitaire en ligne de commande du SDK Android qui capture et fusionne les données de plusieurs sources de traçage du noyau (ftrace) et de l’espace utilisateur (atrace) en un seul rapport HTML. L’outil est apparu dans Android 4.1 (Jelly Bean) en remplacement de l’ancien utilitaire traceview pour le profilage système et est resté longtemps l’outil standard de diagnostic des performances sur la plateforme Android.
Systrace repose sur ftrace — un mécanisme de traçage du noyau Linux disponible dans Android depuis la version 4.1. Au démarrage de Systrace, il active les catégories de trace spécifiées : sched (planificateur de tâches), freq (fréquence CPU), idle (états inactifs), workq (files d’attente de travail), binder, gfx et autres. Les données sont collectées dans le tampon circulaire du noyau et, après l’arrêt, fusionnées en un seul fichier trace.html pouvant être ouvert dans n’importe quel navigateur.
À partir d’Android Studio 3.1, Systrace est intégré au CPU Profiler. En mode « Trace System Calls », le profileur lance Systrace sur l’appareil connecté et affiche les résultats directement dans la fenêtre d’Android Studio. Cela élimine la nécessité de travailler avec la ligne de commande pour les cas de base tout en conservant toutes les fonctionnalités — toutes les catégories de trace, le filtrage et la chronologie interactive. Les performances de l’appareil pendant le traçage diminuent de manière insignifiante car ftrace est conçu pour une surcharge minimale.
Systrace utilise deux mécanismes de collecte de données : ftrace au niveau du noyau pour les événements système et atrace dans l’espace utilisateur pour les marqueurs spécifiques à Android. ftrace enregistre les changements de contexte (sched_switch), les changements de fréquence CPU (cpu_frequency), les interruptions (irq_handler_entry) et d’autres événements. atrace ajoute des marqueurs du framework Android — le début et la fin du rendu des images, les appels SurfaceFlinger et les transactions Binder.
La fonctionnalité clé de Systrace est la visualisation du pipeline de rendu de chaque image : application → BufferQueue → SurfaceFlinger → HWC (compositeur) → Écran. Si un retard survient à une étape, Systrace montre la cause exacte : l’application n’a pas préparé le tampon à temps, SurfaceFlinger attendait VSync ou HWC n’a pas pu composer les couches. Le cycle de vie de l’image sur la chronologie est codé par couleur selon le statut : vert (à temps), jaune (retardé), rouge (perdu). Cette visualisation est l’outil principal pour optimiser les performances de l’interface utilisateur.
Systrace prend en charge plus de 20 catégories de trace, chacune comprenant un ensemble d’événements associés. Les catégories importantes incluent : gfx (rendu graphique), input (traitement des entrées), view (système View), webview (WebView), power (consommation énergétique), hal (couche d’abstraction matérielle). Pour le profilage de jeux, la catégorie gfx avec les détails des commandes GPU via AGI (Android GPU Inspector) est utile.
Systrace offre un ensemble unique de capacités pour Android qui ne sont pas disponibles dans d’autres profileurs : chronologie système, métriques au niveau du noyau et détection automatique des problèmes.
Le rapport HTML de Systrace contient une chronologie multicouche où chaque voie correspond à un processus ou un thread. Vous pouvez zoomer avant et arrière sur l’échelle de temps, cliquer sur les événements pour voir les détails (durée, processus initiateur, arguments supplémentaires). Le codage couleur facilite la navigation rapide : blocs verts — processus en cours, bleus — en attente, oranges — interruption, blancs — inactif.
Systrace analyse automatiquement la trace et affiche des messages d’alerte indiquant les zones problématiques. Par exemple : « Buffer underrun — SurfaceFlinger n’a pas reçu le tampon avant VSync » ou « Long Binder transaction — 42 ms dans le thread Binder_1 ». Chaque alerte contient un lien vers la section correspondante de la chronologie et une recommandation de correction. Cela économise des heures d’analyse manuelle et est l’une des principales raisons d’utiliser Systrace plutôt que la journalisation manuelle.
Les développeurs peuvent ajouter des marqueurs personnalisés à la trace Systrace via l’API Trace.beginSection et Trace.endSection. Cela permet de suivre l’exécution de sections de code critiques directement sur la chronologie système — par exemple, marquer le début et la fin du chargement de données ou du calcul de mise en page. Les marqueurs apparaissent comme des blocs séparés sur la voie de l’application et sont visibles aux côtés des événements système.
| Catégorie | Données | Utilisation typique |
|---|---|---|
| sched | Changements de contexte, états inactifs | Blocages de thread, contention |
| gfx | VSync, préparation du tampon, HWC | Chutes d’images, jank |
| binder | Transactions Binder, latence | Retards IPC, appels distants |
| freq | Fréquence CPU, gouverneur d’échelle | Throttling, consommation énergétique |
| gfx + AGI | Commandes GPU, shaders | Performances de jeu |
L’exécution de Systrace est possible de deux manières : via le CPU Profiler d’Android Studio (mode « Trace System Calls ») ou via la ligne de commande à l’aide du script Python systrace.py du dossier platform-tools. Chaque méthode a ses propres cas d’utilisation.
Connectez l’appareil, ouvrez le Profiler (View → Tool Windows → Profiler), sélectionnez votre processus, allez dans l’onglet CPU, sélectionnez le mode « Trace System Calls » et cliquez sur Record. Après 5–30 secondes, cliquez sur Stop — Android Studio lancera Systrace sur l’appareil, attendra la fin et chargera le résultat. Limitation : l’enregistrement n’est possible que lorsque le Profiler est ouvert, ce qui est peu pratique pour les scénarios longs ou l’automatisation.
Pour un contrôle plus flexible, utilisez le script systrace.py. Spécifiez les catégories de trace, la durée et le nom du fichier de sortie. Exemple : capture des données gfx, input et sched pendant 10 secondes. L’exécution nécessite Python 2.7+ et un appareil connecté avec le débogage USB activé. Sur Android 12+, Systrace est remplacé par Perfetto — la commande reste la même, mais le script redirige les appels vers perfetto.
# Exécution de base de systrace pendant 10 secondes
$ python systrace.py \
--time=10 \
-o trace.html \
gfx input sched
# Catégorie gfx uniquement pour l’analyse UI
$ python systrace.py \
--time=5 \
-t gfx \
-o ui_trace.html
Pour que votre code apparaisse sur la chronologie Systrace, encadrez la section critique avec Trace.beginSection / Trace.endSection. Il est important que beginSection et endSection soient strictement appariés — sinon Systrace affichera une chronologie incorrecte. En Kotlin, il est pratique d’utiliser une extension inline pour garantir la fermeture de la section même en cas d’exception.
import android.os.Trace
fun traceSection(name: String, block: () -> Unit) {
Trace.beginSection(name)
try {
block()
} finally {
Trace.endSection()
}
}
// Utilisation dans le code
traceSection("load_screen_data") {
fetchData()
updateUI()
}
Le rapport Systrace est un fichier HTML autonome qui peut être ouvert dans Chrome, Edge ou Firefox. Il contient une chronologie interactive, un panneau de sélection de processus, une liste de messages d’alerte et des métriques clés (taux d’images, utilisation CPU, transactions Binder). Comprendre la structure du rapport est une compétence clé pour un profilage efficace.
La chronologie affiche le temps de gauche à droite. Chaque processus et thread est une voie séparée. Les touches W/S permettent de zoomer avant/arrière, A/D de se déplacer dans le temps. Sélectionnez une zone avec la souris pour zoomer sur une section. Les lignes VSync montrent les limites des images (toutes les 16,6 ms à 60 FPS). Si un cycle de rendu complet ne tient pas entre deux lignes VSync — l’image est perdue. Faites attention à la voie SurfaceFlinger : si elle est occupée longtemps (bloc orange), la composition des couches ralentit le rendu global.
Le panneau Alertes sur le côté gauche du rapport contient les problèmes détectés automatiquement. Chaque alerte est cliquable — en cliquant, la chronologie se déplace vers le moment problématique. Les alertes les plus courantes : « Long Sync » (synchronisation longue de thread), « Scheduling Delay » (retard du planificateur), « Buffer Overrun » (débordement du tampon SurfaceFlinger). Si une alerte affiche une valeur d’environ 100 ms pour Scheduling Delay, cela indique directement que le thread UI attendait le CPU en raison d’une charge de fond — les calculs lourds doivent être déplacés vers un Worker Thread.
Pour analyser les images perdues, activez les voies SurfaceFlinger et app.gfx. Chaque image est affichée sous forme de rectangle : vert (≤16 ms), jaune (16–32 ms), rouge (>32 ms). Si vous voyez un rectangle rouge sur la voie de l’application, cliquez dessus — Systrace montrera quelle méthode spécifique (ou appel système) a dépassé la limite. Selon Google (Android Performance Patterns, 2023), 70 % des problèmes de jank sont causés par un onBindViewHolder lent ou un GC fréquent.
Perfetto est le successeur de Systrace, introduit par Google dans Android 9 (Pie) en tant qu’outil expérimental et devenu la solution principale à partir d’Android 12. Perfetto utilise un format de données protobuf moderne, prend en charge les longues sessions (des heures au lieu de secondes) et dispose d’une interface Web pour visualiser les traces. Examinons les principales différences entre les deux systèmes.
| Critère | Systrace | Perfetto |
|---|---|---|
| Format | Rapport HTML (trace.html) | Protobuf (.trace / .perfetto-trace) |
| Durée | Jusqu’à 60 secondes | Heures, gigaoctets de données |
| Interface | HTML intégré | Interface Web (ui.perfetto.dev) |
| Catégories | Fixes (ftrace + atrace) | Extensibles (requêtes SQL sur la trace) |
| Mobilité | Android uniquement | Android, Linux, Chrome, Windows |
Malgré la transition vers Perfetto, les compétences en Systrace restent pertinentes : sur les appareils fonctionnant sous Android 11 et inférieur, il est utilisé par défaut, et Perfetto maintient une compatibilité ascendante avec les catégories Systrace. Dans le CPU Profiler d’Android Studio, Perfetto est utilisé pour les nouveaux appareils et Systrace pour les anciens — de manière transparente pour l’utilisateur. Pour CI/CD, Perfetto est recommandé car son format peut être automatiquement traité via Python et SQL.
Pour maîtriser pratiquement Systrace, considérons deux scénarios : trouver la cause des images perdues lors du défilement et diagnostiquer les GC fréquents qui bloquent le thread UI.
Exécutez Systrace avec la catégorie gfx pendant 10 secondes, faites défiler la liste dans l’application. Dans le rapport, trouvez les sections avec des images rouges. Cliquez sur l’image problématique et regardez la voie de l’application — s’il y a un bloc « inflateLayout » ou « onBindViewHolder » de plus de 16 ms, le problème vient du gonflage de la mise en page ou de la liaison de données. Solution : optimisez la mise en page (réduisez les ViewGroup profonds, ViewStub), déchargez le chargement d’images vers Glide avec onAttachedToWindow.
Systrace avec les catégories freq et sched permet de voir à quelle fréquence les cycles GC préemptent le thread UI. Trouvez la voie de l’application sur la chronologie — si vous voyez des blocs périodiques de 20–50 ms nommés « Concurrent GC », le ramasse-miettes s’exécute trop fréquemment. Ajoutez la catégorie « dalvik » pour une analyse détaillée. Solution : convertissez Bitmap en ByteBuffer, utilisez un pool d’objets (ObjectPool) pour les allocations fréquentes, réduisez la fragmentation du tas via les arguments ART.
# Exécution avec catégories pour analyse UI + GC
$ python systrace.py \
--time=15 \
-o gc_analysis.html \
gfx sched dalvik freq
# Capture avec durée de 30 secondes pour test reproductible
$ python systrace.py \
--time=30 \
--app=com.example.app \
-o app_trace.html
Questions fréquentes
Oui, l’exécution de Systrace ne nécessite pas d’accès root. L’outil utilise atrace, disponible sur tout appareil avec le débogage USB activé. Certaines catégories (power, freq) peuvent nécessiter une signature système, mais les principales (gfx, sched, input) fonctionnent sur tous les appareils.
La limite de 60 secondes est liée à la capacité du tampon circulaire ftrace — lors d’un enregistrement long, le tampon est écrasé. Perfetto supprime cette limitation : vous pouvez enregistrer pendant des heures et obtenir des traces allant jusqu’à plusieurs gigaoctets via un transfert USB ou un streaming sur disque.
Causes possibles : l’application n’est pas en mode débogable, le flag android:debuggable=« true » n’est pas défini dans le manifeste, ou une version release est utilisée. Vérifiez également que vous avez spécifié --app=com.example.app dans les catégories — sinon Systrace ne capture que les processus système.
Pour C++, utilisez ATRACE_BEGIN et ATRACE_END de la bibliothèque libcutils. Incluez le fichier d’en-tête et encadrez la section souhaitée. Le marqueur apparaîtra dans Systrace sur la voie de votre processus, ce qui est particulièrement utile pour analyser les moteurs de jeu (Unity, Unreal).
Sur Android 12 et supérieur, utilisez Perfetto. Installez l’agent perfetto sur l’appareil via ADB, lancez l’enregistrement au format JSON. Pour une visualisation rapide, utilisez l’interface Web de Perfetto (ui.perfetto.dev), et pour CI — l’export en ligne de commande avec TraceProcessor en Python.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi