Code Monkey home page Code Monkey logo

monits / static-code-analysis-plugin Goto Github PK

View Code? Open in Web Editor NEW
39.0 16.0 11.0 1.26 MB

A plugin to simplify Static Code Analysis on Gradle. Not restricted to, but specially useful, in Android projects, by making sure all analysis can access the SDK classes.

License: Apache License 2.0

Shell 0.12% Groovy 99.05% Java 0.82%
static-code-analysis static-analysis code-analysis gradle pmd findbugs checkstyle cpd code-quality linter android-lint android spotbugs

static-code-analysis-plugin's Introduction

Static Code Analysis

Build Status Download

Static Code Analysis wraps around Checkstyle, Spotbugs, PMD and CPD, offering new features and extensions to the encapsulated plugins, making it easier to use them and providing better results with minimum effort.

Out of the box, with just applying the plugin you get:

  • Improved build performance. Spotbugs and PMD will ignore changes to autogenerated Android files (R.class and BuildConfig.class)
  • Android Lint task is reconfigured to detect when it's up-to-date and cache results
  • Better PMD and Spotbugs analysis, allowing both tools to look into Android's SDK classes when performing analysis.
  • More detectors, by automatically including:
  • Automatically use the latest available version of each tool compatible with the used Gradle version. Just updating Gradle will introduce newer tools.
  • Checkstyle and Spotbugs support remote file configuration, which they normally don't.
  • Easy configuration through DSL.
  • Easily and reliably include custom Android Lint rules accross teams and CI servers.
  • Backporting of fixes and improvements from later Gradle versions (in case you can't update)
  • Fully compatible with the use of Android's build cache.

Adding it to your project

We are on the Grade Plugin Portal, so you can simply do:

plugins {
  id 'com.monits.staticCodeAnalysis' version '3.1.1'
}

or, you could also do

buildscript {
  repositories {
    maven {
      url 'https://plugins.gradle.org/m2/'
    }
  }
  dependencies {
    classpath 'com.monits:static-code-analysis-plugin:3.1.1'
  }
}

apply plugin: 'com.monits.staticCodeAnalysis'

or, directly from jcenter

buildscript {
  repositories {
    jcenter()
  }
  dependencies {
    classpath 'com.monits:static-code-analysis-plugin:3.1.1'
  }
}

apply plugin: 'com.monits.staticCodeAnalysis'

Compatibility

Plugin Version Gradle Version Android Gradle Plugin Version
3.x 5.6+ 3.3.0+
2.6.12 2.3 up to 5.6.x 1.1.x up to 3.5.x

Prior to version 3.0.0 Findbugs was used instead of Spotbugs.

DSL

Configuring Static Code Analysis is very simple and intuitive thanks to its DSL. You can choose which encapsulated plugin to run and set its configuration files. Here is a quick example

staticCodeAnalysis {
    spotbugs = true
    checkstyle = true
    pmd = true
    cpd = true
    androidLint = true

    ignoreErrors = true

    // default rules
    spotbugsExclude = "$project.rootProject.projectDir/config/spotbugs/excludeFilter.xml"
    checkstyleRules = 'https://raw.githubusercontent.com/Monits/static-code-analysis-plugin/staging/defaults/checkstyle/checkstyle-cache.xml'
    pmdRules = [ 'https://raw.githubusercontent.com/Monits/static-code-analysis-plugin/staging/defaults/pmd/pmd.xml',
        'https://raw.githubusercontent.com/Monits/static-code-analysis-plugin/staging/defaults/pmd/pmd-android.xml' ]

    androidLintConfig = 'https://raw.githubusercontent.com/Monits/static-code-analysis-plugin/staging/defaults/android/android-lint.xml'

    sourceSetConfig {
        test { // or the name of any other sourceset
            // use a more relaxed ruleset
            checkstyleRules = 'config/checkstyle/test-checkstyle.xml'
            spotbugsExclude = 'config/spotbugs/test-spotbugs.xml'
            pmdRules = [ 'config/pmd/test-pmd.xml',
                'https://raw.githubusercontent.com/Monits/static-code-analysis-plugin/staging/defaults/pmd/pmd-android.xml' ]
        }
    }
}

By default, all plugins are applied, errors will not fail the build, and rules and exclusions will be taken from this repository's latest defaults

Prior to version 3.0.0 Findbugs was used instead of Spotbugs. If using the old version, the DSL is equivalent, but uses findbugs instead of spotbugs for all properties.

All v2.x Findbugs DSL properties are automatically maped to Spotbugs in v3.x for easier upgrading

Rules used by PMD, Spotbugs and Checkstyle can be overriden per-sourceset under the sourceSetConfig block.

To include custom lint rules, you can simply include the jars as dependencies under androidLint. For instance, you could include Monits' Android Linters by adding:

dependencies {
    androidLint 'com.monits:android-linters:1.+'
}

Tasks

The plugin will add the following tasks:

  • cpd
  • checkstyle, depends on:
    • a checkstyleSourcesetname task per source-set (checkstyleMain, checkstyleTest, so on).
  • spotbugs, depends on:
    • a spotbugsSourcesetname task per source-set (spotbugsMain, spotbugsTest, so on).
  • pmd, depends on:
    • a pmdSourcesetname task per source-set (pmdMain, pmdTest, so on).

Prior to version 3.0.0 Findbugs was used instead of Spotbugs. The old findbugs* tasks are still available and map to the corresponding spotbugs* task

All tasks, are hooked to be run as part of the check task of the Java Plugin.

Contributing

As always feel free to contribute in any shape or form, we look forward to your feedback!.

Suppressing warnings

If you re seeing things being reported which you think shouldn't it could be one of two things:

  1. It's a false-positive. The tool is convinced of a violation that is simply not there. These should be reported to the tool's developers in a Github issue.
  2. You have found yourself in a corner case, where the rule, even 'though correct, doesn't really apply to a particular snippet of code. These should be absolute exceptions, if you find yourself in this scenario all the time, consider modifying the set of applied rules.

Since every tool has its own suppression mechanism, you should refer to its documentation:

Copyright and License

Copyright 2010-2017 Monits S.A.

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in compliance with the License. You may obtain a copy of the License at:

http://www.apache.org/licenses/LICENSE-2.0

static-code-analysis-plugin's People

Contributors

barriosnahuel avatar dtecheira avatar jsotuyod avatar martofeld avatar martupuri avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

static-code-analysis-plugin's Issues

HTML Reporting is not working

Hi

I don't have any other choice other than creating an issue.

I checked the source and found you guys disabling HTML reporting. Any specific reason for that?

Help me to get a report in HTML for PMD and Checkstyle. For Findbugs it works if just config like this but not for others

tasks.withType(FindBugs) {
    reports {
        xml.enabled = false
        html.enabled = true
    }
}

Proyectos no encuentran buildToolsVersion desde la versión 1.6.2

Failed to notify ProjectEvaluationListener.afterEvaluate(), but primary configuration failure takes precedence.
java.lang.IllegalStateException: buildToolsVersion is not specified.
    at com.google.common.base.Preconditions.checkState(Preconditions.java:176)
    at com.android.build.gradle.BasePlugin.createAndroidTasks(BasePlugin.java:599)
    at com.android.build.gradle.BasePlugin$10$1.call(BasePlugin.java:566)
    at com.android.build.gradle.BasePlugin$10$1.call(BasePlugin.java:563)
    at com.android.builder.profile.ThreadRecorder$1.record(ThreadRecorder.java:55)
    at com.android.builder.profile.ThreadRecorder$1.record(ThreadRecorder.java:47)
    at com.android.build.gradle.BasePlugin$10.execute(BasePlugin.java:562)
    at com.android.build.gradle.BasePlugin$10.execute(BasePlugin.java:559)
    at org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:93)
    at org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:82)
    at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:44)
    at org.gradle.internal.event.BroadcastDispatch.dispatch(BroadcastDispatch.java:79)
    at org.gradle.internal.event.BroadcastDispatch.dispatch(BroadcastDispatch.java:30)
    at org.gradle.messaging.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
    at com.sun.proxy.$Proxy9.afterEvaluate(Unknown Source)
    at org.gradle.configuration.project.LifecycleProjectEvaluator.notifyAfterEvaluate(LifecycleProjectEvaluator.java:67)
    at org.gradle.configuration.project.LifecycleProjectEvaluator.evaluate(LifecycleProjectEvaluator.java:61)
    at org.gradle.api.internal.project.AbstractProject.evaluate(AbstractProject.java:496)
    at org.gradle.api.internal.project.AbstractProject.evaluationDependsOn(AbstractProject.java:564)
    at org.gradle.api.internal.project.AbstractProject.evaluationDependsOn(AbstractProject.java:556)
    at com.android.build.gradle.internal.DependencyManager.ensureConfigured(DependencyManager.java:671)
    at com.android.build.gradle.internal.DependencyManager.resolveDependencyForConfig(DependencyManager.java:239)
    at com.android.build.gradle.internal.DependencyManager.resolveDependencies(DependencyManager.java:138)
    at com.android.build.gradle.internal.TaskManager.resolveDependencies(TaskManager.java:327)
    at com.android.build.gradle.internal.VariantManager$9.call(VariantManager.java:597)
    at com.android.build.gradle.internal.VariantManager$9.call(VariantManager.java:594)
    at com.android.builder.profile.ThreadRecorder$1.record(ThreadRecorder.java:55)
    at com.android.builder.profile.ThreadRecorder$1.record(ThreadRecorder.java:47)
    at com.android.build.gradle.internal.profile.SpanRecorders.record(SpanRecorders.java:51)
    at com.android.build.gradle.internal.VariantManager.createVariantData(VariantManager.java:593)
    at com.android.build.gradle.internal.VariantManager.createVariantDataForProductFlavors(VariantManager.java:750)
    at com.android.build.gradle.internal.VariantManager.populateVariantDataList(VariantManager.java:459)
    at com.android.build.gradle.internal.VariantManager$1.call(VariantManager.java:263)
    at com.android.build.gradle.internal.VariantManager$1.call(VariantManager.java:260)
    at com.android.builder.profile.ThreadRecorder$1.record(ThreadRecorder.java:55)
    at com.android.builder.profile.ThreadRecorder$1.record(ThreadRecorder.java:47)
    at com.android.build.gradle.internal.VariantManager.createAndroidTasks(VariantManager.java:259)
    at com.android.build.gradle.BasePlugin$12.call(BasePlugin.java:650)
    at com.android.build.gradle.BasePlugin$12.call(BasePlugin.java:647)
    at com.android.builder.profile.ThreadRecorder$1.record(ThreadRecorder.java:55)
    at com.android.builder.profile.ThreadRecorder$1.record(ThreadRecorder.java:47)
    at com.android.build.gradle.BasePlugin.createAndroidTasks(BasePlugin.java:646)
    at com.android.build.gradle.BasePlugin$10$1.call(BasePlugin.java:566)
    at com.android.build.gradle.BasePlugin$10$1.call(BasePlugin.java:563)
    at com.android.builder.profile.ThreadRecorder$1.record(ThreadRecorder.java:55)
    at com.android.builder.profile.ThreadRecorder$1.record(ThreadRecorder.java:47)
    at com.android.build.gradle.BasePlugin$10.execute(BasePlugin.java:562)
    at com.android.build.gradle.BasePlugin$10.execute(BasePlugin.java:559)
    at org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:93)
    at org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:82)
    at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:44)
    at org.gradle.internal.event.BroadcastDispatch.dispatch(BroadcastDispatch.java:79)
    at org.gradle.internal.event.BroadcastDispatch.dispatch(BroadcastDispatch.java:30)
    at org.gradle.messaging.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
    at com.sun.proxy.$Proxy9.afterEvaluate(Unknown Source)
    at org.gradle.configuration.project.LifecycleProjectEvaluator.notifyAfterEvaluate(LifecycleProjectEvaluator.java:67)
    at org.gradle.configuration.project.LifecycleProjectEvaluator.evaluate(LifecycleProjectEvaluator.java:61)
    at org.gradle.api.internal.project.AbstractProject.evaluate(AbstractProject.java:496)
    at org.gradle.api.internal.project.AbstractProject.evaluate(AbstractProject.java:87)
    at org.gradle.execution.TaskPathProjectEvaluator.configureHierarchy(TaskPathProjectEvaluator.java:47)
    at org.gradle.configuration.DefaultBuildConfigurer.configure(DefaultBuildConfigurer.java:35)
    at org.gradle.initialization.DefaultGradleLauncher$2.run(DefaultGradleLauncher.java:125)
    at org.gradle.internal.Factories$1.create(Factories.java:22)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:52)
    at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:122)
    at org.gradle.initialization.DefaultGradleLauncher.access$200(DefaultGradleLauncher.java:32)
    at org.gradle.initialization.DefaultGradleLauncher$1.create(DefaultGradleLauncher.java:99)
    at org.gradle.initialization.DefaultGradleLauncher$1.create(DefaultGradleLauncher.java:93)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:62)
    at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:93)
    at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:82)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter$DefaultBuildController.run(InProcessBuildActionExecuter.java:94)
    at org.gradle.tooling.internal.provider.ExecuteBuildActionRunner.run(ExecuteBuildActionRunner.java:28)
    at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:43)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:28)
    at org.gradle.launcher.exec.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:77)
    at org.gradle.launcher.exec.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:47)
    at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:52)
    at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:37)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:34)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:74)
    at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:72)
    at org.gradle.util.Swapper.swap(Swapper.java:38)
    at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:72)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.health.DaemonHealthTracker.execute(DaemonHealthTracker.java:47)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:66)
    at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:72)
    at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.health.HintGCAfterBuild.execute(HintGCAfterBuild.java:41)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:50)
    at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:246)
    at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54)
    at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:40)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)

