支持更新的Java语言API - Android开发者 - Medium
支持更新的 Java 语言 API:Android 开发者指南
在开发需要处理时间计算的应用程序时,你可能会通过搜索找到 java.time 包的优秀示例。然而,当应用上线后,却可能因 API 崩溃而收到大量用户投诉。这是因为某些设备并未包含必要的类,而这些类在当时并不是 Android 的一部分。
Android 对 Java API 的持续更新
每次 Android 发布新版本时,都会从 OpenJDK 添加新的 Java API。例如,在 Android 11 中,新增了许多 API 支持,包括来自 OpenJDK 13 的 List、Set、Map 和 java.time API 等。然而,为了让这些 API 能在旧设备上使用,Android 也提供了相应的解决方案。
如果你使用 Android Gradle 插件(AGP)4.0.0 或更高版本,现在可以在任何 Android 设备上使用数百个来自更新 OpenJDK 版本的 API。这些 API 的支持通过两种方式实现:
- 在 Android 11 中通过后台移植支持。
- 在旧设备上通过降级运行时支持。
什么是“脱糖”(Desugaring)?
Android Gradle 插件 4.0 为某些 API 提供了内置支持,包括第三方库的使用。通过一种称为“脱糖”的技术,这些 API 现在几乎可以在所有 Android 版本上使用。
脱糖的工作原理
- Java 编译:Java 源代码首先被编译为字节码。
- 字节码转换:工具链对应用及其依赖的第三方库执行字节码转换,将新的 API 转换为兼容的 dex 代码。
- 运行时支持:对缺失的运行时类,工具链会添加必要的 Java 8 运行时代码,并作为单独的 dex 库包含在应用中。
通过脱糖技术,一组 Java 8 API 可以在所有现有设备上运行,除了 API 21 级支持的并行设备。
如何启用 Java 8+ API 支持
要开始使用更新的 Java API,请按照以下步骤操作:
- 将 Android Gradle 插件更新到 4.0 或更高版本。
- 在模块的
build.gradle文件中添加以下配置:- 设置
coreLibraryDesugaringEnabled标志。 - 将 Java 源和目标兼容性设置为 Java 8。
- 添加
coreLibraryDesugaring作为依赖项。 - 启用多功能支持。
- 设置
插件会编译一个单独的 DEX 文件,包含缺失 API 的实现,并将其包含在应用中。
新增 API 示例
1. ZonedDateTime 和 OffsetDateTime
ZonedDateTime:表示包含LocalDateTime、ZoneId和解析的ZoneOffset的不可变日期时间。- 使用
ZoneId设置时区(支持缩写或长文本形式)。 - 可解析为任何时区,适合在不同设备或应用上下文中使用。
- 使用
OffsetDateTime:适合将日期时间数据存储到数据库或其他需要序列化的场景。
两者的主要区别在于:
ZonedDateTime适合显示时区敏感的日期时间数据。OffsetDateTime更适合存储和序列化数据。
2. 流(Streams)
流允许对集合执行函数式操作,具有以下特点:
- 不存储数据或修改底层数据结构。
- 提供更好的代码可读性。
- 支持大量内置的中间操作和终端操作。
- 中间操作:懒惰执行,总是返回新流。
- 终端操作:渴望执行,完成数据源遍历后流不可再用。
流在处理大型数据源时表现尤为出色。
3. java.util 包的新特性
- 比较器(Comparator):通过方法句柄和 Lambda 表达式,简化了比较器的编写。
Optional类:用于避免空引用问题,支持OptionalInt、OptionalLong和OptionalDouble等原始类型。- 使用实用方法处理值是否“可用”或“不可用”。
4. 并发更新
AtomicInteger、AtomicLong和AtomicReference:在java.util.concurrent.atomic包中新增了方法。ConcurrentHashMap:修复了 API 21 和 22 中的 bug。通过脱糖库,应用会使用修复后的实现。
总结
通过升级到支持 Java 8+ API 的 Android Gradle 插件,你可以充分利用现代语言特性,如流、Optional 和其他新时代 API。这些特性不仅能帮助你编写更少的代码,还能减少错误的引入。
请务必查看支持的完整 Java 8+ API 列表,以便在项目中充分利用这些更新。
原文链接: https://medium.com/androiddevelopers/support-for-newer-java-language-apis-bca79fc8ef65
最新文章
- 用 Poe-API-wrapper 连接 DALLE、ChatGPT,批量完成AI绘图或文字创作
- RESTful Web API 设计中要避免的 6 个常见错误
- LangGraph 工具详解:构建 AI 多步骤流程的关键利器
- GitHubAPI调用频率限制的增加方法
- 如何使用Route Optimization API优化配送路线
- 什么是聚类分析?
- 安全好用的OpenApi
- 医疗数据管理与fhir api的未来发展趋势
- 为什么要使用Google My Business Reviews API
- 2025年7月第2周GitHub热门API推荐:rustfs/rustfs、pocketbase/pocketbase、smallcloudai/refact
- API设计的首要原则
- 左手用R右手Python系列——百度地图API调用与地址解析/逆解析