未执行自定义 android lint 规则
Custom android lint rules not being executed
我已经创建了两个自定义 lint 规则并验证了它们在单元测试中是否按预期工作。但是,当我尝试使用 ./gradlew app:lint
对整个项目进行 运行 lint 时,这些规则不会被执行。
为了验证它们没有被执行,我进行了调试(在 this advice 之后)并且调试器没有在检测器中设置的断点处停止。
在我的 IssueRegistry 的获取问题中设置的 println 被执行(两次)。
我曾尝试在 lint --list
中 运行 和终端中的 ./gradlew lint --list
,但这些工作的 none (分别不存在 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 对于 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 stdlib 和 reflect 以删除一些关于版本冲突的警告。它仍然抱怨使用不同版本的 stdlib 和 reflect。
我使用以下版本: android gradle=4.1.1;棉绒=27.1.1;科特林=1.4.10; android工作室=4.1.1.
在应用程序中 build.gradle 我在依赖项中添加了 lintChecks(project(path = ":lintrules"))
。
问题是我将 Issue 参数 androidSpecific
设置为 false
,它应该设置为 null
。
根据文档:如果此问题仅适用于 Android,则为 true;如果根本不适用于 Android,则为 false;如果未指定或应该 运行,则为 null在所有平台上。
我已经创建了两个自定义 lint 规则并验证了它们在单元测试中是否按预期工作。但是,当我尝试使用 ./gradlew app:lint
对整个项目进行 运行 lint 时,这些规则不会被执行。
为了验证它们没有被执行,我进行了调试(在 this advice 之后)并且调试器没有在检测器中设置的断点处停止。
在我的 IssueRegistry 的获取问题中设置的 println 被执行(两次)。
我曾尝试在 lint --list
中 运行 和终端中的 ./gradlew lint --list
,但这些工作的 none (分别不存在 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 对于 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 stdlib 和 reflect 以删除一些关于版本冲突的警告。它仍然抱怨使用不同版本的 stdlib 和 reflect。
我使用以下版本: android gradle=4.1.1;棉绒=27.1.1;科特林=1.4.10; android工作室=4.1.1.
在应用程序中 build.gradle 我在依赖项中添加了 lintChecks(project(path = ":lintrules"))
。
问题是我将 Issue 参数 androidSpecific
设置为 false
,它应该设置为 null
。
根据文档:如果此问题仅适用于 Android,则为 true;如果根本不适用于 Android,则为 false;如果未指定或应该 运行,则为 null在所有平台上。