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 {
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构建工具,...)?
答案 0 :(得分:0)
作为一种解决方法,我们可以告诉gradle在编译后始终运行lint检查。然后,在Android Studio中按 Build - Make Project 后,也会执行lint检查,这解决了我原来的问题。
Gradle详细信息位于this SO-answer。
答案 1 :(得分:0)
更改Android Gradle Plugin 3.0.0或更新版
答案 2 :(得分:0)
defaultPublishConfig / flavor不应为“调试”。 要在Debug变体上运行lint,请使用
gradlew lintDebug