问题 @SuppressLint有什么用(“InlinedApi”)


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


1552
2017-10-10 09:23


起源

嗯,这是一个很好的问题,我能够找到这个 Note: Since XY requires Android 3.0 (API version 11) or later, setting your app's minSdkVersion to 10 or below generates an Android Lint warning in Eclipse with ADK. To turn off this warning, add the annotation @SuppressLint("InlinedApi") before the definition of XY  这里。所以它似乎和“newApi”一样,也许它是某种类型的前身? - avalancha


答案:


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

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


14
2017-10-10 10:29



这真的很有帮助。我还在考虑一个需要使用的实际情况,即在旧平台上无法工作的任何字段示例? - faizal


我找到了这个..       @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

1
2017-10-10 12:05



这是有关注释的一般信息,以及抑制Lint警告的一般信息。但这里的问题具体是关于 "InlinedApi" 皮棉警告。 - LarsH


这是一个例子 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中看到它(例如 CMD+F1)当lint消息弹出窗口打开时。您也可以通过命令行上的lint获取它,类似于@ stan0所说的,但更详细地说:

lint --show InlinedApi

这是详细的解释:

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

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

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

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

(资源)

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


1
2018-02-02 17:42



@Jon感谢您抓住我的坏链接。 - LarsH