【问题标题】:Run lint when building android studio projects在构建 android studio 项目时运行 lint
【发布时间】:2014-04-03 22:41:36
【问题描述】:

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

我曾尝试使用任务依赖项,但没有成功。我的 TeamCity 构建服务器使用运行 lint 任务的构建任务,因此效果很好。但是,当我选择调试构建变体时,android studio 似乎可以互换使用generateDebugSourcescompileDebugJava 任务。

这是我在 build.gradle 中尝试过的:

assemble.dependsOn lint

【问题讨论】:

    标签: android android-studio gradle android-lint


    【解决方案1】:

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

    1. 打开运行配置下拉菜单并选择编辑

    1. 选择您的应用运行配置

    1. 按“+”添加新步骤

    1. 选择“Gradle-aware Make”

    1. 键入“检查”并选择带有您的应用模块名称的选项并检查。 (我的是:app:check

    1. 按向上箭头将新的check 步骤移到现有的Gradle-aware make 步骤之前

    现在,如果发生任何 lint 错误,Android Studio 将运行 lint 检查并导致构建失败。

    【讨论】:

    • 这可行,但理想情况下我不希望项目中的每个人都必须以这种方式设置他们的环境。有没有办法用 gradle 做到这一点?
    • 由于这与我真正想要的最接近,我现在将其标记为正确答案。
    • 我们可以在 gradle build 中以某种方式设置它吗?
    • 您可以在 gradle 上设置它,有点像 hack,但可以。这个想法是让 assemble 任务依赖于 lint 任务,以便在每次运行时您也将运行 lint。我在下面的答案中写了代码。
    【解决方案2】:

    要运行 lint 并分析您的项目,只需选择 Analyze > Inspect Code

    您应该得到一个包含所有问题的漂亮窗口。

    请查看Run lint in Android Studio 了解更多信息。


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

    lintOptions {
          abortOnError true
      } 
    

    有很多options可以申请build.gradle

    【讨论】:

    • 我想防止在出现任何 lint 错误时编译项目,以确保遵循 lint 规则。运行代码检查可能会被简单地忽略,并且不能保证在编译时遵循 lint 规则。
    • 如何在 build.gradle 中附加 lint 调用?
    • 我已经在使用 abortOnError,这就是构建在我的构建服务器上中断的原因。 Android Studio 在构建项目时不会运行 lint 任务。构建项目时如何运行 lint 任务?
    • 你能叫你只是调用构建服务器吗?见stackoverflow.com/questions/19529559/…
    • 我不想手动运行 lint 任务,我希望它在制作项目时运行。
    【解决方案3】:

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

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

    这使您的所有 assemble 任务都依赖于 lint 任务,在 Android Studio 执行的每个 assemble 调用之前有效地运行它们。

    编辑

    对于 Android Gradle Plugin 3.3 和 Gradle 5.x,这是使用 Kotlin 脚本的修订版:

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

    【讨论】:

    • 在使用 Android Studio 播放按钮(运行“应用程序”)时为我工作,但在使用“制作项目”按钮时为我工作。
    • @Travis 我不知道 Make Project TBH。 AFAIK 它应该运行取决于 lint 命令的 assemble 命令。但我会再试一次。
    • 现在插件 3.3 已经过时了。和 Gradle 5.x
    • 无法为 com.android.build.gradle.internal.api.ApplicationVariantImpl 类型的对象设置未知属性“lintTask”。
    • @RushabhShah - 这是 Kotlin 脚本吧?对于 Groovy,使用 def 而不是 val
    【解决方案4】:

    只需运行“检查”任务

    ./gradlew clean check assembleRelease
    

    【讨论】:

    • 这回答了我如何从命令行运行检查任务,而不是从 android studio。
    • 这是最好的答案,因为您也可以在 Jenkins 中执行此操作。谢谢。
    • 嗯,这可能是另一个问题的最佳答案。
    【解决方案5】:

    这是我的解决方案,当您在 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()
                    }
            }
        }
    }
    

    【讨论】:

    • 很好的答案!我正在寻找的东西。但是,它给了我以下错误Could not find method execute() for arguments [] on task ':app:lintDebug' of type com.android.build.gradle.tasks.LintPerVariantTask.
    • 谢谢!你救了我的命!
    【解决方案6】:

    如果您想强制 Android Studio 项目在默认运行配置之前运行 lint 检查而不影响您的 gradle 任务的配置方式,并且您想在 gradle 构建系统中执行此操作,那么您可以在外部添加以下块app 模块的 build.gradle 中的android 块如下:

    android {
    ....
        lintOptions {
            abortOnError true
        }
    }
    
    tasks.whenTaskAdded { task ->
        if (task.name == 'compileDevDebugSources') {
            task.dependsOn lint
            task.mustRunAfter lint
        }
    }
    

    compileDevDebugSources 替换为您已经定义的所需构建变体,例如。 compileReleaseSourcescompileDebugSourcescompileStagingDebugSources

    这是在 Android Studio 3.0 上测试的

    【讨论】:

    • 如何在不列出所有任务名称的情况下将其应用于我的所有构建变体?
    【解决方案7】:

    只是修改@Yoel Gluschnaider 的答案

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

    所以我替换它

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

    而且效果很好!!

    【讨论】:

    • 我为 Kotlin 脚本写了答案。这是 Groovy :)
    猜你喜欢
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    • 2020-08-21
    • 2017-03-28
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 2020-01-03
    相关资源
    最近更新 更多