FAILURE: Build failed with an exception.

* Where:
Build file '/Users/dtecheira/Workspace/android/events/build.gradle' line: 2

* What went wrong:
A problem occurred evaluating project ':events'.
> Failed to apply plugin [id 'com.monits.staticCodeAnalysis']
   > Could not create plugin of type 'StaticCodeAnalysisPlugin'.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

PMD error on Android projects using Play Services or LeakCanary

Hi!

I'm having two issues after upgrading to SCA v3.0.0.

First one is related to PMD, second one to Spotbugs.

Context

I was using v2.6.12 fine in the given context:

  • PMD enabled
  • Gradle v5.6.4
  • Android project
    • 'com.android.tools.build:gradle:3.6.2'
    • App module, 1 dynamic feature module, many library modules (all in the same repository)

Note: SCA v2.6.12 comes with PMD v6.20.0

Error

PMD runs ok in all modules but on the dynamic feature module, I'm getting the following result:

* What went wrong:
Execution failed for task ':my_anroid_dynamic_feature_module:processDebugAndroidTestResources'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade
   > Android resource linking failed
     /Users/myuser/.gradle/caches/transforms-2/files-2.1/12544b80cee21462a629a686340edfa2/jetified-leakcanary-android-core-2.2/AndroidManifest.xml:34:13-36:66: AAPT: error: resource xml/leak_canary_file_paths (aka com.github.myawesomeproject.awesomefeature.test:xml/leak_canary_file_paths) not found.
         
     /Users/myuser/.gradle/caches/transforms-2/files-2.1/12544b80cee21462a629a686340edfa2/jetified-leakcanary-android-core-2.2/AndroidManifest.xml:39:9-44:66: AAPT: error: resource mipmap/leak_canary_icon (aka com.github.myawesomeproject.awesomefeature.test:mipmap/leak_canary_icon) not found.
         
     /Users/myuser/.gradle/caches/transforms-2/files-2.1/12544b80cee21462a629a686340edfa2/jetified-leakcanary-android-core-2.2/AndroidManifest.xml:39:9-44:66: AAPT: error: resource string/leak_canary_display_activity_label (aka com.github.myawesomeproject.awesomefeature.test:string/leak_canary_display_activity_label) not found.
         
     /Users/myuser/.gradle/caches/transforms-2/files-2.1/12544b80cee21462a629a686340edfa2/jetified-leakcanary-android-core-2.2/AndroidManifest.xml:39:9-44:66: AAPT: error: resource style/leak_canary_LeakCanary.Base (aka com.github.myawesomeproject.awesomefeature.test:style/leak_canary_LeakCanary.Base) not found.
         
     /Users/myuser/.gradle/caches/transforms-2/files-2.1/12544b80cee21462a629a686340edfa2/jetified-leakcanary-android-core-2.2/AndroidManifest.xml:46:9-62:26: AAPT: error: resource drawable/leak_canary_tv_icon (aka com.github.myawesomeproject.awesomefeature.test:drawable/leak_canary_tv_icon) not found.
         
     /Users/myuser/.gradle/caches/transforms-2/files-2.1/12544b80cee21462a629a686340edfa2/jetified-leakcanary-android-core-2.2/AndroidManifest.xml:46:9-62:26: AAPT: error: resource bool/leak_canary_add_launcher_icon (aka com.github.myawesomeproject.awesomefeature.test:bool/leak_canary_add_launcher_icon) not found.
         
     /Users/myuser/.gradle/caches/transforms-2/files-2.1/12544b80cee21462a629a686340edfa2/jetified-leakcanary-android-core-2.2/AndroidManifest.xml:46:9-62:26: AAPT: error: resource mipmap/leak_canary_icon (aka com.github.myawesomeproject.awesomefeature.test:mipmap/leak_canary_icon) not found.
         
     /Users/myuser/.gradle/caches/transforms-2/files-2.1/12544b80cee21462a629a686340edfa2/jetified-leakcanary-android-core-2.2/AndroidManifest.xml:46:9-62:26: AAPT: error: resource string/leak_canary_display_activity_label (aka com.github.myawesomeproject.awesomefeature.test:string/leak_canary_display_activity_label) not found.
         
     /Users/myuser/.gradle/caches/transforms-2/files-2.1/12544b80cee21462a629a686340edfa2/jetified-leakcanary-android-core-2.2/AndroidManifest.xml:46:9-62:26: AAPT: error: resource style/leak_canary_LeakCanary.Base (aka com.github.myawesomeproject.awesomefeature.test:style/leak_canary_LeakCanary.Base) not found.
         
     /Users/myuser/.gradle/caches/transforms-2/files-2.1/12544b80cee21462a629a686340edfa2/jetified-leakcanary-android-core-2.2/AndroidManifest.xml:64:9-70:68: AAPT: error: resource mipmap/leak_canary_icon (aka com.github.myawesomeproject.awesomefeature.test:mipmap/leak_canary_icon) not found.
         
     /Users/myuser/.gradle/caches/transforms-2/files-2.1/12544b80cee21462a629a686340edfa2/jetified-leakcanary-android-core-2.2/AndroidManifest.xml:64:9-70:68: AAPT: error: resource string/leak_canary_storage_permission_activity_label (aka com.github.myawesomeproject.awesomefeature.test:string/leak_canary_storage_permission_activity_label) not found.
         
     /Users/myuser/.gradle/caches/transforms-2/files-2.1/12544b80cee21462a629a686340edfa2/jetified-leakcanary-android-core-2.2/AndroidManifest.xml:64:9-70:68: AAPT: error: resource style/leak_canary_Theme.Transparent (aka com.github.myawesomeproject.awesomefeature.test:style/leak_canary_Theme.Transparent) not found.
         
     /Users/myuser/.gradle/caches/transforms-2/files-2.1/1242a38a4d8d07b0c228c34712765379/jetified-play-services-basement-17.0.0/AndroidManifest.xml:23:9-25:69: AAPT: error: resource integer/google_play_services_version (aka com.github.myawesomeproject.awesomefeature.test:integer/google_play_services_version) not found.
         

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.3/userguide/command_line_interface.html#sec:command_line_warnings

