【问题标题】:timber lint: ClassNotFound: com/android/tools/lint/detector/api/Detector$JavaPsiScanner皮棉:ClassNotFound:com/android/tools/lint/detector/api/Detector$JavaPsiScanner
【发布时间】: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


    【解决方案1】:

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

    Gradle 详情在this SO-answer

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        gradlew lintDebug

        参考Improve your code with lint checks

        【讨论】:

          猜你喜欢
          • 2012-11-16
          • 2013-11-14
          • 1970-01-01
          • 1970-01-01
          • 2014-03-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多