Comment configurer SpotBugs pour Android?
J'ai essayé de suivre le documentation officielle et celui du plugin gradle , mais la configuration pour Android est incomplète et déroutante, et ne l'a pas fait travail.
J'ai essayé la configuration suivante.
build.gradle (projet):
buildscript {
repositories {
// ...
maven {
url "https://plugins.gradle.org/m2/"
}
}
dependencies {
// ...
classpath "gradle.plugin.com.github.spotbugs:spotbugs-gradle-plugin:1.6.4"
}
}
build.gradle (application):
//...
apply plugin: "com.github.spotbugs"
Android {
// ...
sourceSets {
main {
Java.srcDirs = ['src/main/Java']
}
}
}
// ...
spotbugs {
toolVersion = "3.1.3"
ignoreFailures = true
reportsDir = file("$project.buildDir/findbugsReports")
effort = "max"
reportLevel = "high"
}
tasks.withType(com.github.spotbugs.SpotBugsTask) {
// What do I need to do here?
}
J'ai essayé de l'exécuter avec ./gradlew spotbugsMain
, mais la tâche gradle est manquante.
Suis-je censé ajouter la tâche manuellement? Comment je fais ça?
Pourriez-vous me montrer un exemple d'une configuration de travail minimale pour un projet Android?
J'ai fait quelques tests de mon côté et j'ai réussi à le faire fonctionner comme ceci:
1) Déplacez la déclaration sourceSets
en dehors du bloc Android
. Laissez-le vide, c'est juste pour la génération de tâches spotbugsMain
, cela n'aura pas d'impact sur la construction globale Android.
Android {
// ...
}
sourceSets {
main {
Java.srcDirs = []
}
}
2) Conservez votre bloc spotbugs
et configurez les tâches SpotBugsTask
comme ceci:
tasks.withType(com.github.spotbugs.SpotBugsTask) {
classes = files("$projectDir.absolutePath/build/intermediates/classes/debug")
source = fileTree('src/main/Java')
}
Il générera des rapports dans app/build/findbugsReports
Important:
Cela ne fonctionne qu'avec le ./gradlew build
commande, ./gradlew spotbugsMain
ne fonctionnera pas car le projet doit être construit avant
Vous pouvez corriger cela en ajoutant une dépendance assemble
:
tasks.withType(com.github.spotbugs.SpotBugsTask) {
dependsOn 'assemble'
classes = files("$projectDir.absolutePath/build/intermediates/classes/debug")
source = fileTree('src/main/Java')
}
Dans la continuité de la réponse de ToYonos (9 octobre 2018); Utilisez ceci pour Android Studio 3.4:
buildscript {
repositories {
google()
jcenter()
maven {
url 'https:// maven url 1'
}
maven {
url "https://plugins.gradle.org/m2/" // For SpotBugs
}
}
dependencies {
classpath '...'
classpath "gradle.plugin.com.github.spotbugs:spotbugs-gradle-plugin:2.0.0" // For SpotBugs
}
}
apply plugin: 'com.Android.application'
apply plugin: '...'
apply plugin: "com.github.spotbugs"
dependencies {
...
}
// For SpotBugs to create 'spotbugsMain' gradle task
sourceSets {
main {
Java.srcDirs = []
}
}
spotbugs {
ignoreFailures = true
reportsDir = file("$project.buildDir/SpotBugsReports")
effort = "max"
reportLevel = "high"
}
tasks.withType(com.github.spotbugs.SpotBugsTask) {
dependsOn 'assembleDebug'
classes = files("$project.buildDir/intermediates/javac") // Important to use this path
excludeFilter = file("$project/spot-bugs-exclude.xml")
source = fileTree('src/main/Java')
reports {
// Enable HTML report only
html.enabled = true
xml.enabled = false
}
}
Vous pouvez générer un rapport pour votre version de débogage en exécutant la tâche gradle: ./gradlew spotbugsMain
Il est important d'utiliser classes = files("$project.buildDir/intermediates/javac")
, sinon vous obtiendrez une erreur "Java.io.IOException: No files to analyze could be opened"
- voir Findbugs échoue avec "Java.io.IOException: aucun fichier à analyser n'a pu être ouvert"
Vous devrez également activer le rapport HTML et désactiver le rapport XML pour voir un format lisible par l'homme.
Pour exclure une classe générée de l'analyse, définissez excludFilter
. Pour un exemple de fichier d'exclusion, vérifiez ici ou ici (identique à findbugs-exclude.xml)