BUILD FAILED in 6s
82 actionable tasks: 14 executed, 68 up-to-date

What I've tried

  • Bump 'com.android.tools.build:gradle:3.6.2' to v3.6.3 ==> same error
  • Bump Gradle to v6.3 ==> same error
  • Build a local version of SCA v3.0.0 downgrading to PMD v6.20.0 ==> same error
  • Remove dependency LeakCanary and its usages ==> same error (only for Play Services)
  • Clone project again ==> same error
  • Downgrade Gradle to v5.2.1 (with 'com.android.tools.build:gradle:3.4.1') ==> It works! 🤔

Why I tried downgrading to v5.2.1?
After upgrading to SCA v3.0.0, when running:

./gradlew spotbugs

I'm getting the following error:

No classes configured for SpotBugs analysis.

which is extremely similar to spotbugs/spotbugs-gradle-plugin#23.

But in this new context with Gradle v5.2.1 when running spotbugs I fall into spotbugs/spotbugs-gradle-plugin#90.

Since all was working ok before upgrading and even after upgrading but using the previous version of PMD, I think it's a bug on SCA itself (perhaps on the workaround I assume you're doing to make Spotbugs work with Android projects? Should I file a new issue for this Spotbugs behaviour?

I can share a branch to try on..

Checkstyle fails on gradle 2.3

* What went wrong:
Execution failed for task ':commons:checkstyle'.
> Unable to create a Checker: cannot initialize module TreeWalker - Unable to instantiate CommentsIndentation

* Try:
Run with --info or --debug option to get more log output.

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':commons:checkstyle'.
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:69)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46)
    at org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(PostExecutionAnalysisTaskExecuter.java:35)
    at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:64)
    at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
    at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:42)
    at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52)
    at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:53)
    at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
    at org.gradle.api.internal.AbstractTask.executeWithoutThrowingTaskFailure(AbstractTask.java:306)
    at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.executeTask(AbstractTaskPlanExecutor.java:79)
    at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:63)
    at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:51)
    at org.gradle.internal.concurrent.DefaultExecutorFactory$StoppableExecutorImpl$1.run(DefaultExecutorFactory.java:64)
