@SuppressLint有什么用(" InlinedApi")

时间:2013-10-10 09:23:08

标签: android

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

3 个答案:

答案 0 :(得分:16)

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

  

“InlinedApi”:查找内联字段,这些字段可能适用于旧版本,也可能不适用   平台

答案 1 :(得分: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

答案 2 :(得分:1)

以下是a 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警告而不是致命的编译错误?

警告的更全面的描述是好的和有益的。如果按下"更多"您可以在Android Studio中看到它。当lint消息弹出窗口打开时,键组合(例如 Cmd + F1 )。您也可以通过命令行上的lint获取它,类似于@ stan0所说的,但更详细地说:

lint --show InlinedApi

以下是详细解释:

  

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

     

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

     

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

     

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

(source)

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