【问题标题】:Lint doesn't detect "calling new methods on older versions" - what can be done?Lint 没有检测到“在旧版本上调用新方法” - 可以做什么?
【发布时间】:2014-11-25 13:12:05
【问题描述】:

最近我想研究将我的应用的向后兼容性从 API 16 提高到 14 的可能性。

我尝试了什么:

为了查看可能需要修复的问题,我将清单中的 android:minSdkVersion 更改为 14 并重建了项目。令我惊讶的是,它构建得很好(这有点可疑),所以我将minSdkVersion 设置为1 看看会发生什么。此时,Attribute unused on older versions 类型的清单中出现了一些警告,但在尝试重建项目时它成功完成。我尝试Analyze > Inspect code... 并没有发现这种性质的错误(即使应该有很多)。我还尝试禁用和重新启用过滤器(见图)并重新启动 IntelliJ - 但无济于事。

我的问题:

  1. 这可能是一个错误,还是我做错了什么?
  2. 是否有更好的方法来测试向后兼容性?

附加信息:

  • 如果重要的话,我正在与其他几个人一起使用代码存储库处理这个项目(我认为我可能下载了一些损坏的设置文件,但我认为我已经排除了这种情况)。
  • 我的 IntelliJ 版本是 13.1.4

谢谢!

【问题讨论】:

  • 你在用 Gradle 构建吗?
  • 只有当 Lint 是 IntelliJ IDEA 的 Android 插件的一部分时,您的方法才有效。我不直接使用 IDEA(仅在其 Android Studio 风格中),所以我不知道 Lint 是否是插件的一部分。
  • @kcoppock - 否定的,只是普通的 IntelliJ(据我所知)。 @CommonsWare - 图像中的选项出现在Android > Android Lint 下,所以我想它是 Android 插件的一部分...
  • 好的,所以没有 build.gradle 脚本。我的理论是您的 minSdkVersion 可能被 Gradle 脚本覆盖。您可以尝试仅运行 API 检查吗? (分析 > 按名称运行检查... > 在旧版本上调用新方法)。确保检查范围是您的整个项目,并且您没有可能过于严格的文件名过滤器。
  • @kcoppock - 有效:) 感谢您的提示! (我想我只是在“主模块”的范围内运行它)。我仍然不清楚为什么 lint 没有在文件中显示它......这是一个主要的陷阱,不应该编译恕我直言(可能导致崩溃,不是吗?)......:\

标签: android intellij-idea intellij-13


【解决方案1】:

确保您的检查范围设置为您的整个项目:

您仍然能够正常编译的原因是调用这些较新的方法是完全可以接受的,前提是您通过版本检查专门保护您的调用。例如:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
    myView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
} else {
    // Hardware acceleration not supported -- do nothing!
}

为了防止出现任何警告,您可以使用@TargetApi注释调用方法,例如:

@TargetApi(Build.VERSION_CODES_HONEYCOMB)
public void setLayerType(View view, int layerType) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        myView.setLayerType(layerType, null);
    } else {
        // Hardware acceleration not supported -- do nothing!
    }
}

编辑:另外,要获得内联警告,请确保在项目默认检查配置文件中启用此检查:

最终编辑:另外,请确保在某处未定义 lint.xmllint-rules.xml,这可能会覆盖这些问题的预期严重性级别。请参阅the following link 了解更多信息。

【讨论】:

  • 检查已启用(如我的屏幕截图所示),但这些内容应该显示为错误,但我在文件本身中没有看到任何 lint 消息(这让我感到困扰大多数)。
  • 您可能应该考虑在某个时候迁移到 Android Studio。对我来说,这些显示为红色错误消息。 (但是,它们不会阻止您的应用程序编译)。
  • 理论上不是一样的吗?
  • Android Studio 通常在任何时候都有更多的功能。在某些时候,它们最终会回到插件中并回到 IntelliJ,但这可能需要一段时间。可能有一些特定于 Android Studio 的功能。
  • 你完全正确!罪魁祸首是一个 'lint.xml' 文件,其中填充了 ''...一旦删除,错误就开始出现。 The diagram on this page helped。随时将此添加到您的答案中:-)
猜你喜欢
  • 2017-02-14
  • 1970-01-01
  • 1970-01-01
  • 2016-03-11
  • 2023-04-02
  • 2022-08-22
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
相关资源
最近更新 更多