我正在尝试从我的库中构建一个@aar包,用作客户端项目中的依赖项.
在我的库模块中,我正在使用:
compileOptions{ sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 }
在达到客户端依赖关系之前,我想要解决代码并使其与Java 7兼容.这意味着我需要实际提供一个@aar包,其中Lambda函数和所有其他Java 8相关功能已经移植到Java 7字节码.
我面临的问题是在库模块上使用:
apply plugin: 'com.android.library'
没有执行desugaring任务,这意味着字节码包含Java 8相关的导入,如:
java.lang.invoke.LambdaMetafactory
这将迫使我的客户端将他的编译选项更新为JavaVersion.VERSION_1_8,这是我想要避免的事情.
所以作为最后一个问题:
令人厌恶的任务是由’com.android.library’插件执行还是仅在’com.android.application’插件中可用?如果是这种情况,请你帮我提一下如何将这一步也包含在库插件中?
解决方法
“com.android.library”插件不会故意执行desugaring任务,因为aar文件包含.class文件的存档(与.dex文件相对).所以这里不适用desugaring(以及dexing).
当然,有误导的是,在库项目中,仍然需要指定Java 8支持选项,尽管它们实际上并不重要(为了生成.aar文件,无论如何都将只有javac步骤,没有desugaring / dexing ):
更新:第二个想法 – 我现在确信这是’com.android.library’插件中的一个错误. Desugaring仍然会生成.class文件,所以没有强大的理由可以跳过desugar步骤,如果这是由gradle.build配置规定的,例如:
compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_7 }