【发布时间】:2021-03-10 00:46:44
【问题描述】:
我正在尝试将一些 Java 库从“普通”JVM 迁移到 android,并坚持使用代码中使用的一些 Java11 API。
我已经得到的第一件事 - Java11 语言功能似乎只适用于 Android Studio 的 Canary 版本,请参阅答案 here
现在我需要了解哪些 API 可以真正使用。这里有两个对我不起作用的用例,如果我做错了什么或者它永远不应该起作用,我就无法理解:
-
List.copyOf()- 在 Java11 中引入,方法copyOf在 android 上不可用。 Java 9 引入的方法“List.of()”工作正常。 -
java.lang.invoke.LambdaMetafactory类 - 随 Java 1.8 引入 - 用于以编程方式创建 lambda 以供使用而非反射,在 Android 上不可见。
我在desugar_jdk_libs 的来源中看到了它们:
- https://github.com/google/desugar_jdk_libs/blob/master/jdk11/src/java.base/share/classes/java/lang/invoke/LambdaMetafactory.java
- https://github.com/google/desugar_jdk_libs/blob/master/src/share/classes/java/util/List.java
所以 - 问题是:我如何确定某些 Java API 是否应该在“脱糖”android 构建中可用? 'desugaring' 真正可以期待什么?
重现步骤:
- 使用Android Studio Canary 生成一个虚拟的“基本活动”项目
- 确保在
build.gradle中提供以下内容
android {
compileOptions {
coreLibraryDesugaringEnabled true
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
}
}
dependencies {
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
}
- 在代码中的某处添加以下行
List<Integer> ints1 = List.of(1, 2, 3);
Supplier<List<Object>> listSupplier = () -> new ArrayList<>();
List<Object> alist = listSupplier.get();
List<Integer> ints2 = List.copyOf(ints1);
LambdaMetafactory.metafactory(null,null,null,null,null,null);
最后两行无法为我编译。
PS:最终应用程序应该可以在 Android 10+ 上运行。
【问题讨论】:
-
我认为这还不可能。主要是因为工作正在进行中。将来,我们将提供支持的 API 和 lint 规则列表(如 java 8 developer.android.com/studio/write/java8-support-table)
-
我的问题是,当我们现在支持 Java 11 时,我们还需要
coreLibraryDesugaringEnabled吗?!