web-dev-qa-db-fra.com

Configuration minimale de SpotBugs fonctionnant pour Android Studio

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?

20
Terry

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')
}
7
ToYonos

Dans la continuité de la réponse de ToYonos (9 octobre 2018); Utilisez ceci pour Android Studio 3.4:

project/build.gradle

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
    }
}

projet/application/build.gradle

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)

1
Mr-IDE