Минимальная рабочая установка SpotBugs для Android Studio - PullRequest
0 голосов
/ 04 октября 2018

Как настроить SpotBugs для Android?

Я пытался следовать официальной документации и плагину gradle , но настройка для Android не завершенаи сбивает с толку, и не работает.

Я попробовал следующую настройку.

build.gradle (проект):

buildscript {
  repositories {
    // ...
    maven {
      url "https://plugins.gradle.org/m2/"
    }
  }
  dependencies {
    // ...
    classpath "gradle.plugin.com.github.spotbugs:spotbugs-gradle-plugin:1.6.4"
  }
}

build.gradle (приложение):

//...
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?
}

Я пытался запустить его с ./gradlew spotbugsMain, но задача gradle отсутствует.
Должен ли я добавить задачу вручную?Как мне это сделать?

Не могли бы вы показать пример минимальной рабочей настройки для проекта Android?

Ответы [ 2 ]

0 голосов
/ 05 июня 2019

Исходя из ответа ToYonos (9 октября 2018 г.);Используйте это для 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
    }
}

project / app / 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
    }
}

Вы можете создать отчет для своегоотладка сборки путем запуска задачи gradle: ./gradlew spotbugsMain

Важно использовать classes = files("$project.buildDir/intermediates/javac"), в противном случае вы получите ошибку "java.io.IOException: No files to analyze could be opened" - см. Findbugs завершается с ошибкой"java.io.IOException: Не удалось открыть файлы для анализа"

Вам также потребуется включить отчет HTML и отключить отчет XML, чтобы увидеть читаемый человеком формат.

Чтобы исключить какой-либо сгенерированный класс из анализа, установите excludFilter.Для примера исключите файл, отметив здесь или здесь (так же, как findbugs-exclude.xml)

0 голосов
/ 09 октября 2018

Я провел несколько тестов на своей стороне, и мне удалось заставить его работать так:

1) Переместите объявление sourceSets за пределы блока android.Оставьте это пустым, это только для генерации задач spotbugsMain, это не повлияет на глобальную сборку Android.

android {
   // ...
}

sourceSets {
    main {
        java.srcDirs = []
    }
}

2) Сохраните блок spotbugs и настройте задачи SpotBugsTask следующим образом:

tasks.withType(com.github.spotbugs.SpotBugsTask) {
    classes = files("$projectDir.absolutePath/build/intermediates/classes/debug")
    source = fileTree('src/main/java')
}

Он будет генерировать отчеты в app/build/findbugsReports

Важно:

Работает только с командой ./gradlew build, ./gradlew spotbugsMain не будет работать, так как проект должен быть построен до

Вы можете исправить это, добавив assemble зависимость:

tasks.withType(com.github.spotbugs.SpotBugsTask) {
    dependsOn 'assemble'
    classes = files("$projectDir.absolutePath/build/intermediates/classes/debug")
    source = fileTree('src/main/java')
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...