{{tag>dev android log logcat}}
====== Générer des logs ======
Sous Android Studio, logcat permet de visualiser les logs générés par le système ou les applications. Pour générer des messages depuis l'application quelques étapes sont nécessaires:
===== Configuration =====
Sur les émulateurs cette fonction est active par défaut, par contre sur un périphérique physique, pour que le débogage puisse être utilisé, il faut qu'il soit activé:
* Paramètres -> Options pour développeurs -> section Débogage -> Débogage USB
Le fichier Gradle construit une version de débogage de l'application, c'est cette version qui sera utilisée sur le périphérique ou l'émulateur.
Logcat permet de visualiser l'ensemble des logs, il est par conséquent très verbeux, il faut s'appuyer sur le système de filtre pour ne conserver que les messages concernant l'application.
Les logs ont le format suivant:
[date] [heure] [PID-TID/package] [sévérité/tag] [message]
===== Écriture de logs =====
Pour pouvoir générer des logs visibles sous Logcat, il faudra importer la classe Log:
import android.util.Log;
Plusieurs niveaux de sévérité existent, pour chacun correspond une méthode:
^ verbose | Log.v(tag, message) |
^ debug | Log.d(tag, message) |
^ info | Log.i(tag, message) |
^ warning | Log.w(tag, message) |
^ error | Log.e(tag, message) |
===== Lecture via adb =====
adb permet également d'afficher les logs, de nombreuses options existent:
$ adb logcat
Pour n'afficher que les sévérités à partir de erreur:
$ adb logcat *:E
Pour visualiser le buffer contenant les messages relatifs aux évènements (plutôt que le main par défaut):
$ adb logcat -b event
Pour visualiser le buffer contenant les messages relatifs à la téléphonie (plutôt que le main par défaut):
$ adb logcat -b radio
===== Analyse des logs =====
En cas d'erreur les logs enregistrent les levées d' exceptions notamment les stack traces ou piles d'appels. Quelques causes usuelles:
==== NullPointerException ====
Certainement l'erreur la plus emblématique de Java, qui signifie que l'on essaie d'utiliser une variable null.
Solution : vérifier la nullité d'une variable avant de l'utiliser.
==== ActivityNotFoundException ====
Cette erreur intervient quand on essaie d'appeler une activité via startActivity(), mais que cette activity n'est pas déclarée dans le manifest.
Solution : déclarer l'activity dans le manifest.
==== ClassCastException ====
Cette erreur survient quand on essaie de lancer un objet dans une instance d'objet inappropriée. Par exemple lancer un TextView en View est tout à fait valide. En revanche lancer un TextView en Integer va provoquer une erreur.
Solution : toujours lancer dans le bon type.
==== NetworkOnMainThreadException ====
Dans Android, il est formellement interdit de créer une requête réseau sur le threadUI. Si vous le faites, vous recevrez cette erreur.
Solution : faire les requêtes réseau dans une asynctask ou dans un thread à part.
==== Activity Has Leaked Window That Was Originally Added Here ====
Cette erreur survient très souvent quand on essaie d'afficher un dialogue après avoir quitté l'activité à laquelle il est lié.
Solution : toujours détruire les dialog dans onPause() ou onDestroy().
===== Références =====
* https://developer.android.com/studio/debug/am-logcat
* https://grunk.developpez.com/tutoriels/android/debug-android-studio/
* http://adbshell.com/commands/adb-logcat