Android studio Android Studio中不同构建类型的不同lint.xml?

Android studio Android Studio中不同构建类型的不同lint.xml?,android-studio,android-gradle-plugin,lint,Android Studio,Android Gradle Plugin,Lint,我想在Android Studio中使用不同的lint.xml文件进行发布和调试构建类型。那么,如何才能做到这一点呢 当我将lint.xml放在someModule/src/debug和someModule/src/release文件夹(同样,这些文件夹只包含该lint.xml文件,仅此而已)中时,gradle会做出反应,因为没有任何lint.xml文件,如果我将单个lint.xml文件放在核心模块文件夹(someModule/)下,gradle会识别它,但是在这种情况下,我不能根据构建类型使用

我想在Android Studio中使用不同的lint.xml文件进行发布调试构建类型。那么,如何才能做到这一点呢


当我将lint.xml放在someModule/src/debug和someModule/src/release文件夹(同样,这些文件夹只包含该lint.xml文件,仅此而已)中时,gradle会做出反应,因为没有任何lint.xml文件,如果我将单个lint.xml文件放在核心模块文件夹(someModule/)下,gradle会识别它,但是在这种情况下,我不能根据构建类型使用不同的设置…

我没有尝试过,但类似的东西可能会对您有所帮助

tasks.whenTaskAdded { task ->
    if (task.name == 'lintDebug') {
        task.ext.lintXmlFileName = "lint-debug.xml"
    } else if (task.name == 'lintDemo') {
        task.ext.lintXmlFileName = "lint-demo.xml"
    }
}
编辑:评论反馈:

  • task.ext.xxxx是供您使用的自定义名称空间:请参阅
  • “lintXmlFileName”是一个虚构的名称。你找不到医生
  • 在android{…lintpoptions{…lintConfig文件(“lint.xml”)}中,您需要使用“.ext.get”(“lintXmlFileName”)”读取“lintXmlFileName”,并将其设置为“lintConfig文件()
  • 我没有测试它,但我假设“whenTaskAdded”超出了应用程序build.gradle中“android”的范围

这是《Android studio新构建系统指南》的总结

皮棉支撑

从0.7.0版开始,您可以为特定变体或所有变体运行lint,在这种情况下,它会生成一个报告,描述给定问题适用于哪些特定变体

您可以通过添加lintOptions部分来配置lint,如下所示。您通常只指定其中的几个;本节显示所有可用选项

编辑:添加真实可行的示例

众所周知,新的Android构建系统是基于gradle的。gradle构建系统的核心组件是
任务
。如果项目具有不同的构建变量,则会有不同的lint任务。您可以从android studio
所有任务列表
,或从命令行
/gradlew tasks
获取这些任务。下面的示例显示了两种构建风格
demo
full

lint - Runs lint on all variants.
lintDemoDebug - Runs lint on the DemoDebug build
lintDemoRelease - Runs lint on the DemoRelease build
lintFullDebug - Runs lint on the FullDebug build
lintFullRelease - Runs lint on the FullRelease build
这些lint任务依赖于其他任务,比如说
preBuild

在运行lint任务之前,它将首先运行任务
preBuild
。任务
preBuild
是一个已经存在的任务,但是我们可以操作这个预定义的任务并向这个任务添加更多的操作。android
lintOptions
属性将根据不同的构建变量动态添加和修改,如下代码在文件
app/build.gradle
中所示

preBuild.doFirst {
android.applicationVariants.each { variant ->
    if (variant.name == 'demoDebug') {
        println variant.name
        android.lintOptions.quiet = true
        android.lintOptions.lintConfig = new File('app/lint_demo_debug.xml')
        // you can add more properties
    } else if (variant.name == 'fullDebug') {
        println variant.name
        android.lintOptions.quiet = false
        android.lintOptions.lintConfig = new File('app/lint_full_debug.xml')
        // you can add more properties
    } // more variants...
}

为了成功运行上述代码,相应的lint配置文件必须存在于app目录下。

以下是对我有效的方法:

tasks.whenTaskAdded { task ->
    if (task.name.startsWith("lint")) {
        if (task.name.toLowerCase().endsWith("release")) {
            task.doFirst {
                android.lintOptions.abortOnError = true
            }
        } else {
            task.doFirst {
                android.lintOptions.abortOnError = false
            }
        }
    }
}
在我的例子中,我需要为发布版本打开
abortOnError
,这样我可以自由开发,但可以快速捕获CI上的lint错误(如果它们滑落)。

使用kotlin构建脚本(
build.gradle.kts
):

tasks.withType().configureEach{
//doFirst是必需的,否则我们将在lintOption上获得空指针异常
首先{
//这将覆盖android扩展中的选项
lintOptions.run{
if(name.toLowerCase().contains(“debug”)){
//在这里进行配置
//isAbortOnError=true
//baselineFile=file(“baseline.xml”)
//IsWarningAsErrors=真
//ischeckdependences=true
//忽略(“遗漏翻译”)
//setLintConfig(文件(“lint.xml”))
}
}
}
}

如果您编写一个函数,动态重命名不需要的
lint.xml
文件,只留下您想要的文件,那该怎么办?我愿意接受任何类型的解决方案。包括文件系统操作。您最终找到了解决方案吗?@DataGraham抱歉,没有。请尝试使用Loda的答案。谢谢,我看到了此文档。但这如何帮助我们在每种构建类型中拥有不同的lint.xml文件呢?我认为这不管用。它迭代所有变量,每次设置全局配置,因此无论最后出现哪一个变量,这些选项都将全局设置。没错,这只会保留最后一个变量的值,请参阅我的答案,了解我是如何做到这一点的。我尝试了此解决方案,但无法使其正常工作。此脚本应该放在build.gradle文件中的什么位置?在顶级还是“安卓”内部?这就是它的全部,还是你也需要在android{lintOptions{}}下放一些特别的东西?我找不到“lintXmlFileName”属性的任何文档。
tasks.whenTaskAdded { task ->
    if (task.name.startsWith("lint")) {
        if (task.name.toLowerCase().endsWith("release")) {
            task.doFirst {
                android.lintOptions.abortOnError = true
            }
        } else {
            task.doFirst {
                android.lintOptions.abortOnError = false
            }
        }
    }
}
tasks.withType<LintBaseTask>().configureEach {
    // doFirst is required else we get a Null Pointer Exception on lintOption
    doFirst {
        // This will override the lintOptions from the android extension
        lintOptions.run {
            if (name.toLowerCase().contains("debug")) {
                // Do your configuration here
                // isAbortOnError = true
                // baselineFile = file("baseline.xml")
                // isWarningsAsErrors = true
                // isCheckDependencies = true
                // ignore("MissingTranslation")
                // setLintConfig(file("lint.xml"))
            }
        }
    }
}