繁体   English   中英

确定 Java 语言功能是否在特定 Android SDK(平台)中可用

[英]Determine if Java language feature is available in particular Android SDK (platform)

我正在学习 Android 开发,我注意到 findViewById() 的文档说转换其返回的对象是不必要的:

<Android API 26 Platform>
... resulting view is automatically cast to the target class type...

如果不需要的话,我宁愿不强制转换(编写和读取的代码更少!),但这似乎是 Java 8 的一个特性。 但我希望我的应用程序能够在 19 岁(Kitkat)的平台上运行。

页面https://developer.android.com/studio/write/java8-support.html似乎没有涵盖 Java 8 中可用的自动类型转换,SO 上的各种其他问题/答案表明 Java 8 的某些功能是一直可用到 SDK 9。

首先,如何判断某个 Java 语言功能是否在我的目标 SDK 范围内? 其次,多年以来的平台 API 怎么可能支持新的语言特性?

如果您的compileSdkVersion is >= 26Android OcompileSdkVersion is >= 26 findViewById()返回的对象。 它与 java 8 无关。

如果特定 API 不受支持或弃用,Android Studio 将根据 API 显示错误或警告。

帖子表明“这与 Java 8 无关”。 这似乎只是部分正确,但不会使我的 2 个问题无效。 所以这是我自己的结论,基于我自 OP 以来所做的额外阅读,我将根据响应修复它。

官方文档很清楚: Android 支持... Java 8 语言功能的一个子集,因平台版本而异

请注意术语“语言功能”,而不是“API”。 后者通常是指在特定 SDK 中定义且可从您的代码访问/调用的常量、类和类成员(以及对于方法,它们的签名); 而“语言特性”是运算符、优先规则、尝试资源等。因此,尽管“SDK”和“API”经常互换使用,但它们在 Android 上可能不一样:SDK 可能是 API +工具(如编译器、转译器、错误检查脚本等)。

这句话暗示,随着 SDK 级别的提高,越来越多的 Java 8 规范语言特性得到支持 关键词是“受支持”:如果 SDK 27 支持语言特性A,但 26 不支持,并且您使用compileSdk: 27编译您的程序,并且它在平台 26 的 Android 设备上正确运行(这假设您的程序不支持使用任何新的 API 27,它只是使用新的语言功能,如新的运算符等),有什么魔力在起作用?

我唯一的解释(我希望我的 OP 中第二个问题的答案)是我发布时不知道的附加编译:从 Java 编译器生成的 Java 字节码(.class 文件)被转译为 DEX 格式。 这个额外的步骤涉及一个工具,它不是 API 的一部分,但可能是 SDK 的一部分。 这个 DEX 编译器是实现语言特性的地方:如果 DEX 编译器不知道如何转译 Java 字节码,那么 Android 不支持该运算符。 这表明在可能的情况下,新的 Java 字节码可能不会转换为新的 DEX 字节码; 相反,它们被转换为等效的 DEX 字节码序列,在较旧的平台(具有较旧的 Dalvik VM)中执行操作。 当这种等效性难以确定时,就是 minSdk 受到影响的时间(那么旧的 Dalvik VM 根本无法运行 DEX 文件)。

对于我的第一个问题,每个 SDK 可能都包含“检查规则”,用于检查 DEX 编译器尚不支持的那些 Java JDK 功能,因此判断给定 SDK 范围内是否支持 JAVA 语言功能的方法是 lint ,并假设 linter 使用的检查规则正确标记所有问题(没有误报或误报)。

欢迎任何更正!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM