在构建android studio项目时运行lint

在构建android studio项目时运行lint,android,android-studio,gradle,android-lint,Android,Android Studio,Gradle,Android Lint,我希望在使用android studio构建项目时能够运行lint任务,以确保遵守lint规则 我尝试过使用任务依赖项,但没有成功。我的TeamCity构建服务器使用构建任务,该任务运行lint任务,因此效果非常好。然而,当我选择调试构建变量时,android studio似乎可以互换地使用generateDebugSources和compileedebugjava任务 以下是我在构建中尝试的内容。gradle: assemble.dependsOn lint android { appl

我希望在使用android studio构建项目时能够运行lint任务,以确保遵守lint规则

我尝试过使用任务依赖项,但没有成功。我的TeamCity构建服务器使用构建任务,该任务运行lint任务,因此效果非常好。然而,当我选择调试构建变量时,android studio似乎可以互换地使用
generateDebugSources
compileedebugjava
任务

以下是我在构建中尝试的内容。gradle:

assemble.dependsOn lint
android {
  applicationVariants.all { variant ->
    variant.outputs.each { output ->
        def lintTask = tasks["lint${variant.name.capitalize()}"]
        output.assemble.dependsOn lintTask
    }
  }
  ...
}

要运行lint并分析项目,只需选择
analyze>Inspect code

你应该有一个很好的窗口来处理所有问题

还要查看更多信息


我做了更多的研究,尝试将此添加到您的
build.gradle

lintOptions {
      abortOnError true
  } 

有许多方法可以应用于build.gradle

如果您只想在默认运行配置之前将Android Studio项目配置为运行lint检查,而不影响gradle任务的配置方式,则可以执行以下步骤

  • 打开“运行配置”下拉列表并选择“编辑”
  • 选择应用程序运行配置
  • 按“+”添加新步骤
  • 选择“Gradle aware Make”
  • 键入“check”并选择带有应用程序模块名称的选项,然后单击“check”。(我的是
    :app:check
  • 按向上箭头,将新的
    检查
    步骤移动到现有的
    Gradle aware make
    步骤之前
  • 现在,Android Studio将运行lint检查,如果出现任何lint错误,则生成将失败。

    只需运行“检查”任务即可


    要在build.gradle中执行此操作,请在build.gradle中添加以下行:

    assemble.dependsOn lint
    
    android {
      applicationVariants.all { variant ->
        variant.outputs.each { output ->
            def lintTask = tasks["lint${variant.name.capitalize()}"]
            output.assemble.dependsOn lintTask
        }
      }
      ...
    }
    
    这使得所有组装任务都依赖于lint任务,在androidstudio执行每个组装调用之前有效地运行它们

    编辑

    使用Android Gradle插件3.3和Gradle 5.x,这是一个使用Kotlin脚本的修订版本:

    applicationVariants.all {
      val lintTask = tasks["lint${name.capitalize()}"]
      assembleProvider.get().dependsOn.add(lintTask)
    }
    

    以下是我的解决方案,当您在Android Studio中单击Build-Make Project时也可以使用:

    android {
    ..
        afterEvaluate {
            applicationVariants.all {
                variant ->
                    // variantName: e.g. Debug, Release
                    def variantName = variant.name.capitalize()
                    // now we tell gradle to always start lint after compile
                    // e.g. start lintDebug after compileDebugSources
                    project.tasks["compile${variantName}Sources"].doLast {
                        project.tasks["lint${variantName}"].execute()
                    }
            }
        }
    }
    

    如果您想强制Android Studio project在默认运行配置之前运行lint检查,而不影响gradle任务的配置方式,并且希望在gradle构建系统中执行此操作,则可以在应用模块的build.gradle中的
    Android
    块外添加以下块,如下所示:

    android {
    ....
        lintOptions {
            abortOnError true
        }
    }
    
    tasks.whenTaskAdded { task ->
        if (task.name == 'compileDevDebugSources') {
            task.dependsOn lint
            task.mustRunAfter lint
        }
    }
    
    compiledEdebugSources
    替换为您已定义的所需生成变量,例如
    compilerLeaseSources
    compiledBugSources
    compiledDebugSources


    这是在Android Studio 3.0上测试的,只是修改了@Yoel Gluschnaider的答案

    对于我来说,如果我使用Val,它会显示如下错误:
    无法为类型为
    com.android.build.gradle.internal.api.ApplicationVariatimpl
    的对象设置未知属性“lintTask”

    所以我把它换了

    applicationVariants.all {
        def lintTask = tasks["lint${name.capitalize()}"]
        assembleProvider.get().dependsOn.add(lintTask)
    }
    


    而且效果很好

    我希望防止编译任何lint错误的项目,以确保遵循lint规则。运行代码检查可能会被忽略,并且不能保证在编译时遵循lint规则。如何在build.gradle中追加lint调用?我已经在使用abortOnError,这就是生成在生成服务器上中断的原因。Android studio在构建项目时不运行lint任务。在构建项目时,如何运行lint任务?您可以调用吗?只需调用构建服务器即可?请看,我不想手动运行lint任务,我希望它在创建项目时运行。这是可行的,但理想情况下,我不希望项目中的每个人都必须以这种方式设置环境。有没有办法用gradle做到这一点?因为这与我实际想要的最接近,所以我现在将其标记为正确答案。我们可以在gradle build中以某种方式进行设置吗?你可以在gradle上进行设置,这有点像黑客,但很有效。其思想是使组装任务依赖于lint任务,以便在每次运行时也运行lint。我在下面的回答中写下了代码。这回答了我如何从命令行而不是从android studio运行检查任务。这是最好的答案,因为你也可以在Jenkins中这样做。谢谢。这可能是另一个问题的最佳答案。在使用Android Studio播放按钮(运行“应用程序”)时对我有效,但在使用“制作项目”按钮时无效。@Travis我不知道制作项目TBH。AFAIK应该运行assembly命令,该命令应该依赖于lint命令。但是我会再试一次,现在插件3.3已经过时了。Gradle 5.x不能为com.android.build.Gradle.internal.api.ApplicationVariatimpl类型的对象设置未知属性“lintTask”。@RushabhShah-这是Kotlin脚本,对吗?对于Groovy,使用
    def
    而不是
    val
    如何在不列出所有任务名称的情况下将其应用于所有构建变体?我为Kotlin脚本编写了答案。这是Groovy:)很好的答案!!我在找的东西。但是,它给了我以下错误
    无法为任务的参数[]找到方法execute():com.android.build.gradle.tasks.lintprovarianttask类型的app:lintDebug。
    谢谢!你救了我的命!