4

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 构建工具,..)的版本?

4

3 回答 3

0

更改 Android Gradle 插件 3.0.0 或更高版本

于 2018-03-29T13:10:06.633 回答
0

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

gradlew lintDebug

请参阅使用 lint 检查改进代码

于 2020-02-19T07:37:44.130 回答
0

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

Gradle 详细信息在这个 SO-answer中。

于 2017-01-30T09:58:29.447 回答