Comment améliorer la qualité de code d’un projet Android avec Sonar ?

Le remboursement de la dette technique liée au développement d’un logiciel prend du temps. Cela demande d’apprendre les bonnes pratiques pour le futur, mais aussi d’épurer le passif.

Every minute spent on not-quite-right code counts as interest on that debt » Ward Cunningham – 1992

Ward Cunningham (connu pour être le créateur du concept de wiki) utilise l’analogie de la dette financière pour mettre en évidence que, comme les intérêts s’accumulent lorsque l'on contracte une dette, le coût de développement augmente si le logiciel comporte des imperfections techniques. Le remboursement de la dette technique liée au développement d’un logiciel prend du temps. Cela demande d’apprendre les bonnes pratiques pour le futur, mais aussi d’épurer le passif. Avant d’entreprendre des actions qui vont vous permettre de réduire votre dette technique, il faut d’abord la mesurer !

En théorie, ça se passe bien

Il m’arrive souvent de prendre en charge la maintenance évolutive d’applications qui ont succédé à plusieurs équipes différentes et qu’il faut faire évoluer dans le temps.

En général, plusieurs développeurs ont travaillé sur ces applications et n’ont pas toujours eu à suivre les mêmes conventions de codage. L’architecture se trouve dégradée car l’enchaînement de fonctionnalités ne respecte pas toujours l’architecture initiale. Il en résulte donc dans le temps une dette technique importante liée à cet historique.

SonarQube était déjà utilisé dans l’agence SQLI Lyon pour certains projets iOS. C’est pourquoi j’ai mis en place cet outil sur l’ensemble de mes projets Android. Très puissant, cet outil permet de mesurer la qualité de votre projet de plusieurs façons : respect des règles de code, documentation du code, analyse des tests unitaires mis en place, et duplication du code.
SonarQube est une plateforme open source développée par SonarSource permettant de mesurer la qualité du code source en continu. SonarQube propose des rapports sur le code dupliqué, les normes de codage, les tests unitaires, la complexité du code, les commentaires, les bugs et les vulnérabilités de sécurité.

L’inspection de la dette technique est catégorisée en différentes mesures : Fiabilité, Sécurité et Maintenabilité avec pour chacune, une note attribuée en fonction de la qualité de cette mesure : A, B, C, D, E.

Le résultat de la maintenabilité d’un projet : A !

Quant aux métriques de dette technique, chaque règle rajoute une durée d’effort allant de 5 minutes à 8 heures.

Les règles du plugin Kotlin

Lors de l’analyse d’un projet sous SonarQube, un profil de qualité est appliqué en fonction du langage détecté. Ce profil contient l’ensemble des règles qui vont servir à identifier les points à corriger. Vous pouvez modifier le profil afin de répondre aux besoins spécifiques d’un projet. Il existe des profils pour Java et Kotlin, mais aussi pour C, C++, C#, PHP, Objective C et bien d’autres. À l’heure actuelle, SonarQube supporte plus de 25 langages et fonctionne pour tous les projets Android.

Ces règles vous permettront de voir les problèmes et erreurs dans votre code. Elles sont triées en 3 catégories :

  • Bug : Ce sont les bugs bloquants de votre code. Ils peuvent empêcher la compilation ou planter le programme.
  • Vulnérabilité: Ce sont des erreurs pouvant nuire à la sécurité de votre code.
  • Code smell: il s’agit des parties inutiles de votre code, par exemple des variables initialisées mais non utilisées.

Ces différentes règles sont catégorisées ensuite suivant leur sévérité : bloquant, critique, majeure, mineure et informative.

ET MAINTENANT PASSONS À LA PRATIQUE !

Prêt à passer à la pratique ? Nous allons maintenant regarder comment mettre en place SonarQube dans votre projet Android ! Pour cela rien de très compliqué :

1 – INSTALLER LE SERVEUR

Pour commencer, il faut installer le serveur SonarQube qui se trouve sur la page de téléchargement du site web.

Ensuite, dézippez le fichier dans le répertoire de votre choix, puis lancez le serveur avec les commandes suivante sur Windows (SONARQUE_HOME étant le dossier de votre fichier dézippé) :

<SONARQUBE_HOME>\bin\windows-x86-xx\StartSonar.bat

Sur les autres systèmes d’exploitation :

<SONARQUBE_HOME>/bin/[OS]/sonar.sh console

2 – INSTALLER LE PLUGIN KOTLIN

Dans le cas d’un projet Kotlin, il faudra ajouter le plugin. Téléchargez le plugin puis placez le fichier dans le dossier de plugins :

<Dossier>/extensions/plugins

Dans ce dossier se trouvent déjà d’autres plugins existants (Java, JavaScript, Python, PHP …).

 

3 – CONFIGURER GRADLE

