timber lint:ClassNotFound:com / android / tools / lint / detector / api / Detector $ JavaPsiScanner

时间:2017-01-17 13:28:10

标签: android lint timber-android

Timber(V 4.5.0)lint检查仅通过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错误激活了stdout输出 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。我为lint.jar(来自timber-4.5.0)做了这个并将其重命名为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 Tools版本为25.2.5(我已更新到最新版本)。那么这是lint-api.jar的版本(还是 SDK平台工具 SDK构建工具,...)?

3 个答案:

答案 0 :(得分:0)

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

Gradle详细信息位于this SO-answer

答案 1 :(得分:0)

更改Android Gradle Plugin 3.0.0或更新版

答案 2 :(得分:0)

运行lint时,

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

gradlew lintDebug

请参阅Improve your code with lint checks