Garantissez un code Android de haute qualité avec des outils d'analyse statique

Dans le didacticiel d’aujourd’hui, nous allons apprendre à assurer la qualité du code Android dans nos projets à l’aide d’outils d’analyse de code statique pour Java. Nous allons examiner Checkstyle, FindBugs, PMD et Android Studio Lint, qui sont tous gratuits et ouverts.!

Que sont les outils d'analyse de code statique??

Ce sont des outils qui analysent et analysent votre code source sans l'exécuter. L'objectif est de détecter les vulnérabilités potentielles telles que les bugs et les failles de sécurité. Un analyseur de code statique gratuit et populaire tel que FindBugs vérifie votre code par rapport à un ensemble de règles que votre code devrait respecter: si le code ne respecte pas ces règles, cela signifie que quelque chose ne va pas. Considérez les outils d'analyse de code statique comme un compilateur supplémentaire exécuté avant la compilation finale dans le langage système.  

De nombreux éditeurs de logiciels exigent des projets qu'ils passent des tests d'analyse de code statiques, en plus d'effectuer des révisions de code et des tests unitaires dans le processus de construction. Même les responsables de projets open-source incluent souvent une ou plusieurs étapes d'analyse de code statique dans le processus de construction. Par conséquent, l'apprentissage de l'analyse statique est une étape importante dans la rédaction d'un code de qualité. Sachez que l'analyse de code statique, également appelée test de "boîte blanche", ne doit pas être considérée comme un remplacement du test unitaire de votre code source..

Dans ce tutoriel, nous allons en apprendre davantage sur certains outils d'analyse statique populaires disponibles pour Android et Java. Mais d'abord, voyons quelques-uns des avantages de l'analyse statique.

Avantages

  • Aide à détecter les bugs potentiels que même les tests unitaires ou manuels ont peut-être manqués.
  • Définit les règles spécifiques au projet. Par exemple, l'analyse statique dans le cadre de la chaîne de construction aide les nouveaux arrivants à se familiariser avec les normes de code de leur nouvelle équipe..
  • Vous aide à améliorer votre connaissance d'une nouvelle langue.
  • Analyse tout votre projet, y compris les fichiers que vous n'avez peut-être jamais lus.

Installer

Tous les outils d'analyse de code décrits dans ce didacticiel sont disponibles sous forme de plug-in Gradle. Vous pouvez ainsi créer des tâches Gradle individuelles pour chacun d'entre eux. Utilisons un seul fichier Gradle qui les inclura tous. Mais avant cela, créons un dossier qui contiendra tous nos fichiers pour l'analyse de code statique. 

Ouvrez Android Studio et à l'intérieur du module d'application (dans Projet voir), créez un nouveau dossier et nommez-le Code_Qualité_Outils. Ce dossier contiendra les fichiers XML des outils d’analyse de code, ainsi qu’un fichier Gradle., qualité, qui exécutera nos tâches d'analyse statiques. 

Enfin, visitez votre build.gradle dans le dossier du module d'application et incluez cette ligne à la fin du fichier:

appliquer à partir de: '/code_quality_tools/quality.gradle'

Ici, notre qualité.graduer Le script Gradle est appliqué avec une référence à son emplacement de fichier local. 

Style de contrôle

Checkstyle applique ces règles en analysant votre code source et en les comparant à des normes ou conventions de codage connues, en fonction des règles que vous spécifiez dans un fichier XML pour appliquer une norme de codage à votre projet.. 

Checkstyle est un outil open source activement géré par la communauté. Cela signifie que vous pouvez créer vos propres contrôles personnalisés ou modifier ceux existants pour répondre à vos besoins. Par exemple, Checkstyle peut vérifier les noms des constantes (final, static ou les deux) dans vos classes. Si vos noms de constants ne respectent pas la règle de majuscule avec des mots séparés par un tiret bas, le problème sera signalé dans le rapport final.. 

// Chaîne statique finale privée incorrecte myConstant = "myConstant"; // corrige la chaîne statique finale privée MY_CONSTANT = "myConstant";

Intégrer le style de contrôle

Je vais vous montrer comment intégrer Checkstyle à notre projet Android Studio et vous présenter un exemple pratique..

