我在某些代码中遇到了@SuppressLint("InlinedApi")
我无法在线找到任何相关描述。我理解当我们编写的代码高于清单中提到的minsdk时,@SuppressLint("NewApi")
用于隐藏警告。但我无法弄清楚何时应该使用“InlinedApi”。有什么想法吗?
答案 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级别。
希望有了这个解释,很清楚为什么这不是一个致命的错误(因为常量的值被复制到类文件而不是引用中),为什么它仍然有潜在危险,什么时候压制警告在上面的codelab示例中,作者显然决定添加一个在旧设备上无法识别的标记是安全的。也许他有信息表明无法识别的标志会被忽略,尽管我在documentation中看不到。