赞
踩
自从 Kotlin 成为 Android 开发的推荐语言以来,大多数开发人员已经从 Java 转向 Kotlin。Kotlin 无疑超出了所有人的预期,现在是许多人最喜欢的语言。就我自己和 Android 开发人员的观点而言,如果有人要求我切换回 Java,我会想一百万次才放弃 Kotlin-first API 提供的所有好处。
但是,Oracle 的人们一直在努力改进 Java。例如,Java 10 的var声明变量的特性和 Java 8 的time API & stream API。Time API 实际上比经典的 DateTime API 有很多改进,例如Duration、Period等等。我会把这部分留给你去探索,现在让我们谈谈什么是desugaring以及它与所有这些东西有什么关系。
开发任何新的 Android 操作系统时,都会附带一堆 Java 类,这些类为需要这些类才能运行的应用程序提供支持。让我们考虑一下这种情况下的 Time API。它被添加到 Android API 级别 26,因此,使用此库的应用程序将在较低的 API 级别上崩溃,例如 Marshmallow (API 23)。
这是desugaring出现的时候。它允许较低的 API 级别使用新的 Java 库。我们将看到它是如何做到的,但在此之前,让我们启动 Android Studio 进行快速演示,以使事情更清楚。
保持简短,我将使用新的 Time API 打印出当前月份,然后在 Android R (API 30) 和 Android M (API 23) 上对其进行测试。
tv_month.text = LocalDate.now().month.name
正如预期的那样,它在 API 30 上工作,但在 API 23 上失败并出现NoClassDefFoundError异常。要解决此问题,我们需要使用以下步骤在我们的项目中启用desugaring功能。
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.5'
那么这里到底发生了什么?操作系统中缺失的 Java 类是如何突然出现的?由于D8/R8工具,这一切皆有可能。在深入了解他们如何做到这一点之前,让我们先了解一下历史,以了解这些工具到底是什么。
Android 开发人员已经使用ProGuard很长时间了,并且在代码压缩和混淆方面已被证明是一个“首选”工具。让我们看看使用 ProGuard 时代码是如何流动的。
源代码由 JVM 转换为字节码。该字节码经过 ProGuard 优化,最后由 dex 编译器转换为 dex 可执行文件。
由于代码在捆绑到 APK 之前必须经过几个阶段,因此构建时间会增加。为了减少这个时间,谷歌在 2015 年左右推出了Jack & Jill 编译器,它做了同样的事情,但在一个阶段。
由于技术和工具的不断进步,该解决方案无法满足新出现的需求。因此,谷歌在 2017 年左右放弃了它,他们回到了经典的编译方式。但这一次,他们重写了 dex 编译器,并引入了一个名为D8的工具。
这被证明是非常成功的,甚至能够支持 Kotlin 的发展。Google 进一步引入了R8代码收缩器,它基本上是 ProGuard 和 D8 的组合。这有助于减少编译过程中的一个阶段。
回到desugaring,D8/R8 阶段是提供缺失 Java 类的真正魔术师。在将我们应用程序的源代码转换为 dex 代码的同时,它还为新的 java 库添加了 dex 代码,然后最终捆绑在 APK 中。该过程如下图所示。
这就是旧的 android API 级别可以使用新的 Java 库的方式!
简单来说,Desugaring是一种为新的 Java 库提供向后兼容性的工具。当我们想到它时,这是一个非常简单的概念,但要从内到外理解它,我们需要了解一些围绕它的东西。我希望你能从这个文章中得到一些有用的东西。
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。