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生成工具等)?