Premièrement, nous devons créer nos règles de codage. À l'intérieur style de contrôle.xml, nous créons des règles de configuration Checkstyle qui seront exécutées avec notre code.

                  

Dans le code ci-dessus, nous incluons les règles ou les contrôles que nous voulons que Checkstyle valide dans notre code source. Une règle est AvoidStarImport qui, comme son nom l'indique, vérifie si votre code source inclut une instruction d'importation telle que java.util. *. (Au lieu de cela, vous devez spécifier explicitement le paquet à importer, par exemple. java.util.Observable.) 

Certaines règles ont des propriétés, que nous pouvons définir comme nous l'avons fait pour ParameterNumber, ce qui limite le nombre de paramètres d'une méthode ou d'un constructeur. Par défaut, la propriété max est 7, mais nous avons changé à 6 à la place. Jetez un coup d'œil aux autres chèques sur le site Web Checkstyle.

Pour exécuter cette vérification, nous devons créer une tâche Gradle. Alors visitez le qualité déposer et créer une tâche appelée checkstyle:

apply plugin: tâche 'checkstyle' checkstyle (type: Checkstyle) description 'Code de vérification' groupe 'vérification' fichier de configuration ('./ code_quality_tools / checkstyle.xml') la source 'src' inclut '** / *. java' exclure '** / gen / **' classpath = files () ignoreFailures = false

Notez que dans le code ci-dessus, nous avons d’abord appliqué le plugin Checkstyle Gradle. Nous lui avons donné une description et l'avons ajoutée à un groupe de Gradle déjà prédéfini appelé vérification. 

Les propriétés clés de la tâche Checkstyle Gradle qui nous concerne sont les suivantes: 

  • configFile: le fichier de configuration Checkstyle à utiliser.
  • IgnorerFailures: autoriser ou non la compilation à continuer s'il y a des avertissements.
  • comprendre: l'ensemble des motifs d'inclusion.
  • exclure: l'ensemble des motifs d'exclusion. Dans ce cas, nous n'analysons pas les classes générées. 

Enfin, vous pouvez exécuter le script Gradle en visitant la fenêtre de l'outil Gradle sur Android Studio, en ouvrant le vérification groupe, puis en cliquant sur style de contrôle exécuter la tâche. 

Une autre façon consiste à utiliser la ligne de commande: 

grade checkstyle

Une fois la tâche terminée, un rapport est généré, disponible à l'adresse suivante: module d'application> construction> rapports> checkstyle. Tu peux ouvrir checkstyle.html voir le rapport. 

Un plugin Checkstyle est disponible gratuitement pour Android Studio ou IntelliJ IDEA. Il offre une analyse en temps réel de vos fichiers Java. 

PMD

PMD est un autre outil d'analyse de code source ouvert qui analyse votre code source. Il trouve des failles communes telles que des variables inutilisées, des blocs de capture vides, la création d'objets inutiles, etc. PMD propose de nombreux jeux de règles. Voici un exemple de règle faisant partie du jeu de règles de conception:

  • SimplifyBooleanExpressions: évite les comparaisons inutiles dans les expressions booléennes qui compliquent le code simple. Un exemple: 
public class Bar // peut être simplifié à // bar = isFoo (); barre booléenne privée = (isFoo () == true); public isFoo () return false;

PMD est configuré avec le pmd.xml fichier. À l'intérieur, nous inclurons des règles de configuration telles que celles pour Android, le nommage et la conception.. 

  Ensemble de règles personnalisé pour l'application Android .* / R.java .* / gen /.*                 

Comme nous l'avons fait pour Checkstyle, nous devons également créer une tâche PMD Gradle pour que le contrôle soit exécuté à l'intérieur de la machine. qualité fichier. 

apply plugin: tâche 'pmd' pmd (type: Pmd) description 'Exécuter PMD' groupe 'vérification' ruleSetFiles = fichiers ("./ code_quality_tools / pmd.xml") source "src" inclure "** / *. java" exclure les rapports '** / gen / **' xml.enabled = false html.enabled = true ignoreFailures = false

PMD est également disponible en tant que plugin Gradle. 

Les propriétés clés de la tâche que nous avons créée sont les suivantes: 

  • ruleSetFiles: Les fichiers d'ensemble de règles personnalisés à utiliser.
  • la source: Le source de cette tâche.
  • rapports: Les rapports à générer par cette tâche.

Enfin, vous pouvez exécuter le script Gradle en visitant la fenêtre de l'outil Gradle, en ouvrant le dossier du groupe de vérification, puis en cliquant sur pmd pour exécuter la tâche. Ou vous pouvez l'exécuter via la ligne de commande:

gradle pmd

Un rapport sera également généré après l'exécution de la tâche disponible à l'adresse module d'application> construction> rapports> pmd. Il existe également un plug-in PMD disponible pour IntelliJ ou Android Studio que vous pouvez télécharger et intégrer si vous le souhaitez.. 

FindBugs

FindBugs est un autre outil d'analyse statique gratuit qui analyse votre classe à la recherche de problèmes potentiels en vérifiant vos codes octets par rapport à une liste connue de modèles de bogues. Certains d'entre eux sont:

  • La classe définit hashCode () mais pas equals (): Une classe implémente la méthode hashCode () mais pas equals () - deux instances peuvent donc être égales mais ne pas avoir les mêmes codes de hachage. Cela tombe dans la catégorie des mauvaises pratiques. 
  • Mauvaise comparaison de la valeur int avec une constante longue: Le code compare une valeur int avec une constante longue en dehors de la plage de valeurs pouvant être représentée sous la forme d'une valeur int. Cette comparaison est vide et donnera peut-être un résultat inattendu. Cela tombe dans la catégorie de correction. 
  • TestCase n'a pas de tests: class est une JUnit Cas de test mais n'a mis en œuvre aucune méthode de test. Ce modèle est également dans la catégorie de correction. 

FindBugs est un projet open-source, vous pouvez donc voir, contribuer ou suivre la progression du code source sur GitHub.. 

dans le findbugs-exclude.xml fichier, nous voulons empêcher FindBugs d'analyser certaines classes (à l'aide d'expressions régulières) dans nos projets, telles que les classes de ressources générées automatiquement et les classes de manifeste générées automatiquement. De plus, si vous utilisez Dagger, nous voulons que FindBugs ne vérifie pas les classes de Dagger générées. On peut aussi dire à FindBugs d’ignorer certaines règles si on veut. 

                 

Et enfin, nous allons inclure le findbugs tâche dans qualité:

apply plugin: tâche 'findbugs' findbugs (type: FindBugs) description 'Exécuter findbugs' groupe 'vérification' classes = fichiers ("$ project.buildDir / intermediates / classes") source 'src' chemin de classe = fichiers () effort 'max 'reportLevel = "high" fichier excludeFilter (' ./ code_quality_tools / findbugs-exclude.xml ') rapports xml.enabled = false html.enabled = true ignoreFailures = false

Dans la première ligne ci-dessus, nous avons appliqué FindBugs en tant que plug-in Gradle, puis créé une tâche appelée findbugs. Les propriétés clés du findbugs Les tâches qui nous intéressent vraiment sont: 

  • Des classes: les classes à analyser.
  • effort: le niveau d'effort d'analyse. La valeur spécifiée doit être l’un des mindéfaut, ou max.  Sachez que des niveaux plus élevés augmentent la précision et trouvent plus de bogues au détriment du temps d'exécution et de la consommation de mémoire..
  • reportLevel: le seuil de priorité pour signaler des bugs. Si la valeur est faible, tous les bogues sont signalés. Si défini sur moyen (par défaut), les bogues de priorité moyenne et élevée sont signalés. Si la valeur est élevée, seuls les bogues de priorité élevée sont signalés..
  • exclureFiltre: le nom de fichier d'un filtre spécifiant les bugs à exclure du rapport, que nous avons déjà créé. 

Vous pouvez ensuite exécuter le script Gradle en visitant la fenêtre de l'outil Gradle, en ouvrant le dossier du groupe de vérification, puis en cliquant sur findbugs pour exécuter la tâche. Ou lancez le depuis la ligne de commande:

gradle findbugs

Un rapport sera également généré à l'issue de l'exécution de la tâche. Ce sera disponible à module d'application> construction> rapports> findbugs. Le plugin FindBugs est un autre plugin disponible gratuitement pour le téléchargement et l'intégration avec IntelliJ IDEA ou Android Studio..