Caused by: : Unable to create a Checker: cannot initialize module TreeWalker - Unable to instantiate CommentsIndentation
    at com.puppycrawl.tools.checkstyle.CheckStyleTask.createChecker(CheckStyleTask.java:362)
    at com.puppycrawl.tools.checkstyle.CheckStyleTask.realExecute(CheckStyleTask.java:280)
    at com.puppycrawl.tools.checkstyle.CheckStyleTask.execute(CheckStyleTask.java:243)
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
    at org.gradle.api.internal.project.ant.BasicAntBuilder.nodeCompleted(BasicAntBuilder.java:77)
    at org.gradle.api.internal.project.AntBuilderDelegate.nodeCompleted(DefaultIsolatedAntBuilder.groovy:173)
    at org.gradle.api.plugins.quality.Checkstyle$_run_closure1.doCall(Checkstyle.groovy:142)
    at org.gradle.api.internal.ClosureBackedAction.execute(ClosureBackedAction.java:67)
    at org.gradle.util.ConfigureUtil.configure(ConfigureUtil.java:130)
    at org.gradle.util.ConfigureUtil.configure(ConfigureUtil.java:91)
    at org.gradle.util.ConfigureUtil$configure.call(Unknown Source)
    at org.gradle.util.ConfigureUtil$configure.call(Unknown Source)
    at org.gradle.api.internal.project.DefaultIsolatedAntBuilder.execute(DefaultIsolatedAntBuilder.groovy:104)
    at org.gradle.api.internal.project.IsolatedAntBuilder$execute$7.call(Unknown Source)
    at org.gradle.api.plugins.quality.Checkstyle.run(Checkstyle.groovy:139)
    at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:63)
    at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.doExecute(AnnotationProcessingTaskFactory.java:218)
    at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:211)
    at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:200)
    at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:585)
    at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:568)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61)
    ... 13 more
Caused by: com.puppycrawl.tools.checkstyle.api.CheckstyleException: cannot initialize module TreeWalker - Unable to instantiate CommentsIndentation
    at com.puppycrawl.tools.checkstyle.Checker.setupChild(Checker.java:180)
    at com.puppycrawl.tools.checkstyle.api.AutomaticBean.configure(AutomaticBean.java:171)
    at com.puppycrawl.tools.checkstyle.CheckStyleTask.createChecker(CheckStyleTask.java:353)
    ... 36 more
Caused by: com.puppycrawl.tools.checkstyle.api.CheckstyleException: Unable to instantiate CommentsIndentation
    at com.puppycrawl.tools.checkstyle.PackageObjectFactory.createModule(PackageObjectFactory.java:143)
    at com.puppycrawl.tools.checkstyle.TreeWalker.setupChild(TreeWalker.java:163)
    at com.puppycrawl.tools.checkstyle.api.AutomaticBean.configure(AutomaticBean.java:171)
    at com.puppycrawl.tools.checkstyle.Checker.setupChild(Checker.java:160)
    ... 38 more
Caused by: com.puppycrawl.tools.checkstyle.api.CheckstyleException: Unable to instantiate CommentsIndentationCheck
    at com.puppycrawl.tools.checkstyle.PackageObjectFactory.doMakeObject(PackageObjectFactory.java:101)
    at com.puppycrawl.tools.checkstyle.PackageObjectFactory.createModule(PackageObjectFactory.java:140)
    ... 41 more

Checkstyle won't find root module on 3.0.0

When running checkstyle with Gradle 5.6.4, AGP 3.4.2

Command

./gradlew clean check

Error

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:checkstyleMain'.
> Unable to create Root Module: config {/<system-path>/<android-project-root>/config/checkstyle/checkstyle-main.xml}, classpath {}.

Config

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module PUBLIC "-//Puppy Crawl//DTD Check Configuration 1.3//EN"
        "http://www.puppycrawl.com/dtds/configuration_1_3.dtd">
