web-dev-qa-db-ja.com

Android Studioの最小限の動作するSpotBugsセットアップ

Android用のSpotBugsを設定するにはどうすればよいですか?

公式ドキュメントgradle plugin の設定を試してみましたが、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プロジェクトの最小限の動作設定の例を見せていただけますか?

20
Terry

私は私の側でいくつかのテストを行い、私はそれをこのように機能させることができました:

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

ToYonosの回答に続いて(2018年10月9日);これを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を設定します。サンプル除外ファイルのチェックについては here または here(findbugs-exclude.xmlと同じ)

1
Mr-IDE