Android - @aar包中的Desugar类

Mar*_*tin 8 android android-library java-8 aar

我正在尝试从我的库中构建一个@aar包,用作客户端项目中的依赖项.

在我的库模块中,我正在使用:

compileOptions{
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}
Run Code Online (Sandbox Code Playgroud)

在达到客户端依赖关系之前,我想要解决代码并使Java 7兼容.这意味着我需要实际提供一个@aar包,其中Lambda函数和所有其他Java 8相关功能已经移植到Java 7字节码.

我面临的问题是在库模块上使用:

apply plugin: 'com.android.library'
Run Code Online (Sandbox Code Playgroud)

没有执行desugaring任务,这意味着字节码包含Java 8相关的导入,如:

java.lang.invoke.LambdaMetafactory
Run Code Online (Sandbox Code Playgroud)

这将迫使我的客户端将他的编译选项更新为JavaVersion.VERSION_1_8,这是我想要避免的事情.

所以作为最后一个问题:'com.android.library'插件执行的desugaring任务是仅在'com.android.application'插件中可用?如果是这种情况,请你帮我提一些关于如何将这一步也包含在库插件中的提示?

Vit*_*nko 1

“com.android.library”插件不会故意执行脱糖任务,因为 aar 文件包含 .class 文件的存档(相对于 .dex 文件)。因此,这里不应用脱糖(以及去糖化)。

当然,令人误解的是,在库项目中,仍然被迫指定 Java 8 支持选项,尽管它们实际上并不重要(无论如何,只有 javac 步骤,没有脱糖/dexing,以便生成 .aar 文件):

在此输入图像描述

更新:第二个想法 - 我现在确信这“com.android.library”插件中的一个错误。脱糖仍然会生成 .class 文件,因此如果 gradle.build 配置规定了脱糖步骤,则没有充分理由跳过脱糖步骤,例如:

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_7
}
Run Code Online (Sandbox Code Playgroud)