<module name="Checker">
    <property name="severity" value="warning"/>
    <property name="cacheFile" value="${checkstyle.cache.file}"/>
    <module name="TreeWalker">
        <property name="tabWidth" value="4"/>
        <module name="JavadocMethod">
            <property name="severity" value="warning"/>
            <property name="scope" value="public"/>
            <property name="allowMissingPropertyJavadoc" value="true"/>
        </module>
        <module name="CommentsIndentation"/>
        <module name="EmptyLineSeparator">
            <property name="allowNoEmptyLineBetweenFields" value="true"/>
            <property name="allowMultipleEmptyLines" value="false"/>
            <property name="allowMultipleEmptyLinesInsideClassMembers" value="false"/>
        </module>
        <module name="AnnotationLocation">
            <property name="severity" value="error"/>
        </module>
        <module name="OneTopLevelClass">
            <property name="severity" value="error"/>
        </module>
        <module name="DeclarationOrder">
            <property name="severity" value="error"/>
            <property name="ignoreModifiers" value="true"/>
        </module>
        <module name="MissingDeprecated">
            <property name="severity" value="error"/>
        </module>
        <module name="MultipleStringLiterals"> <!-- By default ignores annotations -->
            <property name="severity" value="error"/>
        </module>
        <module name="AtclauseOrder"/>
        <module name="NonEmptyAtclauseDescription"/>
        <module name="InterfaceTypeParameterName"/>
        <module name="MissingOverride">
            <property name="severity" value="error"/>
        </module>
        <module name="ConstantName">
            <property name="severity" value="error"/>
        </module>
        <module name="LocalVariableName">
            <property name="severity" value="error"/>
        </module>
        <module name="LocalFinalVariableName">
            <property name="severity" value="error"/>
        </module>
        <module name="MemberName">
            <property name="severity" value="error"/>
        </module>
        <module name="MethodName"/>
        <module name="PackageName">
            <property name="severity" value="warning"/>
            <property name="format" value="^[a-z]+(\.[a-z_][a-z0-9_]*)*$"/>
        </module>
        <module name="ParameterName">
            <property name="severity" value="error"/>
        </module>
        <module name="StaticVariableName">
            <property name="severity" value="error"/>
        </module>
        <module name="TypeName">
            <property name="severity" value="error"/>
        </module>
        <module name="AvoidStarImport">
            <property name="severity" value="error"/>
        </module>
        <module name="IllegalImport">
            <property name="severity" value="error"/>
            <property name="illegalPkgs" value="sun, framework.junit"/>
        </module>
        <module name="UnusedImports">
            <property name="severity" value="error"/>
            <property name="processJavadoc" value="true"/>
        </module>
        <module name="AnonInnerLength">
            <property name="max" value="40"/>
        </module>
        <module name="LineLength">
            <property name="severity" value="warning"/>
            <property name="max" value="150"/>
        </module>
        <module name="MethodLength">
            <property name="max" value="80"/>
        </module>
        <module name="OuterTypeNumber"/>
        <module name="EmptyForInitializerPad"/>
        <module name="OperatorWrap"/>
        <module name="LeftCurly">
            <property name="severity" value="error"/>
        </module>
        <module name="NeedBraces">
            <property name="severity" value="error"/>
        </module>
        <module name="RightCurly">
            <property name="severity" value="error"/>
        </module>
        <module name="CovariantEquals"/>
        <module name="EmptyStatement"/>
        <module name="EqualsAvoidNull">
            <property name="severity" value="error"/>
        </module>
        <module name="EqualsHashCode">
            <property name="severity" value="error"/>
        </module>
        <module name="FallThrough"/>
        <module name="MagicNumber">
            <property name="severity" value="warning"/>
            <property name="ignoreAnnotation" value="true"/>
        </module>
        <module name="InterfaceIsType"/>
        <module name="PackageDeclaration">
            <property name="severity" value="error"/>
        </module>
        <module name="StringLiteralEquality">
            <property name="severity" value="error"/>
        </module>
        <module name="SuperClone">
            <property name="severity" value="error"/>
        </module>
        <module name="SuperFinalize">
            <property name="severity" value="error"/>
        </module>
        <module name="ArrayTrailingComma"/>
        <module name="OneStatementPerLine">
            <property name="severity" value="error"/>
        </module>
        <module name="MutableException"/>
        <module name="NPathComplexity"/>
        <module name="CyclomaticComplexity"/>
        <module name="UncommentedMain">
            <property name="excludedClasses" value="\.Main$"/>
        </module>
        <module name="UpperEll"/>
        <module name="ClassTypeParameterName"/>
        <module name="MethodTypeParameterName"/>
        <module name="EmptyForIteratorPad"/>
        <module name="MethodParamPad"/>
        <module name="ParenPad"/>
        <module name="WhitespaceAround">
            <property name="tokens" value="ASSIGN,ARRAY_INIT,BAND,BAND_ASSIGN,BOR,BOR_ASSIGN,BSR,BSR_ASSIGN,BXOR,BXOR_ASSIGN,COLON,DIV,DIV_ASSIGN,DO_WHILE,EQUAL,GE,GT,LAMBDA,LAND,LCURLY,LE,LITERAL_CATCH,LITERAL_DO,LITERAL_ELSE,LITERAL_FINALLY,LITERAL_FOR,LITERAL_IF,LITERAL_RETURN,LITERAL_SWITCH,LITERAL_SYNCHRONIZED,LITERAL_TRY,LITERAL_WHILE,LOR,LT,MINUS,MINUS_ASSIGN,MOD,MOD_ASSIGN,NOT_EQUAL,PLUS,PLUS_ASSIGN,QUESTION,RCURLY,SL,SLIST,SL_ASSIGN,SR,SR_ASSIGN,STAR,STAR_ASSIGN,LITERAL_ASSERT,TYPE_EXTENSION_AND"/>
            <property name="severity" value="error"/>
            <property name="ignoreEnhancedForColon" value="false"/>
        </module>
        <module name="ArrayTypeStyle"/>
        <module name="DefaultComesLast"/>
        <module name="WhitespaceAfter"/>
        <module name="GenericWhitespace"/>
        <module name="Indentation">
            <property name="caseIndent" value="0"/>
            <property name="lineWrappingIndentation" value="1"/>
        </module>
        <module name="OuterTypeFilename">
            <property name="severity" value="error"/>
        </module>
        <module name="EmptyBlock">
            <property name="option" value="text"/>
        </module>
        <module name="FinalLocalVariable">
            <!-- The new better way, not usable until we fully migrate (and then, remove FOR_EACH_CLAUSE from FinalParameters) -->
            <!--            <property name="validateEnhancedForLoopVariable" value="true"/>-->
        </module>
        <module name="FinalParameters">
            <property name="tokens" value="METHOD_DEF,CTOR_DEF,LITERAL_CATCH,FOR_EACH_CLAUSE"/>
        </module>
        <module name="FinalClass"/>
        <module name="ModifierOrder"/>
        <module name="SimplifyBooleanExpression"/>
        <module name="SimplifyBooleanReturn"/>
        <!-- Just allow spaces for indentation -->
        <module name="RegexpSinglelineJava">
            <property name="id" value="IndentWithSpaces"/>
            <property name="format" value="^ *\t+ *\S"/>
            <property name="message" value="Line has leading tabs; indentation should be performed with spaces only."/>
            <property name="ignoreComments" value="true"/>
        </module>
        <!-- Avoid multiple spaces within code -->
        <module name="RegexpSinglelineJava">
            <property name="id" value="ExtraWhitespace"/>
            <property name="format" value='\S(\s{2,}|\t)(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)'/>
            <property name="message" value="There are some extra whitespaces in this line."/>
            <property name="ignoreComments" value="true"/>
        </module>
        <module name="SuppressWarningsHolder"/>

        <!-- Allow to disable checks with comments -->
        <module name="SuppressionCommentFilter"/>
    </module>
    
    <!-- Allow to disable checks with @SuppressWarnings -->
    <module name="SuppressWarningsFilter"/>
    <module name="SuppressionFilter">
        <property name="file"
                  value="https://raw.githubusercontent.com/Monits/static-code-analysis-plugin/staging/defaults/checkstyle/checkstyle-suppressions.xml"/>
    </module>
    <!-- Check for unique properties in property files -->
    <module name="UniqueProperties"/>
    <!-- No triling spaces! -->
    <module name="RegexpSingleline">
        <property name="format" value="\s+$"/>
        <property name="message" value="There are some extra whitespaces at the end of this line."/>
    </module>
</module>

Rollback to version version 2.6.1 still works fine.

InvalidUserDataException: Cannot change role of configuration XXX after it has been included in dependency resolution

Hi!

I faced this error when running ./gradlew check

FAILURE: Build failed with an exception.

* What went wrong:
A problem occurred configuring project ':app'.
> Cannot change role of configuration ':app:debugApk' after it has been included in dependency resolution.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 2s

which going deeper is:

Encountered an error trying to set inputs and outputs for Android Lint tasks, it will be disabled. Please, report this incident at https://github.com/monits/static-code-analysis-plugin/issues

...

InvalidUserDataException: Cannot change role of configuration ':module:debugPublish' after it has been included in dependency resolution

after an upgrade from: classpath 'com.android.tools.build:gradle:3.4.2' to v3.5.0

See the
output.log

Context:

  • Gradle Wrapper v5.5.1
  • SCA v2.6.10

Configuring CPD

So, the usage explanation shows how to configure everything but CPD. How do I pass custom configuration to the CPD task?

Android productFlavors are not supported

When using product flavors, the plugin will fail on Findbugs checks, saying no classes are configured for analysis.

This error may also affect the effectiveness of PMD's type resolution, but that's not yet confirmed.

MissingPropertyException useJack for class GradleVariantConfiguration

Hi!

I'm using this plugin in a new project and I'm getting the following output when running the lint task:

