17

我遇到@SuppressLint("InlinedApi")了一些我正在经历的代码,但在网上找不到任何关于它的描述。我明白@SuppressLint("NewApi")用于在我们编写高于清单中提到的 minsdk 的代码时隐藏警告。但我无法弄清楚何时应该使用“InlinedApi”。有任何想法吗?

4

3 回答 3

16

通过执行lint --list(lint 工具位于您的sdk/tools目录中),您可以看到有效问题 ID 的列表。你可以找到InlinedApi那里的解释:

“InlinedApi”:查找在旧平台上可能有效或无效的内联字段

于 2013-10-10T10:29:18.613 回答
5

这是来自Google 代码实验室的示例:

@SuppressLint("InlinedApi")
private void hideSystemUi() {
    mPlayerView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE
            | View.SYSTEM_UI_FLAG_FULLSCREEN
            | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
            | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
}

如果您注释掉@SuppressLint("InlinedApi"),您会收到以下 lint 警告:

字段需要 API 级别 19(当前最低为 16):android.view.View#SYSTEM_UI_FLAG_IMMERSIVE_STICKY

因此,您正在访问的字段可能不存在于您说过希望能够在其上运行设备的某些设备的 API 中。在那种情况下,为什么它只是一个 lint 警告而不是致命的编译错误?

警告的更完整描述很好而且内容丰富。如果在 lint 消息弹出窗口打开时按下“更多”组合键(例如Cmd+ ),您可以在 Android Studio 中看到它。F1您也可以通过命令行上的 lint 获取它,类似于 @stan0 所说的,但更详细:

lint --show InlinedApi

以下是详细解释:

InlinedApi
----------
总结:在旧版本上使用内联常量

优先级:6 / 10
严重性:警告
类别:正确性

此检查扫描应用程序中的所有 Android API 字段引用并标记某些常量,例如静态最终整数和字符串,它们是在以后的版本中引入的。这些实际上将被复制到类文件中而不是被引用,这意味着即使在旧设备上运行该值也是可用的。在某些情况下这很好,而在其他情况下,它可能会导致运行时崩溃或不正确的行为。这取决于上下文,因此请仔细考虑代码并决定它是否安全并且可以被抑制,或者代码是否需要被保护。[重点补充]

如果你真的想使用这个 API 并且不需要支持旧设备,只需在 build.gradle 或 AndroidManifest.xml 文件中设置 minSdkVersion。如果您的代码故意访问较新的 API,并且您已确保(例如通过条件执行)此代码只会在受支持的平台上被调用,那么您可以使用 @TargetApi 注释指定本地最小 SDK 来注释您的类或方法应用,例如 @TargetApi(11),以便此检查将 11 而不是清单文件的最低 SDK 视为所需的 API 级别。

(资源)

希望通过这种解释,很清楚为什么这不是致命错误(因为常量的值被复制到类文件而不是引用中),为什么它仍然具有潜在危险,以及何时抑制警告。在上面的 codelab 示例中,作者显然认为添加在旧设备上无法识别的标志是安全的。也许他有信息表明无法识别的标志会被默默地忽略,尽管我在文档中没有看到。

于 2018-02-02T17:42:05.600 回答
1

我找到了这个.. @SuppressLint("InlinedApi") 表示 Lint 应该忽略注释元素的指定警告。

  Exp:
  SuppressLint
  implements from Annotation Class.
  android.annotation.SuppressLint like this..

  Built-In Annotations

Java 定义了一组注释,这些注释内置于应用于 java 代码的语言注释中: @Override - 检查该方法是否为覆盖。如果在父类或实现的接口之一中找不到该方法,则会导致编译错误。@Deprecated - 将该方法标记为已过时。如果使用该方法,则会导致编译警告。@SuppressWarnings - 指示编译器抑制注释参数中指定的编译时警告

http://developer.android.com/reference/java/lang/annotation/Annotation.html
http://developer.android.com/reference/android/annotation/SuppressLint.html
于 2013-10-10T12:05:29.920 回答