【发布时间】:2017-06-01 14:12:40
【问题描述】:
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(来自 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 manager 时,它显示 Android SDK Tools 版本是 25.2.5(我已经更新到最新版本)。那么这是lint-api.jar 的版本吗(或者是SDK 平台工具、SDK 构建工具、..)?
【问题讨论】:
标签: android lint timber-android