Lint Android

Lint est un autre outil d'analyse de code, mais celui-ci est fourni avec Android Studio par défaut. Il vérifie les fichiers sources de votre projet Android pour rechercher d'éventuels bogues et optimise son exactitude, sa sécurité, ses performances, sa convivialité, son accessibilité et son internationalisation.. 

Pour configurer Lint, vous devez inclure le lintOptions bloquer dans votre niveau de module build.gradle fichier:

lintOptions abortOnError false quiet true fichier lintConfig ('./ code_quality_tools / lint.xml')

Les principales options de Lint qui nous intéressent sont: 

  • abortOnError: si lint doit définir le code de sortie du processus si des erreurs sont détectées.
  • silencieux: désactiver ou non les rapports d'avancement de l'analyse.
  • lintConfig: le fichier de configuration par défaut à utiliser.

Votre lint.xml Le fichier peut inclure des problèmes que vous souhaitez que Lint ignore ou modifie, comme dans l'exemple ci-dessous:

      

Vous pouvez exécuter Lint manuellement à partir d’Android Studio en cliquant sur le bouton Analyser menu, choix Inspecter le code…  (le champ d’inspection est l’ensemble du projet), puis en cliquant sur le bouton D'accord bouton pour continuer.

Vous pouvez également exécuter Lint en visitant la fenêtre de l'outil Gradle, en ouvrant le vérification groupe, puis en cliquant sur peluche. Enfin, vous pouvez l'exécuter via la ligne de commande.

Sous Windows:

peluches

Sous Linux ou Mac:

./ peluches

Un rapport sera également généré à la fin de l'exécution de la tâche, disponible à l'adresse suivante: module d'application> construction> sorties> lint-results.html.

Bonus: StrictMode

StrictMode est un outil de développement qui permet d’empêcher les développeurs de votre projet d’effectuer des E / S flash ou réseau accidentelles sur le thread principal, car cela pourrait entraîner une lenteur ou une absence de réponse de l’application. Cela aide également à empêcher les boîtes de dialogue ANR (App Not Responding) d’apparaître. Une fois les problèmes de StrictMode corrigés, votre application deviendra plus réactive et l’utilisateur bénéficiera d’une expérience plus fluide. StrictMode utilise deux ensembles de stratégies pour appliquer ses règles:

  • Stratégies de VM: protège contre les mauvaises pratiques de codage telles que la non fermeture SQLiteCursor objets ou tout Fermable objet qui a été créé. 
  • Stratégies de threads: recherche des opérations telles que les E / S flash et les E / S réseau exécutées sur le thread d'application principal plutôt que sur un thread d'arrière-plan.. 
if (BuildConfig.DEBUG) StrictMode.setThreadPolicy (nouveau StrictMode.ThreadPolicy.Builder () .detectDiskReads () .detectDiskWrites () .detectNetwork () // ou .detectAll () pour tous les problèmes détectables. PenaltyLog () enregistré violations du journal système… build ()); StrictMode.setVmPolicy (nouveau StrictMode.VmPolicy.Builder () .detectLeakedSqlLiteObjects () .detectLeakedClosableObjects () .penaltyLog () .penaltyDeath () // Bloque le processus entier en violation…); 

Le code ci-dessus peut se trouver dans votre application, votre activité ou dans un autre composant d'application. onCreate () méthode. 

Vous pouvez en apprendre plus sur StrictMode ici sur Envato Tuts+. 

Vous trouverez un exemple de projet Android mettant en œuvre tout ce qui précède, y compris les ensembles de règles des outils d'un projet Android typique, dans le dépôt GitHub de cet article..

Conclusion

Dans ce didacticiel, vous avez appris à garantir un code Android de haute qualité à l'aide d'outils d'analyse de code statiques: description de leur nature, avantages de leur utilisation et utilisation de Checkstyle, FindBugs, Lint, PMD et StrictMode dans votre application. Allez-y et essayez ces outils. Vous pourriez découvrir dans votre code des problèmes inattendus..

En attendant, découvrez certains de nos autres cours et tutoriels sur le développement d'applications Android.!