./gradlew app:lint
Incremental java compilation is an incubating feature.
Encountered an error trying to set inputs and outputs for Androoid Lint tasks, it will be disabled. Please, report this incident in https://github.com/monits/static-code-analysis-plugin/issues
groovy.lang.MissingPropertyException: No such property: useJack for class: com.android.build.gradle.internal.core.GradleVariantConfiguration
        at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:53)
        at org.codehaus.groovy.runtime.callsite.GetEffectivePojoPropertySite.getProperty(GetEffectivePojoPropertySite.java:66)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGetProperty(AbstractCallSite.java:296)
        at com.monits.gradle.sca.config.AndroidLintConfigurator$_configureLintInputsAndOutputs_closure3.doCall(AndroidLintConfigurator.groovy:107)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
        at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
        at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:294)
        at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1019)
        at groovy.lang.Closure.call(Closure.java:426)
        at groovy.lang.Closure.call(Closure.java:442)
        at org.gradle.api.internal.ClosureBackedAction.execute(ClosureBackedAction.java:67)
        at org.gradle.api.internal.DefaultDomainObjectCollection.all(DefaultDomainObjectCollection.java:110)
        at org.gradle.api.internal.DefaultDomainObjectCollection.all(DefaultDomainObjectCollection.java:115)
        at org.gradle.api.DomainObjectCollection$all$5.call(Unknown Source)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
        at com.monits.gradle.sca.config.AndroidLintConfigurator.configureLintInputsAndOutputs(AndroidLintConfigurator.groovy:92)
        at com.monits.gradle.sca.config.AndroidLintConfigurator.applyAndroidConfig(AndroidLintConfigurator.groovy:49)
        at com.monits.gradle.sca.StaticCodeAnalysisPlugin$_withAndroidPlugins_closure9.doCall(StaticCodeAnalysisPlugin.groovy:192)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
        at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
        at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:294)
        at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1019)
        at groovy.lang.Closure.call(Closure.java:426)
        at org.codehaus.groovy.runtime.ConvertedClosure.invokeCustom(ConvertedClosure.java:53)
        at org.codehaus.groovy.runtime.ConversionHandler.invoke(ConversionHandler.java:105)
        at com.sun.proxy.$Proxy46.execute(Unknown Source)
        at org.gradle.internal.Actions$FilteredAction.execute(Actions.java:205)
        at org.gradle.api.internal.DefaultDomainObjectCollection.all(DefaultDomainObjectCollection.java:110)
        at org.gradle.api.internal.DefaultDomainObjectCollection.withType(DefaultDomainObjectCollection.java:120)
        at com.monits.gradle.sca.StaticCodeAnalysisPlugin.withPlugin(StaticCodeAnalysisPlugin.groovy:205)
        at com.monits.gradle.sca.StaticCodeAnalysisPlugin.withOptionalPlugin(StaticCodeAnalysisPlugin.groovy:219)
        at com.monits.gradle.sca.StaticCodeAnalysisPlugin.withAndroidPlugins(StaticCodeAnalysisPlugin.groovy:209)
        at com.monits.gradle.sca.StaticCodeAnalysisPlugin.withAndroidPlugins(StaticCodeAnalysisPlugin.groovy:194)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
        at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
        at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:384)
        at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1019)
        at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:69)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:52)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:154)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:166)
        at com.monits.gradle.sca.StaticCodeAnalysisPlugin$_apply_closure1.doCall(StaticCodeAnalysisPlugin.groovy:66)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
        at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
        at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:294)
        at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1019)
        at groovy.lang.Closure.call(Closure.java:426)
        at org.gradle.listener.ClosureBackedMethodInvocationDispatch.dispatch(ClosureBackedMethodInvocationDispatch.java:40)
        at org.gradle.listener.ClosureBackedMethodInvocationDispatch.dispatch(ClosureBackedMethodInvocationDispatch.java:25)
        at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:44)
        at org.gradle.internal.event.BroadcastDispatch.dispatch(BroadcastDispatch.java:79)
        at org.gradle.internal.event.BroadcastDispatch.dispatch(BroadcastDispatch.java:30)
        at org.gradle.messaging.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
        at com.sun.proxy.$Proxy10.afterEvaluate(Unknown Source)
        at org.gradle.configuration.project.LifecycleProjectEvaluator.notifyAfterEvaluate(LifecycleProjectEvaluator.java:67)
        at org.gradle.configuration.project.LifecycleProjectEvaluator.evaluate(LifecycleProjectEvaluator.java:61)
        at org.gradle.api.internal.project.AbstractProject.evaluate(AbstractProject.java:529)
        at org.gradle.api.internal.project.AbstractProject.evaluate(AbstractProject.java:90)
        at org.gradle.execution.TaskPathProjectEvaluator.configureHierarchy(TaskPathProjectEvaluator.java:47)
        at org.gradle.configuration.DefaultBuildConfigurer.configure(DefaultBuildConfigurer.java:35)
        at org.gradle.initialization.DefaultGradleLauncher$2.run(DefaultGradleLauncher.java:125)
        at org.gradle.internal.Factories$1.create(Factories.java:22)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:52)
        at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:122)
        at org.gradle.initialization.DefaultGradleLauncher.access$200(DefaultGradleLauncher.java:32)
        at org.gradle.initialization.DefaultGradleLauncher$1.create(DefaultGradleLauncher.java:99)
        at org.gradle.initialization.DefaultGradleLauncher$1.create(DefaultGradleLauncher.java:93)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:62)
        at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:93)
        at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:82)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter$DefaultBuildController.run(InProcessBuildActionExecuter.java:94)
        at org.gradle.tooling.internal.provider.ExecuteBuildActionRunner.run(ExecuteBuildActionRunner.java:28)
        at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:43)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:28)
        at org.gradle.launcher.exec.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:81)
        at org.gradle.launcher.exec.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:46)
        at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:52)
        at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
        at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:37)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
        at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
        at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:34)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
        at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:74)
        at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:72)
        at org.gradle.util.Swapper.swap(Swapper.java:38)
        at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:72)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
        at org.gradle.launcher.daemon.server.health.DaemonHealthTracker.execute(DaemonHealthTracker.java:47)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
        at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:60)
        at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
        at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:72)
        at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
        at org.gradle.launcher.daemon.server.health.HintGCAfterBuild.execute(HintGCAfterBuild.java:41)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
        at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:50)
        at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:246)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54)
        at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:40)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
:app:preBuild UP-TO-DATE
...

Context:

  • jdk8 +
compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
}

compileSdkVersion 24
buildToolsVersion "23.0.3"

defaultConfig {
    minSdkVersion 21
    targetSdkVersion 24
}

Oh! And you've got a typo at the error message: "Androoid" =)

Issue running SpotBugs on 3.0.0

When using AGP 3.6.0 + Gradle 5.6.4 I can't run SpotBugs task successfully.

The following error gets thrown on a normal build task:
(Caused by: org.gradle.api.InvalidUserDataException: No classes configured for SpotBugs analysis.)

> Task :contact-tracing-ble:spotbugsMain FAILED

> Task :app:lint
Ran lint on variant debug: 3 issues found
Ran lint on variant release: 3 issues found
Wrote HTML report to file:///Users/saguilera/Projects/build/fury_covid-android/app/reports/lint-results.html
Wrote XML report to file:///Users/saguilera/Projects/build/fury_covid-android/app/reports/lint-results.xml

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':contact-tracing-ble:spotbugsMain'.
> No classes configured for SpotBugs analysis.

* Try:
Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':contact-tracing-ble:spotbugsMain'.
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$3.accept(ExecuteActionsTaskExecuter.java:166)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$3.accept(ExecuteActionsTaskExecuter.java:163)
        at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:191)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:156)
        at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:62)
        at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:108)
        at org.gradle.api.internal.tasks.execution.ResolveBeforeExecutionOutputsTaskExecuter.execute(ResolveBeforeExecutionOutputsTaskExecuter.java:67)
        at org.gradle.api.internal.tasks.execution.StartSnapshotTaskInputsBuildOperationTaskExecuter.execute(StartSnapshotTaskInputsBuildOperationTaskExecuter.java:62)
        at org.gradle.api.internal.tasks.execution.ResolveAfterPreviousExecutionStateTaskExecuter.execute(ResolveAfterPreviousExecutionStateTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:94)
        at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:95)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:416)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:406)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:102)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
        at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:43)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:355)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:343)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:336)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:322)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker$1.execute(DefaultPlanExecutor.java:134)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker$1.execute(DefaultPlanExecutor.java:129)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:202)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:193)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:129)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
        at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
