木材梁:ClassNotFound: com/android/tools/lint/detector/api/Detector$JavaPsiScanner

4

Timber (版本号 4.5.0) 的代码检查只能通过 Gradle 实现(而不能通过 lint 命令或 Android Studio 版本 2.3 Beta2 实现)。

摘要

当我直接在命令行上运行 lint 时会出现错误。

lint --show TimberArgCount

Could not load custom rule jar file /home/tmtron/.android/lint/timber-lint.jar
java.lang.NoClassDefFoundError: com/android/tools/lint/detector/api/Detector$JavaPsiScanner

但是当我通过gradle调用它时,它能够正常工作:

./gradlew lint

MainActivity.java:15: Error: Wrong argument count, 
format string %s.%s requires 2 but format call supplies 1 [TimberArgCount]
        Timber.d("%s.%s", "onCreate");
        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

详细描述

我在GitHub上制作了一个小型示例项目:TimberLintTest

基本上我做了以下事情:

  • 在Android Studio中创建了一个简单的Android项目
  • 添加了Timber库
  • 为lint错误激活了标准输出 android { lintOptions { textReport true textOutput "stdout" } }

MainActivity中,我使用了错误的日志语句,如下所示:

Timber.d("%s.%s", "onCreate");

当我通过命令行使用Gradle-wrapper执行lint时,它按预期工作-输出已剥离:

MainActivity.java:15: Error: Wrong argument count, 
format string %s.%s requires 2 but format call supplies 1 [TimberArgCount]
        Timber.d("%s.%s", "onCreate");
        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

但是在Android Studio中检查不起作用,直接启动lint时也不行。
互联网上的一些源代码指出我们必须将lint.jar文件复制到~/.android/lint中。我已经为timber-4.5.0的lint.jar这样做了,并将其重命名为timber-lint.jar,因此我最终得到了这个文件:

~/.android/lint/timber-lint.jar

所以问题是这个JavaPsiScanner接口找不到。
我已经检查了Timber源代码,它依赖于lint-api-25.0.2,其中Detector包含这个内部接口。但是在我的本地SDK代码(Android/Sdk/tools/lib/lint-api.jar)中,这个内部类不存在(我猜这就是lint命令行工具和Android Studio使用的内容)。
所以我认为这只是版本不匹配的问题。但是我不确定如何解决这个问题。
我应该如何确切地知道我的当前android工具中有哪个版本的lint-api.jar
当启动sdk管理器时,它显示Android SDK工具的版本为25.2.5(我已更新到最新版本)。那么这就是lint-api.jar的版本吗(还是SDK平台工具SDK生成工具等)?
3个回答

0

运行 lint 时,defaultPublishConfig/flavor 不应为“debug”。 要在 Debug 变体上运行 lint,请使用

gradlew lintDebug

请参阅使用 lint 检查改进您的代码


0

作为一种解决方法,我们可以告诉Gradle在编译后始终运行lint检查。然后,在您在Android Studio中按下Build - Make Project之后,lint检查也将被执行,这解决了我的原始问题。

有关Gradle的详细信息,请参见此SO答案


0

更改 Android Gradle 插件 3.0.0 或更新版本


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接