Android中的Desugaring

前言

自从 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以及它与所有这些东西有什么关系。

什么是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功能。

  • 将 Android gradle 插件设置为4.0或更高版本。
  • 在编译选项中,启用coreLibraryDesugaringEnabled标志并将 Java目标和源兼容性设置为 Java 8。
  • 启用multidex(适用于支持 API 级别 20 或以下的项目)
  • 添加desugaring依赖
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.5'
​

在引擎盖下

那么这里到底发生了什么?操作系统中缺失的 Java 类是如何突然出现的?由于D8/R8工具,这一切皆有可能。在深入了解他们如何做到这一点之前,让我们先了解一下历史,以了解这些工具到底是什么。

探索 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 库提供向后兼容性的工具。当我们想到它时,这是一个非常简单的概念,但要从内到外理解它,我们需要了解一些围绕它的东西。我希望你能从这个文章中得到一些有用的东西。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值