@SuppressLint有什么用(“InlinedApi”)

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

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

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

我发现了这个.. @SuppressLint(“InlinedApi”)表示Lint应该忽略带注释元素的指定警告。

  Exp: SuppressLint implements from Annotation Class. android.annotation.SuppressLint like this.. Built-In Annotations 

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

 http://developer.android.com/reference/java/lang/annotation/Annotation.html http://developer.android.com/reference/android/annotation/SuppressLint.html 

以下是Google codelab的示例:

 @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消息popup窗口时按“更多”键组合(例如Cmd + F1 ),则可以在Android Studio中看到它。 您也可以通过命令行上的lint获取它,类似于@ stan0所说的,但更详细地说:

 lint --show InlinedApi 

这是详细的解释:

InlinedApi

简介:在旧版本上使用内联常量

优先级:6/10

严重性:警告

类别:正确性

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

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

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