Android coreLibraryDesugaring支持Java 11 API范围及异常
核心问题根因
你遇到的两个编译错误,本质是desugar依赖版本与API的覆盖范围不匹配,不是配置语法或者Android Studio版本的问题。
- 你当前使用的
desugar_jdk_libs:1.1.5是较早的核心库脱糖版本,覆盖范围仅包含Java 8标准库、以及Java 9引入的部分增量API(比如你能正常使用的List.of()),但不包含Java 10/11新增的List.copyOf()静态方法,因此编译时找不到对应方法。 LambdaMetafactory属于java.lang.invoke包下的类,这个包的相关实现没有被纳入1.1.5版本的脱糖打包范围。你在desugar源码仓库看到的对应实现,属于后续开发中未合入正式发布版本的内容,并不会被打包到1.1.5版本的正式发布包里,因此编译时无法识别这个类。
如何判断某API在脱糖环境下是否可用
判断逻辑非常直接,不要参考源码仓库的主干开发代码,只看两个核心依据:
- 第一,确认你开启的是核心库脱糖而非仅开启语言特性脱糖:前者负责把高版本JDK的类、方法实现打包进APK,兼容低版本系统;后者只是把高版本语法转成兼容字节码,不会新增类或方法。
- 第二,查询你实际依赖的
desugar_jdk_libs版本对应的官方支持清单:Google每发布一个desugar版本,都会明确列出该版本覆盖的所有类、方法范围,只有清单里收录的API,才能被正常编译和运行。源码仓库里未正式发布到对应版本的API,即便存在也不会被打进你构建用的jar包,无法使用。
脱糖功能的实际支持边界
- 核心库脱糖不会覆盖所有Java高版本的API:Google会优先选择安卓开发场景下高频使用的API(比如集合类、时间API、常用工具类),冷门、依赖JVM底层专有特性的类不会被纳入支持范围。
- 脱糖兼容的系统下限非常低:你要求兼容Android 10的需求完全可以满足,哪怕是更早的Android 5.0系统,只要开启对应版本的脱糖,都能运行被支持的API,不需要依赖系统自带的JDK实现。
- 语言特性脱糖和核心库脱糖是独立的:Java 11的语法特性(比如
var、lambda、新版switch语法)只要AGP版本支持,不需要依赖核心库脱糖就能编译;但类、方法这类库层面的API,必须依赖核心库脱糖的打包能力。
针对你当前场景的修复步骤
- 调整build.gradle里的desugar依赖版本,根据你的需求选择对应版本:
- 仅需要解决
List.copyOf()的编译问题,将依赖替换为com.android.tools:desugar_jdk_libs:1.2.2即可,这个版本开始正式收录Java 10/11的集合类新增方法。 - 需要同时使用
LambdaMetafactory类,需要将依赖替换为com.android.tools:desugar_jdk_libs:2.0.4,这个版本已经把java.lang.invoke包下的常用类纳入脱糖打包范围。
- 仅需要解决
- 注意版本兼容要求:desugar 2.0.4需要配套AGP 7.2及以上版本,你当前使用的Arctic Fox Canary版本可以通过升级对应AGP配置满足要求,调整完成后重新同步项目,原来的两处编译错误就会消失。
内容的提问来源于stack exchange,提问作者Xtra Coder
相关产品推荐
相关产品推荐