Caused by: org.gradle.api.InvalidUserDataException: No classes configured for SpotBugs analysis.
        at com.github.spotbugs.internal.spotbugs.SpotBugsSpecBuilder.<init>(SpotBugsSpecBuilder.java:48)
        at com.github.spotbugs.SpotBugsTask.generateSpec(SpotBugsTask.java:292)
        at com.github.spotbugs.SpotBugsTask.run(SpotBugsTask.java:276)
        at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:103)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:49)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:42)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:28)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:717)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:684)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$5.run(ExecuteActionsTaskExecuter.java:476)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:402)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:394)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:92)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:461)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:444)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.access$200(ExecuteActionsTaskExecuter.java:93)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.execute(ExecuteActionsTaskExecuter.java:237)
        at org.gradle.internal.execution.steps.ExecuteStep.lambda$execute$1(ExecuteStep.java:33)
        at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:33)
        at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:26)
        at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:58)
        at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:35)
        at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:48)
        at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:33)
        at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:39)
        at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:73)
        at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:54)
        at org.gradle.internal.execution.steps.CatchExceptionStep.execute(CatchExceptionStep.java:35)
        at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:51)
        at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:45)
        at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:31)
        at org.gradle.internal.execution.steps.CacheStep.executeWithoutCache(CacheStep.java:208)
        at org.gradle.internal.execution.steps.CacheStep.executeAndStoreInCache(CacheStep.java:187)
        at org.gradle.internal.execution.steps.CacheStep.lambda$executeWithCache$2(CacheStep.java:110)
        at org.gradle.internal.execution.steps.CacheStep.lambda$executeWithCache$3(CacheStep.java:110)
        at org.gradle.internal.Try$1.apply(Try.java:59)
        at org.gradle.internal.Try$1.apply(Try.java:56)
        at org.gradle.internal.Try$Success.flatMap(Try.java:102)
        at org.gradle.internal.Try.map(Try.java:56)
        at org.gradle.internal.execution.steps.CacheStep.executeWithCache(CacheStep.java:79)
        at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:69)
        at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:45)
        at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:49)
        at org.gradle.internal.execution.steps.StoreSnapshotsStep.execute(StoreSnapshotsStep.java:43)
        at org.gradle.internal.execution.steps.StoreSnapshotsStep.execute(StoreSnapshotsStep.java:32)
        at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:38)
        at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:24)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:96)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$0(SkipUpToDateStep.java:89)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:54)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:38)
        at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:76)
        at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:37)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:36)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:26)
        at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:90)
        at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:48)
        at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:69)
        at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:47)
        at org.gradle.internal.execution.impl.DefaultWorkExecutor.execute(DefaultWorkExecutor.java:33)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:140)
        ... 35 more

The following issue seems to happen only on projects having the library and kotlin plugins, as it's not occuring if I run a build on the app alone.

I can provide any further info if needed.

Using the static code analysis plugin causes gradle sync to fail

I just created an empty test project in the up to date Android Studio (2.2.3; macOS 10.11.6; JRE 1.8.0_112 x86_64; local Gradle 2.14.1 as supplied by AS). When I add this plugin to the app's build.gradle the following happens on gradle sync process:

Error:(2, 0) Could not get unknown property 'default' for configuration container.

No other changes have been made to the default gradle file (see below). It does not matter whether the DSL config is included in the build file or not.

Any idea why this happens and/or what the problem is?

plugins {
    id 'com.monits.staticCodeAnalysis' version '2.3.3'
}

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.0"
    defaultConfig {
        applicationId "com.test.androidtestapp"
        minSdkVersion 19
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.1.0'
    testCompile 'junit:junit:4.12'
    androidLint 'com.monits:android-linters:1.3.0'
}

Regarding Analysis Results

I have modified app/build.gradle file and now it looks as below. Then, I compiled the project and that is not giving any error. May you please guide where it produces the results? or I need to do something more for getting analysis results. Please answer.

plugins {
    id 'com.monits.staticCodeAnalysis' version '2.6.3'
}
apply plugin: 'com.android.application'

staticCodeAnalysis {
    findbugs = true
    checkstyle = true
    pmd = true
    cpd = true
    androidLint = true // Since 2.2.0

    ignoreErrors = true // Since 1.3.0

    // default rules
    findbugsExclude = "$project.rootProject.projectDir/config/findbugs/excludeFilter.xml"
    checkstyleRules = 'https://raw.githubusercontent.com/Monits/static-code-analysis-plugin/staging/defaults/checkstyle/checkstyle-cache.xml'
    pmdRules = [ 'https://raw.githubusercontent.com/Monits/static-code-analysis-plugin/staging/defaults/pmd/pmd.xml',
                 'https://raw.githubusercontent.com/Monits/static-code-analysis-plugin/staging/defaults/pmd/pmd-android.xml' ]

    // Since 2.2.0
    androidLintConfig = 'https://raw.githubusercontent.com/Monits/static-code-analysis-plugin/staging/defaults/android/android-lint.xml'

    // Since 2.0.0
    sourceSetConfig {
        test { // or the name of any other sourceset
            // use a more relaxed ruleset
            checkstyleRules = 'config/checkstyle/test-checkstyle.xml'
            findbugsExclude = 'config/findbugs/test-findbugs.xml'
            pmdRules = [ 'config/pmd/test-pmd.xml',
                         'https://raw.githubusercontent.com/Monits/static-code-analysis-plugin/staging/defaults/pmd/pmd-android.xml' ]
        }
    }
}

