Les tests constituent une partie cruciale du développement Android, car ils vous permettent d’éliminer tous les bugs, erreurs et problèmes de performances susceptibles de se dissimuler dans votre application, avant que vous ne la diffusiez sur le grand public..
Chaque fois que vous rencontrez une erreur, Android génère un message d'erreur, puis affiche ce message dans le cadre d'Android Studio. Moniteur Logcat ou en tant que dialogue sur l'appareil que vous utilisez pour tester votre application.
Ces messages d'erreur sont généralement brefs et précis, et à première vue, ils peuvent ne pas sembler très utiles. Cependant, ces messages contiennent en réalité toutes les informations nécessaires pour remettre votre projet sur les rails - il vous suffit de savoir comment les déchiffrer.!
Dans cet article, nous allons examiner de manière approfondie les 13 messages d'erreur que vous êtes le plus susceptible de rencontrer lors du développement. tout Application Android. Nous allons examiner ce que chacun de ces messages d'erreur vraiment signifie examiner toutes les raisons possibles pour lesquelles vous pourriez rencontrer chaque erreur et, surtout, partager des instructions pas à pas sur la façon de les résoudre.
Vous pouvez rencontrer un grand nombre de messages d'erreur lors du test de votre application, allant des erreurs graves qui provoquent le blocage de votre application lors de la première installation de celui-ci sur un périphérique cible à des erreurs plus subtiles qui dégradent les performances de votre application avec le temps..
En fonction du type d'erreur que vous rencontrez, Android affiche le message d'erreur sur l'appareil que vous utilisez pour tester votre application ou dans Android Studio..
Il est facile de repérer les messages d'erreur qui apparaissent sur un périphérique physique ou un DAV: il vous suffit de faire attention aux dialogues qui apparaissent sur l'écran de votre périphérique! Cependant, détecter les erreurs qui apparaissent dans Android Studio peut être délicat, car Logcat Monitor enregistre une énorme quantité d'informations, ce qui permet de passer facilement à côté de messages d'erreur importants..
Le moyen le plus simple de vous assurer que vous ne manquez aucun message d'erreur est d'ouvrir le logiciel Logcat Monitor. Verbeux liste déroulante et réglez-le sur Erreur, qui filtrera tout sauf les messages d'erreur.
Cette erreur survient lorsque Android Studio ne peut pas générer votre R.java fichier correctement, et il peut souvent surgir de nulle part - une minute, tout fonctionnera bien, et la minute suivante, chaque partie de votre projet ne sera pas compilée. Pour aggraver les choses, quand Android Studio rencontre le R.layout
error, généralement, tous les fichiers de ressources de mise en page sont marqués comme contenant des erreurs. Il est donc difficile de savoir par où commencer pour rechercher la source de l'erreur..
La solution la plus efficace est souvent la plus simple: nettoyez et reconstruisez votre projet. Sélectionner Construire> Nettoyer le projet dans la barre d’outils Android Studio, attendez quelques instants, puis construisez votre projet en sélectionnant Construire> Reconstruire le projet.
Si un seul cycle de nettoyage / reconstruction ne fonctionne pas, essayez de répéter ce processus plusieurs fois, car certains développeurs ont signalé des résultats positifs après plusieurs cycles de nettoyage / reconstruction successifs..
Si vous rencontrez cette erreur après avoir déplacé des fichiers et des répertoires, il est possible que le R.layout
Cette erreur est due à une incompatibilité entre le cache d'Android Studio et la présentation actuelle de votre projet. Si vous pensez que cela peut être le cas, sélectionnez Fichier> Invalider les caches / redémarrer> Invalider et redémarrer depuis la barre d'outils d'Android Studio.
Des problèmes avec les noms de vos ressources peuvent également empêcher la R.java Si le fichier a été créé correctement, vérifiez que vous n'avez pas plusieurs ressources portant le même nom et qu'aucun de vos noms de fichier ne contient de caractères non valides. Android Studio ne prend en charge que les minuscules a-z, 0-9, les arrêts complets et les traits de soulignement. Un seul caractère non valide peut entraîner R.layout
erreur sur l'ensemble de votre projet, même si vous ne le faites pas réellement utilisation cette ressource n'importe où dans votre projet!
Si vous identifiez et résolvez une erreur, mais qu'Android Studio affiche toujours le message R.layout
erreur, vous devrez peut-être terminer un cycle de nettoyage / reconstruction avant qu'Android Studio enregistre correctement vos modifications.
Lorsque vous compilez votre application, l'APK contient des fichiers bytecode exécutables sous la forme de fichiers bytecode Dalvik Executable (DEX). La spécification DEX indique qu’un seul fichier DEX peut faire référence à un maximum de 65 536 méthodes. Si vous rencontrez le problème, Trop de champs… erreur alors cela signifie que votre application a dépassé cette limite. Notez qu'il s'agit d'une limitation du nombre de méthodes de votre projet. références, et non le nombre de méthodes de votre projet définit.
Si vous rencontrez cette erreur, vous pouvez alors:
Le processus d'activation de la prise en charge multidex varie en fonction des versions d'Android prises en charge par votre projet..
Si vous ciblez Android 5.0 ou une version ultérieure, ouvrez votre fichier build.gradle au niveau du module et définissez-le. multiDexEnabled
à vrai
:
android defaultConfig minSdkVersion 21 multiDexEnabled true
Cependant, si votre minSdkVersion
est de 20 ou moins, alors vous aurez besoin d'ajouter le multiDexEnabled true
attribuez puis ajoutez la bibliothèque de support multidex en tant que dépendance de projet:
dépendances compile 'com.android.support:multidex:1.0.1'
La prochaine étape dépend si vous écrasez ou non la Application
classe.
Si votre projet annule la Application
classe, puis ouvrez votre manifeste et ajoutez ce qui suit au
étiquette:
…
Si votre projet ne remplace pas la Application
classe, alors vous aurez besoin d'étendre MultiDexApplication
au lieu:
Classe publique MyApplication étend MultiDexApplication
Enfin, si vous remplacez la Application
mais vous ne pouvez pas changer la classe de base, vous pouvez alors activer multidex en remplaçant le attachBaseContext ()
méthode et appel MultiDex.install (this)
, par exemple:
@Override protected void attachBaseContext (Base de contexte) super.attachBaseContext (base); MultiDex.install (this);
Si vous obtenez une erreur JDK chaque fois que vous essayez de créer votre application, cela signifie qu'Android Studio a du mal à trouver l'emplacement d'installation du JDK sur votre ordinateur de développement..
Pour corriger cette erreur:
Si cela ne résout pas le problème, retournez à Fichier> Structure du projet…> Emplacement du SDK, et entrez manuellement le chemin d'accès complet à votre JDK. Si vous ne savez pas exactement où le JDK est installé sur votre machine de développement, vous pourrez le savoir en ouvrant le terminal (Mac) ou l'invite de commande (Windows) et en entrant la commande suivante:
/ usr / libexec / java_home
Bien que les AVD soient parfaits pour tester votre application sur de nombreux matériels et logiciels, vous devez toujours tester votre application sur au moins un smartphone ou une tablette Android. Cependant, la capacité d'Android Studio à reconnaître un appareil Android connecté est notoirement aléatoire..
Si vous avez connecté votre périphérique à votre ordinateur de développement mais rencontrez un problème Erreur lors de l'installation de APK message chaque fois que vous essayez d'installer votre APK, ou votre appareil n'apparaît même pas dans le Sélectionnez la cible de déploiement fenêtre, puis essayez les correctifs suivants:
Ouvrez votre appareil Réglages, puis sélectionnez Options de développeur, et assurez-vous Débogage USB est autorisé. Si vous ne voyez pas Options de développeur dans le Réglages menu, puis sélectionnez A propos du téléphone et continuez à taper Numéro de construction jusqu'à ce qu'un Vous êtes maintenant développeur notification apparaît. Retour à la principale Réglages écran, et vous devriez trouver que Options de développeur a été ajouté.
Parfois, votre périphérique peut nécessiter une entrée supplémentaire avant de se connecter à votre ordinateur de développement. Par exemple, il peut vous demander de choisir entre différents modes ou d’autoriser explicitement la connexion..
Si vous développez sur Windows, vous devez télécharger le pilote USB OEM approprié pour votre périphérique. Si vous êtes un utilisateur Nexus, vous pouvez télécharger le Google USB pilote via le SDK Manager d'Android Studio.
Vous trouverez le SDK minimum de votre projet dans votre fichier gradle.build au niveau du module et pourrez vérifier quelle version d'Android est installée sur votre appareil en ouvrant son répertoire. Réglages et en glissant vers le A propos du téléphone section.
Ouvrez une fenêtre de terminal ou d'invite de commande, puis changez de répertoire (CD
), il pointe donc vers votre outils de plate-forme fenêtre, par exemple:
cd / Utilisateurs / Téléchargements / adt-bundle-mac / sdk / platform-tools
Ensuite, terminez et redémarrez le processus adb en entrant les commandes suivantes, l’une après l’autre:
./ adb kill-server
./ adb start-server
Si tout échoue, essayez de vous déconnecter puis de vous reconnecter, de redémarrer votre appareil, de redémarrer Android Studio et, en dernier recours, de redémarrer votre ordinateur de développement..
Si vous rencontrez cette erreur en essayant d'installer votre projet, cela signifie que le périphérique cible n'a pas assez de mémoire..
Si vous essayez d'installer votre projet sur un AVD, vous devez vérifier combien d'espace vous avez attribué à cet AVD:
Cette section répertorie les différents types de mémoire que vous avez allouées à cet AVD particulier. Si l'une de ces valeurs est inhabituellement basse, augmentez-la pour mieux refléter la mémoire disponible sur votre smartphone ou votre tablette Android:
S'il n'y a rien d'étonnant à propos de la mémoire de votre AVD, ou si vous essayez d'installer votre application sur un smartphone ou une tablette Android physique, alors cette erreur signifie généralement que votre application compilée est tout simplement trop volumineuse. Une application qui ne mord pas dans la mémoire de l'appareil au moment de l'installation ne risque jamais de tomber en panne.
Si vous avez besoin de réduire considérablement la taille de votre fichier APK, essayez les techniques suivantes:
Utilisez ProGuard pour supprimer les classes, champs, méthodes et attributs inutilisés. Pour activer ProGuard, ouvrez votre fichier build.gradle au niveau du module et ajoutez les éléments suivants:
buildTypes release // Activer ProGuard // minifyEnabled true // Puisque nous voulons réduire autant que possible notre taille APK, j'utilise les paramètres du fichier proguard-android-optim.txt // proguardFiles getDefaultProguardFile ('proguard -android-optim.txt '),' proguard-rules.pro '
shrinkResources true
au fichier build.gradle de votre projet.Android: teinte
et tintMode
, et vous pouvez faire pivoter une image en utilisant android: fromDegrees
, android: toDegrees
, Android: pivotX
, et android: pivotY
.Optimisez vos bibliothèques. Essayez de supprimer toutes les bibliothèques inutiles ou gourmandes en mémoire de votre projet. Si vous devez utiliser une grande bibliothèque, vérifiez si vous pouvez optimiser cette bibliothèque pour l'environnement mobile, car le code de la bibliothèque externe n'est souvent pas écrit pour la mobilité. Vous devez également garder à l'esprit que de nombreuses bibliothèques contiennent une grande quantité de chaînes localisées. Si votre application ne prend pas officiellement en charge ces bibliothèques, vous pourrez peut-être en réduire la taille en disant à Gradle de ne pas inclure ces chaînes dans votre fichier APK compilé. Pour spécifier les langues que votre application prend officiellement en charge, ouvrez votre fichier build.gradle au niveau du module et utilisez la commande resConfigs
attribut. Par exemple, nous spécifions ici que nous voulons inclure uniquement des chaînes en anglais dans notre projet:
android defaultConfig resConfigs "en"
Déterminez si votre APK contient une grande quantité de contenu que l'utilisateur individuel peut télécharger mais ne jamais utiliser. Par exemple, un appareil avec un écran hdpi n’est pas très utile pour xxxhdpi
les atouts! L'un des moyens les plus efficaces de réduire la taille de votre fichier APK consiste à le séparer en plusieurs fichiers. Ainsi, lorsque l'utilisateur télécharge votre application, il reçoit un fichier APK qui ne contient que le code et les ressources utiles pour son appareil. Vous trouverez plus d'informations sur la création d'APK ciblant différentes densités d'écran et des ABI spécifiques (interfaces binaires d'application) via la documentation officielle Android..
Un ActivityNotFoundException
se produit quand un appel à startActivity (Intent)
ou l'une de ses variantes échoue parce que le Activité
ne peut pas exécuter le donné Intention
.
La cause la plus commune d'un ActivityNotFoundException
c’est oublier de déclarer une activité dans votre manifeste, alors ouvrez-le et vérifiez que vous avez déclaré toutes vos activités. Vous devriez également vérifier que vous avez déclaré chaque activité correctement, en utilisant soit un nom de classe qualifié complet, soit un arrêt complet en abrégé pour le nom du package. Par exemple, les deux éléments suivants sont valides:
Si vous ne repérez aucun problème avec votre manifeste, il existe quelques autres causes potentielles de ActivityNotFoundExceptions
. Tout d’abord, si vous rencontrez cette erreur après avoir déplacé un Activité
classe d’un paquet à l’autre, il est possible que vous ayez confondu Android Studio et que vous ayez juste besoin de nettoyer et de reconstruire votre projet.
Un ActivityNotFoundException
peut également être provoqué si une erreur dans la cible Activité
ne se charge pas correctement. Pour vérifier si cela se produit dans votre projet, placez votre code d'intention dans un bloc try-catch:
try // Votre code ici // catch (ActivityNotFoundException e) e.printStackTrace ();
Exécutez à nouveau votre application, puis examinez Logcat Monitor d'Android Studio pour savoir s'il a capturé les exceptions pouvant empêcher la création de l'activité cible. Si tel est le cas, la résolution de ces erreurs devrait alors résoudre le problème. ActivityNotFoundException
, aussi.
le ClassCastException
Cette erreur est liée à la fonctionnalité de conversion de type de Java, qui vous permet de convertir des variables d’un type à un autre. Vous rencontrez un ClassCastException
lorsque vous essayez de convertir un objet en classe dont il ne s'agit pas. Par exemple, les deux extraits de code suivants entraîneront une ClassCastException
:
Object x = nouvel entier (0); System.out.println ((String) x);
ImageView image = (ImageView) context.findViewById (R.id.button);
Ce message d'erreur contient des informations sur la ligne à l'origine du problème. ClassCastException
erreur, accédez donc à cette partie de votre projet, vérifiez quels objets sont convertis à cet endroit et résolvez toute incompatibilité.
Si vous ne pouvez pas repérer un problème avec votre casting, demandez-vous si vous avez récemment déplacé des Des vues
autour de vos fichiers de ressources de mise en page, car certains utilisateurs ont signalé avoir rencontré un ClassCastException
après avoir réarrangé leur Des vues
. Si vous pensez que cela peut être la cause de votre ClassCastException
, Indiquez ensuite à Android Studio de régénérer vos fichiers de présentation à partir de zéro, en effectuant un cycle de nettoyage / reconstruction. Ceci oblige Android Studio à enregistrer correctement vos modifications de mise en page récentes, ce qui devrait résoudre votre problème. ClassCastException
.
En Java, lorsque vous déclarez une variable de référence, vous créez en fait un pointeur sur un objet. Vous pouvez déclarer qu'un objet pointe actuellement sur une donnée inconnue en attribuant une valeur null à la référence de cet objet. Les valeurs nulles peuvent être utiles pour coder certains modèles de conception, mais si vous rencontrez une exception NullPointerException (NPE), cela signifie que vous avez essayé d'utiliser une référence pointant sur une valeur nulle, comme si elle faisait référence à un objet. Puisqu'il n'y a pas de code à exécuter à l'emplacement où cette référence pointe, vous vous retrouvez avec un NPE.
Un NPE est généralement accompagné d'informations indiquant où cette exception a été interceptée. Le moniteur Logcat doit donc contenir la ligne exacte où cette erreur s'est produite. Accédez à cette zone de votre projet et identifiez la référence égale à null. Vous devrez ensuite trouver l'emplacement où la valeur doit être définie et le définir..
le findViewById
méthode peut également renvoyer null si le demandé Vue
introuvable, donc si votre NPE apparaît dans une ligne contenant un findViewById
, vérifiez que vous avez initialisé la mise en page qui contient cette Vue
. Soyez également à l’affût des fautes d’orthographe ou des fautes de frappe pouvant s’être glissées dans votre findViewById
appel, car cela peut également entraîner un NPE.
Pour éviter que des NPE ne se produisent dans votre projet, assurez-vous que tous vos objets sont initialisés avant d'essayer de les utiliser et vérifiez toujours qu'une variable n'est pas nulle avant de demander une méthode ou un champ à partir de cet objet..
Il s’agit d’une erreur qui apparaît sous forme de dialogue sur le périphérique Android ou AVD que vous utilisez pour tester votre application. le Application ne répond pas Une erreur (ANR) se produit lorsque l'interface utilisateur de votre application se fige et ne répond plus aux entrées de l'utilisateur pendant plus de cinq secondes. Cela se produit généralement lorsque votre application tente d'effectuer des opérations longues ou intensives sur le fil principal de l'interface utilisateur d'Android..
Sous Android, le fil principal de l'interface utilisateur est responsable de la distribution de tous les événements d'entrée d'utilisateur vers les widgets d'interface utilisateur appropriés et de la mise à jour de l'interface utilisateur de votre application. Cependant, ce thread ne peut traiter qu'une tâche à la fois. Par conséquent, si vous bloquez le thread principal avec des opérations longues ou intensives, votre interface utilisateur ne répondra plus jusqu'à ce que cette tâche soit terminée..
Si vous rencontrez un message ANR lors du test de votre application, vous devez absolument devez regarder le travail que vous effectuez sur le fil principal. Toutefois, si vous ne rencontrez pas explicitement cette erreur mais que vous remarquez que votre application est parfois lente ou traînante, cela indique que vous êtes sur le point de commettre une erreur ANR et, encore une fois, vous devriez jeter un coup d'œil à l'état actuel. de votre fil d'interface utilisateur.
Pour résoudre les erreurs ANR (et près-Erreurs ANR), vous devez identifier toutes les opérations susceptibles de fonctionner lentement ou nécessitant une puissance de traitement importante, puis les déplacer hors du thread principal. Pour cela, vous créez un thread de travail sur lequel ces opérations peuvent être effectuées sans risque de blocage du thread d'interface utilisateur principal..
Il existe plusieurs méthodes pour créer des threads supplémentaires, mais la solution la plus simple consiste à utiliser un AsynTask
, comme cette classe contient déjà son propre thread de travail et un onPostExecute ()
rappel que vous pouvez utiliser pour communiquer avec le fil principal de l'interface utilisateur d'Android.
Cependant, les tâches asynchrones sont mieux adaptées à l'exécution d'opérations d'arrière-plan courtes. Par conséquent, si vous devez effectuer une opération de longue durée, utilisez un Un service
ou un IntentService
au lieu.
Bien que le déplacement des tâches longues et intensives du thread principal ait le plus grand impact sur les performances de votre application, il est préférable d'effectuer le moins de travail possible sur le thread d'interface utilisateur principal. L'exécution d'une petite quantité de code inutile sur le thread principal peut avoir un impact sur la réactivité de votre application. Par conséquent, une fois que vous avez déplacé avec succès toutes vos opérations intensives et de longue durée, vous devez vérifier s'il existe du code supplémentaire. quitter le fil principal.
Sous Android, vous pouvez mettre à jour votre interface utilisateur à partir du fil principal uniquement. Si vous essayez d'accéder aux éléments d'interface utilisateur à partir d'un autre thread, vous allez rencontrer cette erreur.
Pour résoudre ce problème, identifiez la partie de votre tâche d’arrière-plan qui tente de mettre à jour l’UI et déplacez-la runOnUiThread
, par exemple:
runOnUiThread (new Runnable () @Override public void run () // Mettez à jour votre interface utilisateur //);
Sinon, vous pouvez utiliser un gestionnaire ou effectuer votre travail en arrière-plan dans une AsyncTask, car vous pouvez communiquer avec le thread principal à l'aide de la commande AsyncTask. onPostExecute ()
méthode de rappel. Enfin, si vous passez régulièrement d’un thread à l’autre, vous voudrez peut-être consulter RxAndroid, car cette bibliothèque vous permet de créer un nouveau thread, de planifier le travail à effectuer sur ce thread, puis de poster les résultats sur le thread principal. tous avec seulement quelques lignes de code.
Cette exception est levée lorsque votre application tente d'effectuer des opérations de mise en réseau sur le thread principal, telles que l'envoi de demandes d'API, la connexion à une base de données distante ou le téléchargement d'un fichier. Étant donné que les opérations réseau peuvent prendre beaucoup de temps et de main-d’œuvre, elles risquent fort de bloquer le thread principal. Par conséquent, Android 3.0 (Honeycomb) et les versions ultérieures émettent cette erreur chaque fois que vous essayez de faire une demande réseau sur le thread principal..
Si vous rencontrez un NetworkOnMainThreadException
, puis recherchez le code de réseau en cours d'exécution sur votre thread principal et déplacez-le dans un thread séparé.
Si vous devez faire de fréquentes requêtes réseau, jetez un œil à Volley, une bibliothèque HTTP qui initie ses propres threads d'arrière-plan afin que toutes les requêtes réseau soient effectuées par défaut sur le thread principal..
Cette erreur se produit lorsque vous essayez d'afficher un dialogue après avoir quitté l'activité. Si vous rencontrez ce problème, ouvrez votre activité et assurez-vous de fermer correctement le dialogue en appelant le rejeter()
soit dans votre activité onDestroy ()
ou onPause ()
méthode, par exemple:
@Override protected void onDestroy () super.onDestroy (); if (pDialogue! = null) pDialogue.dismiss ();
Cette erreur se produit lorsque votre application fait une demande de mémoire que le système ne peut pas répondre. Si vous rencontrez ce message d'erreur, commencez par éliminer toutes les erreurs de gestion de la mémoire les plus courantes. Vérifiez que vous vous êtes rappelé de désenregistrer tous vos récepteurs de diffusion et que vous avez arrêté tous vos services. assurez-vous que vous ne tenez pas de références dans des variables de membre statiques et que vous n'essayez pas de charger des bitmaps volumineux.
Si vous avez éliminé toutes les causes évidentes d'un OutOfMemoryError
, vous devrez ensuite aller plus loin et examiner exactement comment votre application alloue de la mémoire, car il est probable qu'il existe quelques zones dans lesquelles vous pouvez améliorer la gestion de la mémoire de votre application..
Android Studio dispose d'une zone complète dédiée à l'analyse de l'utilisation de la mémoire de votre application. Commencez donc par sélectionner Affichage> Fenêtre Outils depuis la barre d’outils Android Studio. À ce stade, vous verrez soit un Moniteur Android ou Android Profiler option, en fonction de la version d'Android Studio que vous avez installée.
Nous avons déjà parlé de l'utilisation du moniteur de mémoire sur ce site Web, mais comme Android Profiler est un nouvel ajout à Android Studio, examinons rapidement ses principales fonctionnalités..
Lorsque vous ouvrez Android Profiler, il commence à enregistrer trois informations automatiquement.
Puisque nous sommes intéressés par la façon dont notre application utilise la mémoire, donnez la Mémoire section un clic, ce qui lancera la Memory Profiler.
Memory Profiler consiste en une chronologie qui affiche les différents types de mémoire actuellement alloués par votre application, par exemple Java, originaire de, et empiler. Au-dessus de ce graphique, vous trouverez une rangée d'icônes que vous pouvez utiliser pour déclencher différentes actions: