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 项目
- 添加木材
- 为 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 (from 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 使用的)。
所以我认为这只是版本不匹配。但我不确定如何解决这个问题。
我怎么能确定lint-api.jar
我当前的 android 工具有哪个版本?
当启动 sdk manager 时,它显示 Android SDK Tools 版本是 25.2.5(我已经更新到最新版本)。那么这是lint-api.jar
(或者是SDK 平台工具,SDK 构建工具,..)的版本?