Votre serveur n’est pas encore lancé mais il est prêt à analyser un projet Android, que cela soit sur Kotlin ou Java. Il reste à ajouter le plugin Sonar et configurer ses propriétés dans votre projet Android. A cet effet, il suffit d’ajouter la configuration suivante dans le fichier Gradle de l’application.

Pour Gradle 2.1 et les versions supérieures :

plugins {
    id "org.sonarqube" version "2.6.2"
}

Pour les versions Gradle inférieure à 2.1 :

apply plugin: 'org.sonarqube'     buildscript{
    repositories {
        maven { url 'https://plugins.gradle.org/m2/' }
    }
    dependencies{
        classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:2.6.2"
    }
}

Une fois le plugin Gradle Sonar importé, une tâche sonarqube doit être créée avec différentes propriétés :

sonarqube {
    properties{
        property "sonar.host.url", "http://localhost:9000"        property "sonar.jdbc.url", "jdbc:mysql://localhost:3306/sonar"
        property "sonar.jdbc.driverClassName", "com.mysql.jdbc.Driver"
        property "sonar.jdbc.username", "*****"
        property "sonar.jdbc.password", "*****"

        property "sonar.projectName", "Project Name"
        property "sonar.projectKey", "project_key"
        property "sonar.projectVersion", android.defaultConfig.versionName
        property "sonar.language", "kotlin"
        property "sonar.sources", "src"           property "sonar.java.binaries", "build"        }
}

Ces propriétés propres à Sonar permettent de configurer l’analyse de votre projet :  

sonar.host.url : URL de votre serveur Sonar
sonar.jdbc.url : URL de la base de données
sonar.jdbc.driverClassName : Type de la base de données
sonar.jdbc.username / sonar.jdbc.password : Login et mot de passe de la base de données
sonar.projectName : Le nom d’affichage de votre projet sur l’interface web
sonar.projectKey : Une clef unique pour chaque projet
sonar.projectVersion : La version de votre projet
sonar.language : Définissez la langue du code source à analyser : « java » ou « kotlin ». Si rien n’est défini, une analyse multilingue sera déclenchée.
sonar.sources : Le chemin vers les fichiers sources de votre projet
sonar.java.binaries : Chemins vers les répertoires contenant les fichiers de bytecode compilés correspondant à vos fichiers sources.
sonar.language : Définissez la langue du code source à analyser : « java » ou « kotlin ». Si rien n’est défini, une analyse multilingue sera déclenchée.
sonar.sources : Le chemin vers les fichiers sources de votre projet
sonar.java.binaries : Chemins vers les répertoires contenant les fichiers de bytecode compilés correspondant à vos fichiers sources.

4 – LANCER L’ANALYSE DE VOTRE PROJET

Votre projet Android est configuré, il vous reste à lancer une analyse de votre projet en exécutant la tâche Gradle Sonarqube. Cette tâche va exécuter la commande Sonar qui va effectuer l’analyse puis envoyer les résultats au serveur.

Si le scan s’est bien déroulé, vous pourrez retourner sur l’interface web de SonarQube et y voir votre application dans la liste des projets.

Une fois le scan effectué, les informations sont automatiquement mises à jour et stockées dans la base de données SonarQube.

 

5 – UTILISER LE SERVEUR POUR AMÉLIORER VOTRE CODE

La page « Overview » vous donne une vue d’ensemble de votre projet. Vous y trouverez le nombre de bugs potentiellement détectés sur votre application, mais aussi la métrique de dette technique en nombre de jours. Deux pourcentages sont aussi présents sur cette page qui vous donneront une vision globale du taux de couverture des tests unitaires, ainsi que le pourcentage de duplication du code.

Afin d’appliquer les corrections nécessaires à votre projet, vous pouvez vous rendre sur la page « Issues » afin de filtrer les erreurs par types ou sévérités. Sur le volet de droite s’affichent les règles à appliquer pour chaque classe Java.

En cliquant sur une règle (ici encadrée de rouge), la classe s’ouvre et affiche les corrections à appliquer.

Ici deux branches dans une structure conditionnelle ont la même implémentation. Ainsi, la correction à appliquer sera de fusionner les deux branches en une seule :

if (ratingStr.contains(".0") || ratingStr.contains(",0")) {   ratingStr = ratingStr.replace(",0", "");   }

 

CONCLUSION

En appliquant chaque correctif sur les différentes règles, vous réduisez petit à petit votre dette technique !

Les analyses peuvent être bien sûr lancées de façon automatique sur un projet géré par des outils de versioning GIT, couplés à des outils d’intégration continue comme Jenkins ou Gitlab CI.

Voilà de quoi remettre de l’ordre dans un projet de développement et mettre en application de bonnes pratiques de développement sur une application Android au sein d’une équipe de plusieurs personnes.

 

Article initialement paru dans le magazine Programmez! n°227