Débogage dans Android Studio – Développeurs Android
Trucs et astuces pour éliminer plus rapidement les bugs sur Android
En tant que développeurs, nous savons tous qu’il y a des jours où nous passons plus de temps dans le débogueur que dans l’éditeur de code. Dans cet esprit, j’ai récemment profité de l’occasion pour voir quels trucs et astuces les membres de notre équipe Android Studio avaient pour accélérer le débogage. J’ai rassemblé certains des meilleurs qui, je pense, vous feront gagner du temps et seront faciles à intégrer dans votre flux de débogage.
Bien que votre application soit probablement très différente de l’exemple d’application de jeu hypothétique que nous utilisons ici, ces conseils de débogage s’appliqueront à n’importe quelle application.
Si vous préférez regarder une démo en direct, vous pouvez trouver une version vidéo de cet article sur Youtube.
Permettez-moi de commencer par une astuce pour ce classique de débogage: printf
déclarations. Prenez un jeu qui enregistre son taux d’images par seconde chaque seconde et le score final de l’utilisateur à la fin de chaque jeu. dans le Logcat fenêtre cela donne:
Il y a beaucoup d’informations dans la sortie qui ne vous intéressent peut-être pas, comme la date et les ID de thread. Vous pouvez facilement configurer ce qui est affiché. Du logcat barre d’outils, cliquez sur le Réglages icône et, dans le Configurer l’en-tête Logcat , désélectionnez les informations que vous ne souhaitez plus voir.
Vous obtenez maintenant une sortie de journal beaucoup plus propre et plus pertinente, comme ceci:
Cependant, cela laisse encore beaucoup d’encombrement obscurcissant les messages de score élevé. Pour vous concentrer sur ces messages, utilisez la recherche logcat. Entrez une partie du message de débogage dans Chercher pour filtrer le logcat fenêtre.
S’il s’agit d’une recherche que vous utilisez régulièrement, vous pouvez l’enregistrer en ajoutant un filtre personnalisé à partir de Modifier la configuration du filtre.
Ajoutez ensuite les détails de votre filtre.
Une autre façon de réduire l’encombrement de la journalisation consiste à utiliser la fonction de lignes de pliage, qui regroupe et réduit les lignes similaires. Sélectionnez du texte dans un élément du journal, cliquez avec le bouton droit et sélectionnez Pliez les lignes comme ceci.
Quand le Console s’ouvre, cliquez sur D’accord et les messages similaires contenant le texte sélectionné sont réduits.
Si vous devez consulter ces informations ultérieurement, vous pouvez cliquer sur les lignes pour les développer. Il existe également des poignées de gouttière qui vous permettent d’agrandir et de réduire les lignes pliées.
Vous démarrez généralement une session de débogage à l’aide du Déboguer bouton ou option de menu. Cependant, si vous avez démarré une application en l’exécutant, vous pouvez attacher un débogueur à l’application en cours d’exécution sans avoir besoin de la redémarrer. Pour ce faire, cliquez sur Attacher le débogueur au processus Android.
dans le Choisissez le processus , sélectionnez le processus auquel vous souhaitez attacher le débogueur et cliquez sur D’accord. Maintenant, vous allez commencer à atteindre vos points d’arrêt comme vous le feriez normalement dans une session de débogage.
Si vous constatez que vous avez défini un point d’arrêt à un endroit inapproprié, plutôt que d’effacer et de réinitialiser le point d’arrêt, vous pouvez le faire glisser sur la ligne qui vous intéresse. Ceci est utile car il préserve les paramètres du point d’arrêt, y compris les choses que je vais mentionner ensuite.
Vous devrez peut-être pourchasser un bogue lié à un type d’événement particulier dans votre application ou votre jeu. Par exemple, dans un jeu que vous développez, vous voudrez peut-être arrêter lorsqu’un joueur entre en collision avec l’objet qui utilise son dernier bit de santé. Vous définissez un point d’arrêt sur les collisions, mais maintenant le code s’arrête à chaque collision. Pour éviter cela, vous pouvez définir un point d’arrêt conditionnel.
Pour définir un point d’arrêt conditionnel, cliquez avec le bouton droit sur un point d’arrêt et ajoutez une condition. La condition peut être n’importe quelle expression de code équivalente à un booléen. Lorsque le code atteint la ligne, si l’expression prend la valeur true, le point d’arrêt est activé.
Ici, en logique lorsque le joueur est sur le point d’entrer en collision avec un objet, définissant une condition de player.health == 1
vous permet d’attraper la dernière fois que le joueur entre en collision avec l’objet avant que sa santé ne tombe à 0.
Il n’est pas inhabituel pour une application d’avoir du code qui peut être déclenché à partir de nombreux chemins différents. Si vous avez un bogue qui ne se produit que le long d’un chemin particulier, la définition d’un point d’arrêt dans le code peut entraîner de nombreuses interruptions inutiles. Pour contourner ce problème, vous pouvez utiliser des points d’arrêt dépendants, qui ne se déclenchent qu’après qu’un autre point d’arrêt spécifié a été atteint. Par exemple, vous pouvez créer un point d’arrêt qui est déclenché uniquement dans le chemin qui vous tient à cœur, puis l’utiliser comme dépendance, de sorte que votre autre point d’arrêt ne se déclenche que dans le chemin qui vous intéresse.
Pour définir un point d’arrêt dépendant, cliquez avec le bouton droit sur le deuxième point d’arrêt et ouvrez le Plus menu. Dans Désactiver jusqu’à ce que le point d’arrêt soit atteint, choisissez le point d’arrêt dont vous souhaitez dépendre.
Vous remarquerez que l’icône de point d’arrêt change:
Maintenant, vous ne vous arrêtez ici qu’après que le point d’arrêt précédent a été atteint.
Vous pouvez également utiliser cette fonctionnalité lorsque vous avez un point d’arrêt conditionnel ailleurs et que vous souhaitez éviter de copier et coller cette condition vers un nouvel emplacement.
Si vous déboguez une application multithread, vous remarquerez que, par défaut, les points d’arrêt suspendent tous les threads. Cependant, vous ne souhaiterez peut-être pas ce comportement. Par exemple, vous souhaitez peut-être vérifier que vous pouvez bloquer sur un thread et que le reste de votre application fonctionne toujours, ou vous voulez que votre interface utilisateur continue de s’afficher pendant que vous étudiez une tâche en arrière-plan.
Pour suspendre uniquement le thread actuel, ouvrez les options de point d’arrêt et sélectionnez Fil dans le Suspendre réglages.
Parfois, plutôt que de vous arrêter à un point d’arrêt, vous souhaitez voir certaines informations associées à l’état de l’application. Vous pourriez ajouter printlns
au code pour y parvenir. Plutôt que d’utiliser cette approche, qui nécessite une recompilation, vous pouvez utiliser le point d’arrêt lui-même pour évaluer et consigner.
Pour ce faire, dans les options de point d’arrêt, désactivez Suspendre et activer Évaluer et enregistrer.
Vous pouvez maintenant ajouter n’importe quelle expression de code, et elle sera évaluée et enregistrée dans la console.
Si vous voulez simplement vérifier rapidement que votre point d’arrêt a été déclenché et ne vous souciez pas des détails, utilisez le Message « Coup de coup d’arrêt » pour enregistrer que le point d’arrêt a été atteint. Il existe même un moyen rapide de créer ce type de point d’arrêt: appuyez simplement sur la touche Maj et cliquez dans la gouttière.
Si vous souhaitez désactiver rapidement un point d’arrêt, plutôt que de cliquer avec le bouton droit et de désélectionner Activée, vous pouvez appuyer sur Alt
(Option sur Mac) et cliquez pour activer ou désactiver un point d’arrêt.
Vous avez travaillé sur un bug, créé des points d’arrêt, mais vous faites peu de progrès. Vous passez donc à travailler sur un autre bug. Bientôt, cependant, vous commencez à atteindre les points d’arrêt du premier bogue. Atteindre des points d’arrêt non liés peut être frustrant et vous faire sortir de votre flux de débogage.
Vous pouvez vous simplifier la vie en utilisant des groupes de points d’arrêt.
Lorsque vous atteignez le premier point d’arrêt indésirable, cliquez avec le bouton droit et ouvrez Plus. Vous voyez maintenant une liste de tous les points d’arrêt. Sélectionnez plusieurs tous les points d’arrêt associés à votre premier bogue.
Cliquez avec le bouton droit sur les points d’arrêt sélectionnés et cliquez sur Déplacer vers le groupe puis Créer un nouveau. Nommez le groupe, peut-être d’après le bogue sur lequel vous travailliez. Maintenant, vous pouvez facilement activer et désactiver tous les points d’arrêt, en un clic.
De plus, lorsque vous avez terminé avec le bogue, vous pouvez utiliser le groupe pour supprimer tous les points d’arrêt.
Parfois, lorsque vous parcourez un code suspendu, il est possible que vous survoliez accidentellement une méthode plutôt que dedans. Si vous utilisez Android 10 ou une version ultérieure, vous pouvez maintenant revenir en arrière en cliquant sur Drop Frame dans la barre d’outils du débogueur.
Cette fonctionnalité vous sort de la méthode actuelle et vous ramène au point avant qu’elle ne commence, vous donnant une deuxième occasion d’entrer dans la méthode.
Cette fonction n’est pas une «machine à remonter le temps». Si vous étiez au milieu d’une longue fonction et qu’elle avait fait beaucoup de travail intermédiaire – par exemple, modifié l’état de la classe actuelle – ce travail ne se défait pas lorsque vous déposiez le cadre.
Il y a des moments où vous voulez suivre le cycle de vie d’une instance de classe spécifique, comme cet exemple, avec un élément qui a un code de hachage @ 10140.
Vous pourriez être tenté de retirer un morceau de papier et d’écrire 10140, afin que vous puissiez identifier l’objet lorsqu’il apparaît à nouveau. Mais vous pouvez également cliquer avec le bouton droit sur l’élément, cliquer sur Marquer l’objetet étiquetez-le.
Maintenant, partout où cet objet marqué apparaît dans l’une des fenêtres de débogage, il est étiqueté et facile à trouver. Ici, nous avons étiqueté l’objet «myItem»:
Ce qui le rend encore meilleur pour suivre un objet, c’est la possibilité de le voir dans le Montres même si vous vous trouvez dans un contexte totalement différent où cet élément n’est pas accessible autrement. Où que vous soyez, tant que vous atteignez un point d’arrêt, dans le Montres fenêtre, ajoutez votre étiquette suivie de « _DebugLabel » (ne vous inquiétez pas de vous en souvenir, cela se terminera automatiquement).
Maintenant, vous pouvez suivre l’élément de classe n’importe où dans le Montres fenêtre pour voir son état.
Vous pouvez également combiner cette fonctionnalité avec des points d’arrêt conditionnels. Par exemple, vous pouvez définir un point d’arrêt, cliquer dessus avec le bouton droit et définir la condition à comparer avec un objet étiqueté.
Maintenant, plutôt que de franchir plusieurs points d’arrêt jusqu’à ce que l’instance d’élément particulière soit dans la portée, le code se casse au bon endroit pour vous.
Tandis que le Variables et Montres les fenêtres sont utiles pour garder un œil sur les valeurs explicites, vous voulez parfois explorer votre code plus librement, c’est là que la fonctionnalité pour évaluer les expressions entre en jeu. Lorsque vous êtes à un point d’arrêt, accédez à cette fonctionnalité à partir de Évaluer l’expression dans la barre d’outils du débogueur.
dans le Expression saisie de texte, entrez une expression et appuyez sur Évaluer pour l’évaluer. De plus, si vous évaluez un objet, après évaluation, vous pouvez parcourir l’objet dans le Résultat section.
La boîte de dialogue d’évaluation d’expression peut s’ouvrir en mode ligne unique. Vous pouvez facilement l’étendre à plusieurs lignes en cliquant sur Développer.
Vous pouvez maintenant saisir des expressions multilignes complexes. Ceux-ci peuvent inclure des variables et des instructions if, entre autres.
Lorsque vous avez un point d’arrêt conditionnel où vous évaluez une expression, même si vous ne vous arrêtez pas à ce point d’arrêt, le débogueur doit toujours effectuer l’évaluation. Si vous exécutez du code dans une boucle très serrée, comme le traitement d’animation dans un jeu, cela peut entraîner le bégaiement de l’application. Bien que les points d’arrêt conditionnels soient utiles, il peut s’agir d’un cas limite où vous ne pouvez pas vous fier à eux.
Une façon de contourner ce problème consiste à ajouter l’expression conditionnelle au code et à utiliser une expression no op afin de pouvoir attacher le point d’arrêt.
Cela fait, vous pouvez décider de redémarrer votre application et de cliquer sur Déboguer. Mais, plutôt que cela, lors de l’exécution sur Android 8 et supérieur, vous pouvez utiliser Appliquer les modifications de code.
Maintenant, votre code est corrigé avec l’expression incorporée. Cependant, vous verrez dans le Cadres fenêtre dans laquelle la méthode que vous avez mise à jour est marquée comme Obsolète.
En effet, le nouveau code a été corrigé, mais votre débogueur pointe toujours sur l’ancien code. Vous pouvez utiliser la fonction drop frame pour quitter l’ancienne méthode et passer à la nouvelle.
Bien que nous n’en ayons pas eu besoin dans ce cas, il existe une deuxième option, Appliquer les modifications et redémarrer l’activité. contrairement à Appliquer les modifications de code, cette option redémarre également l’activité, ce qui est utile si vous avez modifié des ressources de mise en page ou si le code que vous essayez de déboguer se trouve, par exemple, dans un onCreate
méthode.
Malgré tous ces trucs et astuces, malheureusement, vous allez probablement avoir des bogues dans votre code et obtenir des rapports de bogues. Lorsque vous recevez ces rapports de bogues, le reporter peut avoir inclus une copie texte de la pile des exceptions. Vous pouvez les transformer en informations significatives dans Android Studio en utilisant, à partir du Analyser menu, Analyser la trace de pile ou le vidage de thread.
Cet outil fournit un emplacement pour coller une trace de pile, mais il sera automatiquement rempli avec n’importe quel texte dans votre presse-papiers.
Cliquez sur D’accord et une version entièrement annotée de la trace de pile est ajoutée à la console.
Vous pouvez voir en un coup d’œil ce qui provient de votre base de code (surligné en bleu ci-dessus) par rapport au code auquel vous n’avez probablement pas besoin de prêter attention (surligné en gris). Et, vous pouvez cliquer sur les liens pour parcourir rapidement votre base de code.
Ce ne sont que quelques-uns des trucs et astuces que vous pouvez utiliser pour accélérer votre débogage. Voici quelques exemples que nous n’avons pas eu le temps de détailler:
- En mode débogage, cliquez sur un numéro de ligne dans la gouttière pour accéder à cette ligne.
-
Ctrl+drag
crée une copie d’un point d’arrêt. - Vous pouvez définir des points d’arrêt sur l’accolade de fermeture d’une fonction.
- Vous pouvez définir des points d’arrêt sur les champs et les propriétés (appelés «points de surveillance des champs»).
- Vous pouvez définir un point d’arrêt sur une méthode d’interface pour interrompre toutes ses implémentations.
Il existe également plusieurs vidéos liées à ce sujet que vous voudrez peut-être consulter, notamment: