Запускайте lint при создании проектов Android Studio

Я хотел бы иметь возможность запускать задачу lint, когда я создаю проекты со студией Android, чтобы обеспечить соблюдение правил lint.

Я пытался использовать зависимости задач, но безуспешно. Мой сервер сборки TeamCity использует задачу сборки, которая запускает задачу lint, поэтому все работает отлично. Тем не менее, студия Android, похоже, взаимозаменяемо использует задачи generateDebugSources и compileDebugJava, когда я выбрал вариант сборки отладки.

Вот что я пробовал в своем build.gradle:

assemble.dependsOn lint

person Robert    schedule 03.04.2014    source источник


Ответы (7)


Если вы просто хотите настроить проект Android Studio для запуска проверки lint перед конфигурацией запуска по умолчанию, не влияя на настройку ваших задач gradle, вы можете выполнить следующие шаги.

  1. Откройте раскрывающийся список конфигураций запуска и выберите «Изменить».

введите здесь описание изображения

  1. Выберите конфигурацию запуска вашего приложения

введите здесь описание изображения

  1. Нажмите «+», чтобы добавить новый шаг

введите здесь описание изображения

  1. Выберите «Создать с поддержкой Gradle».

введите здесь описание изображения

  1. Введите «проверить» и выберите вариант с именем вашего модуля приложения и проверьте. (Мой :app:check)

введите здесь описание изображения

  1. Нажмите стрелку вверх, чтобы переместить новый check шаг перед существующим Gradle-aware make шагом

введите здесь описание изображения

Теперь Android Studio запустит проверку lint и завершит сборку, если возникнут какие-либо ошибки lint.

person Ross Hambrick    schedule 21.11.2014
comment
Это работает, но в идеале я бы не хотел, чтобы всем участникам проекта приходилось настраивать свою среду таким образом. Есть ли способ сделать это с помощью Gradle? - person Robert; 06.12.2014
comment
Поскольку это ближе всего к тому, что я на самом деле хочу, я отмечаю это как правильный ответ на данный момент. - person Robert; 28.01.2015
comment
Можем ли мы как-то настроить это в сборке gradle ..? - person Ewoks; 24.09.2015
comment
Вы можете настроить это на gradle, что-то вроде взлома, но работает. Идея состоит в том, чтобы задачи сборки зависели от задач lint, чтобы при каждом запуске вы также запускали lint. Я написал код в ответе ниже. - person Yoel Gluschnaider; 15.01.2016

Чтобы просмотреть и проанализировать свой проект, просто выберите Analyze > Inspect Code.

Вы должны получить красивое окно со всеми вопросами.

введите здесь описание изображения

Также проверьте Запустить lint в Android Studio для Дополнительная информация.


Я провел небольшое исследование, попробуйте добавить это в свой build.gradle.

lintOptions {
      abortOnError true
  } 

Существует множество параметров, которые можно применить к build.gradle

person AndyGable    schedule 04.04.2014
comment
Я хочу предотвратить компиляцию проекта при любой ошибке lint, чтобы обеспечить соблюдение правил lint. Выполнение проверки кода может быть просто проигнорировано и не гарантирует соблюдения правил lint во время компиляции. - person Robert; 04.04.2014
comment
Как мне добавить вызов lint в мой build.gradle? - person Robert; 04.04.2014
comment
Я уже использую abortOnError, поэтому сборка прерывается на моем сервере сборки. Студия Android не запускает задачу lint при создании проекта. Как запустить задачу lint при сборке проекта? - person Robert; 04.04.2014
comment
Можете ли вы позвонить вам просто позвонить на сервер сборки? См. stackoverflow.com /вопросы/19529559/ - person AndyGable; 04.04.2014
comment
Непонятно, как создание разных вариантов решает мою проблему. - person Robert; 06.12.2014
comment
Я не хочу запускать задачу lint вручную, я хочу, чтобы она запускалась при создании проекта. - person Robert; 08.12.2014

Для этого в build.gradle добавьте следующие строки в свой build.gradle:

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

Это делает все ваши задачи сборки зависимыми от задачи lint, эффективно запускающей их перед каждым вызовом сборки, который выполняется Android Studio.

Изменить

С Android Gradle Plugin 3.3 и Gradle 5.x это переработанная версия с использованием скрипта Kotlin:

applicationVariants.all {
  val lintTask = tasks["lint${name.capitalize()}"]
  assembleProvider.get().dependsOn.add(lintTask)
}
person Yoel Gluschnaider    schedule 15.01.2016
comment
У меня работало при использовании кнопки воспроизведения Android Studio (запустить «приложение»), но не при использовании кнопки «Создать проект». - person Travis; 04.03.2016
comment
@Travis Я не знаю о Make Project TBH. Насколько я знаю, он должен запустить команду сборки, которая должна зависеть от команды lint. Но я бы попробовал еще раз. - person Yoel Gluschnaider; 10.03.2016
comment
Теперь это устарело с плагином 3.3. и Грейдл 5.x - person Chris.Jenkins; 16.01.2019
comment
Не удалось установить неизвестное свойство «lintTask» для объекта типа com.android.build.gradle.internal.api.ApplicationVariantImpl. - person Rushabh Shah; 12.06.2019
comment
@RushabhShah - это скрипт Котлина, верно? для Groovy используйте def вместо val - person Yoel Gluschnaider; 14.06.2019

просто запустите задачу "проверить"

./gradlew clean check assembleRelease
person stephane k.    schedule 08.12.2014
comment
Это отвечает на то, как я запускаю задачу проверки из командной строки, а не из студии Android. - person Robert; 08.12.2014
comment
Это лучший ответ, потому что вы можете сделать это и в Дженкинсе. Спасибо. - person Alejandro Zurcher; 30.09.2015
comment
Что ж, это может быть лучшим ответом на другой вопрос. - person Yoel Gluschnaider; 15.01.2016

вот мое решение, которое также работает, когда вы нажимаете Build - Make Project в Android Studio:

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()
                }
        }
    }
}
person TmTron    schedule 30.01.2017
comment
Отличный ответ!! Что-то, что я ищу. Однако это дает мне следующую ошибку Could not find method execute() for arguments [] on task ':app:lintDebug' of type com.android.build.gradle.tasks.LintPerVariantTask. - person Saran Sankaran; 29.11.2019
comment
Спасибо! Вы спасаете мою жизнь! - person Alberto; 14.08.2020

Если вы хотите, чтобы проект Android Studio запускал проверку lint перед конфигурацией запуска по умолчанию, не влияя на настройку ваших задач Gradle, И вы хотите сделать это в системе сборки Gradle, вы можете добавить следующий блок вне android блок в build.gradle модуля приложения следующим образом:

android {
....
    lintOptions {
        abortOnError true
    }
}

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

Замените compileDevDebugSources желаемым вариантом сборки, который вы уже определили, например. compileReleaseSources, compileDebugSources, compileStagingDebugSources и т. д.

Это было протестировано на Android Studio 3.0.

person Phileo99    schedule 29.01.2018
comment
Как я могу применить это ко всем моим вариантам сборки, не перечисляя все имена задач? - person manfcas; 21.02.2018

Просто изменяю ответ @Yoel Gluschnaider

Для меня, если я использую Val, появляется такая ошибка: Не удалось установить неизвестное свойство 'lintTask' для объекта типа com.android.build.gradle.internal.api.ApplicationVariantImpl.

Поэтому я заменяю его

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

и работает нормально!!

person Rushabh Shah    schedule 12.06.2019
comment
Я написал свой ответ для сценария Kotlin. Это Груви :) - person Yoel Gluschnaider; 14.06.2019