如何创建特定于风味的Android Lint基线文件

时间:2017-10-04 09:51:04

标签: android android-gradle build.gradle lint android-lint

根据https://developer.android.com/studio/write/lint.html#snapshot,我们可以创建一个Lint警告基线文件。 问题是我有多种口味,每种都有自己的sourceSets。有些文件只用在一种风格中。

当我生成基线文件时,它始终特定于变体。这意味着它对其他变体无效,即它会遗漏一些现有问题。

我试过把

lintOptions {
  baseline file("lint-baseline.xml")
}

在build和flavor块中,但它不会生成多个基线。

有没有人设法生成特定于风味的lint基线文件?如果是这样的话?

谢谢!

4 个答案:

答案 0 :(得分:1)

由于在 build.gradle 文件中定义方法时出错,我无法使上述答案完全有效。

使用 himanshu saluja 的回答,这对我有用。

我的根项目的 gradle 文件有:

ext.getLintFileName = {
    Gradle gradle = getGradle()
    String taskReq = gradle.getStartParameter().getTaskRequests().args.toString()
    if(taskReq.contains("Debug")) {
        return "debug-lint-baseline.xml"
    } else {
        return "release-lint-baseline.xml"
    }
}

android 块中子项目的 gradle 文件使用这样的值:

 lintOptions {
    baseline file(rootProject.ext.getLintFileName)
    checkDependencies true
    abortOnError true
    absolutePaths false
}

答案 1 :(得分:0)

鉴于baseline功能在LintOptions,并且这个功能是AFAIK无法识别变种,所以这不是开箱即用的。

您可以在https://b.android.com上提交功能请求。

答案 2 :(得分:0)

我正在尝试相同的事情,并找到了解决方法。此创建差异文件以进行发布和调试。您可以将自定义逻辑放入getfileName

lintOptions {
        baseline file(getFileName())
        checkAllWarnings true
        warningsAsErrors true
        abortOnError true
    }

def getCurrentFlavor() {
    Gradle gradle = getGradle()
    String tskReqStr = gradle.getStartParameter().getTaskRequests().args.toString()
    println tskReqStr
    if (tskReqStr.contains("Debug")) {
        return "debug"
    } else {
        return "release"
    }
}

private String getFileName(String command) {
    return getCurrentFlavor() + "-lint-baseline.xml"
}

答案 3 :(得分:0)

根据my GitHub sample code

1- 将以下函数添加到您的应用级 build.gradle 文件中:

def getPath() {
    Gradle gradle = getGradle()
    String tskReqStr = gradle.getStartParameter().getTaskRequests().toString()
    Pattern pattern
    String path
    String fileName = "lint-baseline"

    if (tskReqStr.contains("assemble"))
        pattern = Pattern.compile("assemble(\\w+)(Release|Debug)")
    else if (tskReqStr.contains("generate"))
        pattern = Pattern.compile("generate(\\w+)(Release|Debug)")
    else if (tskReqStr.contains("lint"))
        pattern = Pattern.compile("lint(\\w+)(Release|Debug)")

    if(pattern != null) {
        Matcher matcher = pattern.matcher(tskReqStr)

        if (matcher.find()) {
            path = matcher.group(1).toLowerCase() + matcher.group(2).toLowerCase()
            return "lint-baselines/${path}-${fileName}.xml"
        } else {
            return "lint-baselines/${fileName}.xml"
        }
    }
    return "lint-baselines/${fileName}.xml"
}

这个函数为每个构建变体创建一个特定的路径。您可以通过更改“fileName”变量来自定义文件名。

2- 将以下行添加到应用级 build.gradle 文件的 lintOption 范围:

 lintOptions {
        ...
        // Use (or create) a baseline file for issues that should not be reported
        baseline file("${getPath()}")
        ...
    }

3- 为每个构建变体运行 linter。 例如,在项目根目录的 Android Studio 的终端选项卡中键入以下命令:

gradlew app:lintMyAppRelease

app = 您的模块名称

MyAppRelease = 您的构建变体

4- 完成