android {
    compileSdkVersion 25
    buildToolsVersion "26.0.0"
    defaultConfig {
        applicationId "edu.ksu.cs.benign"
        minSdkVersion 17
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.3.1'
    testCompile 'junit:junit:4.12'
}

Thanks

Support Kotlin

PMD, CPD and Spotbugs (when compiling for the JVM) should all support Kotlin.

Additional tools such as detekt or ktlint may be considered for automatic application.

Allow separate rulesets for tests

Analyzing testss can be usefull (specially since there are specific rules for testing), but more often than not, one is not as strict with our coding standard on tests as on main code (think of confusing ternary, empty catch, etc.).

Having the ability to optionaly define a separate ruleset for Checkstyle, PMD and Findbugs for test resources would be most useful.

The default should still be to use the same everywhere for backwards compatibility.

Prepare for Gradle 4.0

ModuleDependency.getConfiguration() has been deprecated and is scheduled to be removed in Gradle 4.0. Use ModuleDependency.getTargetConfiguration() instead.
        at org.gradle.api.internal.artifacts.dependencies.AbstractModuleDependency.getConfiguration(AbstractModuleDependency.java:57)
        at org.gradle.api.internal.artifacts.dependencies.DefaultProjectDependency_Decorated.getConfiguration(Unknown Source)
        at sun.reflect.GeneratedMethodAccessor117.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
        at groovy.lang.MetaBeanProperty.getProperty(MetaBeanProperty.java:59)
        at org.gradle.internal.metaobject.BeanDynamicObject$MetaClassAdapter.getProperty(BeanDynamicObject.java:213)
        at org.gradle.internal.metaobject.BeanDynamicObject.getProperty(BeanDynamicObject.java:156)
        at org.gradle.internal.metaobject.CompositeDynamicObject.getProperty(CompositeDynamicObject.java:55)
        at org.gradle.internal.metaobject.AbstractDynamicObject.getProperty(AbstractDynamicObject.java:60)
        at org.gradle.api.internal.artifacts.dependencies.DefaultProjectDependency_Decorated.getProperty(Unknown Source)
        at org.codehaus.groovy.runtime.callsite.PogoGetPropertySite.getProperty(PogoGetPropertySite.java:50)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGetProperty(AbstractCallSite.java:296)
        at com.monits.gradle.sca.StaticCodeAnalysisPlugin$_addDepsButModulesToScaconfig_closure10$_closure33.doCall(StaticCodeAnalysisPlugin.groovy:201)

SCA not working

Hi,

My files are referenced under root for a flexible config, gradle wrapper is 4.10.2 ; still, I can't get to run checkstyle for example. From readme:

All tasks, are hooked to be run as part of the check task of the Java Plugin.

Also running gradle check, checkstyle does not seems to work; I've placed unused imports to make sure that build would fail.

I can't see tasks created under Gradle Tasks UI of Android Studio; Other plugins like detekt are working fine.

Would you mind to support me on this? I really enjoyed your plugin =)

apply plugin: 'com.monits.staticCodeAnalysis'

buildscript {
    ext {
        ...
        monits_version = '2.6.10'
        gradle_version = '3.3.1'
    }

    repositories {
        google()
        jcenter()
    }

    dependencies {
        classpath "com.android.tools.build:gradle:${gradle_version}"
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath "com.monits:static-code-analysis-plugin:$monits_version"
        ...
    }
}

allprojects {

    repositories {
        google()
        jcenter()
    }

    staticCodeAnalysis {
        findbugs = true
        checkstyle = true
        pmd = true
        cpd = true
        androidLint = true
        ignoreErrors = false

        sourceSetConfig {
            test {
                findbugsExclude = "${project.rootDir}/.findbugs.xml"
                checkstyleRules = "${project.rootDir}/.checkstyle.xml"
                androidLintConfig = "${project.rootDir}/.lint.xml"
                pmdRules = [ "${project.rootDir}/.pmd.xml",
                             "${project.rootDir}/.pmd-android.xml" ]
            }
        }
    }
}

Console

➜  mProject git:(master) ✗ ./gradlew checkstyle                                                                                                                              10/08/19 |11:21AM

FAILURE: Build failed with an exception.

* What went wrong:
Task 'checkstyle' not found in root project 'Shutter Gallery'.

Consider using android.getBootClasspath()

We don't currently use it for classpath population of analysis tools and may be handy to do so; maybe even fix some of the missing classes errors we currently have.

Default config for PMD fails under Gradle 2.3

* What went wrong:
Execution failed for task ':commons:pmd'.
> java.lang.IllegalArgumentException: Unable to find referenced rule CommentDefaultAccessModifier; perhaps the rule name is mispelled?

Avoid using afterEvaluate UNLESS using an Android plugin prior to 1.3

According to

// Apply Android Lint configuration
// must be done in `afterEvaluate` for compatibility with android plugin [1.0, 1.3)
withAndroidPlugins AndroidLintConfigurator

We only need the afterEvaluate for older Android plugins (which themselves applied everything on an afterEvaluate.

We currently do everything asynchronously as plugins are applied. So we MAY detect, once the android plugin is added, which version is being used, and either apply at the momento or defer to afterEvaluate. This would keep support for older versions without punishing newer ones / non-Android projects.

v2.1.5 compiled for Java8 only?

I'm using the plugin ok but when I tried to start using Data Binding, the project synced well but gives me an error running task: :installDebug.

It seems that the plugin either has any conflicting dependency with DataBinding or it is compiled for Java8 only (but I see it's compiling for compatibility with 7

What I tested

java -version Java7

./gradlew app:installDebug

Build file '/.../app/build.gradle' line: 1

* What went wrong:
A problem occurred evaluating project ':app'.
> java.lang.UnsupportedClassVersionError: com/android/build/gradle/AppPlugin : Unsupported major.minor version 52.0

Note that DataBinding works ok in Java7.

java -version Java8

Without DataBinding

./gradlew app:installDebug

works ok! =)

With DataBinding

./gradlew app:installDebug

:app:mergeDebugAssets UP-TO-DATE
:app:transformClassesWithDexForDebug
Dex: Error converting bytecode to dex:
Cause: Dex cannot parse version 52 byte code.
This is caused by library dependencies that have been compiled using Java 8 or above.
If you are using the 'java' gradle plugin in a library submodule add 
targetCompatibility = '1.7'
sourceCompatibility = '1.7'
to that submodule's build.gradle file.
    UNEXPECTED TOP-LEVEL EXCEPTION:
    java.lang.RuntimeException: Exception parsing classes
        at com.android.dx.command.dexer.Main.processClass(Main.java:775)
        at com.android.dx.command.dexer.Main.processFileBytes(Main.java:741)
        at com.android.dx.command.dexer.Main.access$1200(Main.java:88)
        at com.android.dx.command.dexer.Main$FileBytesConsumer.processFileBytes(Main.java:1683)
        at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:284)
        at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:166)
        at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:144)
        at com.android.dx.command.dexer.Main.processOne(Main.java:695)
        at com.android.dx.command.dexer.Main.processAllFiles(Main.java:592)
        at com.android.dx.command.dexer.Main.runMonoDex(Main.java:321)
        at com.android.dx.command.dexer.Main.run(Main.java:292)
        at com.android.builder.internal.compiler.DexWrapper.run(DexWrapper.java:54)
        at com.android.builder.core.DexByteCodeConverter.lambda$dexInProcess$2(DexByteCodeConverter.java:173)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
    Caused by: com.android.dx.cf.iface.ParseException: bad class file magic (cafebabe) or version (0034.0000)
        at com.android.dx.cf.direct.DirectClassFile.parse0(DirectClassFile.java:476)
        at com.android.dx.cf.direct.DirectClassFile.parse(DirectClassFile.java:406)
        at com.android.dx.cf.direct.DirectClassFile.parseToInterfacesIfNecessary(DirectClassFile.java:388)
        at com.android.dx.cf.direct.DirectClassFile.getMagic(DirectClassFile.java:251)
        at com.android.dx.command.dexer.Main.parseClass(Main.java:787)
        at com.android.dx.command.dexer.Main.access$1600(Main.java:88)
        at com.android.dx.command.dexer.Main$ClassParserTask.call(Main.java:1722)
        at com.android.dx.command.dexer.Main.processClass(Main.java:773)
        ... 16 more

1 error; aborting
:app:transformClassesWithDexForDebug FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:transformClassesWithDexForDebug'.
> com.android.build.api.transform.TransformException: java.lang.RuntimeException: java.lang.RuntimeException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.ide.common.process.ProcessException: Return code 1 for dex process

Sandbox

You can un/comment this line where I'm applying this plugin to reproduce the error.
That branch is using DataBinding and works ok without applying static-code-analysis =(

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.