NoSuchMethodError_0">getBuildVariant() NoSuchMethodError
在我们自定义的lint规则检查代码时,出现了如下错误:
../../../app: Unexpected failure during lint analysis (this is a bug in lint or one of the libraries it depends on)
Message: com.android.tools.lint.detector.api.Project.getBuildVariant()Lcom/android/tools/lint/model/LintModelVariant;
The crash seems to involve the detector com.lkl.android.lint.checks.detector.xml.ApplicationAttrDetector.
You can try disabling it with something like this:
android {
lintOptions {
disable "ApplicationAttribute"
}
}
Stack: NoSuchMethodError:DetectorUtils.isBuildVariant(DetectorUtils.kt:39)
←ApplicationAttrDetector.visitElement(ApplicationAttrDetector.kt:60)
←ResourceVisitor.visitElement(ResourceVisitor.java:141)
←ResourceVisitor.visitElement(ResourceVisitor.java:177)
←ResourceVisitor.visitFile(ResourceVisitor.java:125)
←LintDriver.runFileDetectors(LintDriver.kt:990)
←LintDriver.checkProject(LintDriver.kt:898)
←LintDriver.analyze(LintDriver.kt:419)
You can set environment variable LINT_PRINT_STACKTRACE=true to dump a full stacktrace to stdout.
这个时候需要检查我们自定义规则时编译的 gradle plugin
、lint
版本跟我们项目里依赖的版本是否一致。
我们发现我们自定义的规则使用的版本如下:
gradlePluginVersion = 4.1.2
lintVersion = 27.1.2
而我们项目代码里自定义plugin里依赖的版本:
发现我们项目里gradle
的版本低了,我们去看26.5.4
的lint
版本的api里确实找不到getBuildVariant
方法,因此我们有如下修改方案:
该方案需要改自定义lint的源码,找到旧版本里的替换方案。
升级版本需要解决一些版本兼容问题,不过对于未来发展的话,尽量采用该方案。使用新的版本,才能更好的拥抱变化,体验新的特性。