自定义 android lint 规则未执行

Posted

技术标签:

【中文标题】自定义 android lint 规则未执行【英文标题】:Custom android lint rules not being executed 【发布时间】:2021-03-17 15:35:00 【问题描述】:

我创建了两个自定义 lint 规则,并验证了它们在单元测试中是否按预期工作。但是,当我尝试使用 ./gradlew app:lint 在整个项目上运行 lint 时,这些规则不会被执行。 为了验证它们没有被执行,我调试了(按照this advice)并且调试器没有在检测器中设置的断点处停止。 在我的 IssueRegistry 的获取问题中设置的 println 被执行(两次)。 我试图在终端中运行lint --list./gradlew lint --list,但这些都不起作用(lint 不存在,--list 选项分别不存在)。 我还尝试在 build.gradle 中手动启用 lintOptions 中的 lint 检查。

如何执行我的自定义规则?

如何查看可用 lint 规则的列表,或以任何其他方式收集信息?在检查中,不会出现按 id 搜索我的自定义规则。


我的 lint 代码在一个单独的模块中。这是注册表:

class IssueRegistry : IssueRegistry() 
    override val api: Int = CURRENT_API

    override val issues: List<Issue> get() = listOf(
        DispatchersDetector.ISSUE,
        ImportsDetector.ISSUE,
    ).also  println("creating issue registry!!!!!!!!!!") 

我在 resources/META_INF/services/my.package.lintrules.IssueRegistry 中也有一个文件,我认为这不是必需的(我已尝试添加和删除它)。它包含my.package.lintrules.IssueRegistry

这是 lintrules 模块的 gradle(Kotlin DSL,但我也尝试过 groovy 以防万一,但没有运气)(我也尝试过 VERSION_1_7 for Java):

plugins 
    id("java-library")
    id("kotlin")


java 
    sourceCompatibility = JavaVersion.VERSION_1_8
    targetCompatibility = JavaVersion.VERSION_1_8


dependencies 
    compileOnly("org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlinVersion")
    compileOnly("org.jetbrains.kotlin:kotlin-reflect:$kotlinVersion")
    compileOnly("com.android.tools.lint:lint-api:$Versions.lint")
    compileOnly("com.android.tools.lint:lint-checks:$Versions.lint")

    testImplementation("junit:junit:$jUnitVersion")
    testImplementation("com.android.tools.lint:lint:$Versions.lint")
    testImplementation("com.android.tools.lint:lint-tests:$Versions.lint")
    testImplementation("com.android.tools:testutils:$Versions.lint")


tasks 
    jar 
        manifest 
            attributes(
                "Lint-Registry-v2" to "my.package.lintrules.IssueRegistry"
            )
        
    

我添加了 kotlin 标准库并反射以删除一些关于版本冲突的警告。它仍然抱怨使用不同版本的标准库和反射。 我使用以下版本: android gradle=4.1.1;皮棉=27.1.1;科特林=1.4.10;安卓工作室=4.1.1.

在应用程序 build.gradle 中,我在依赖项中添加了 lintChecks(project(path = ":lintrules"))

【问题讨论】:

27.1.1 中似乎有一个针对 lint 包的错误。尝试恢复到 27.0.1。我遇到了同样的问题,自定义 lint 检查停止执行并恢复到 27.0.1 修复它。 它必须是别的东西,因为我有同样的问题 27.0.1 @lotdrops 你能解决这个问题吗? 【参考方案1】:

问题是我将问题参数androidSpecific 设置为false,它应该设置为null。 根据文档:如果此问题仅适用于 Android,则为 true,如果根本不适用于 Android,则为 false,如果未指定或应在所有平台上运行,则为 null。

【讨论】:

以上是关于自定义 android lint 规则未执行的主要内容,如果未能解决你的问题,请参考以下文章

添加自定义 Lint 规则

Android 自定义Lint 基础教程

使用 Angular 7 和 `ng lint` 在 TypeScript 中自定义 TSLint 规则

执行删除规则时未调用自定义对多关系访问器方法

如何将 ESLnt 自定义规则目录添加到 VSCode

编写自定义 lint 警告以检查自定义注释