Android+core LibraryDesugering:我可以期待哪些Java 11API能够工作?
我正在尝试将一些Java库从‘普通’JVM迁移到Android,并坚持使用代码中使用的一些Java 11 API。
我已经得到的第一件事--Java11语言功能似乎只适用于Android Studio的Canary版本,请参阅答案here
现在我需要了解哪些API是真正可以使用的。这里有两个用例对我不起作用,我不知道我是做错了什么,还是永远不应该起作用:
List.copyOf()
-在Java 11中引入的方法copyOf
在Android上不可用。Java 9中引入的方法‘List.of()’工作正常。类
java.lang.invoke.LambdaMetafactory
-在Java 1.8中引入-用于编程创建lambdas以供使用,而不是用于反射,在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
复制步骤:
- 使用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);
最后2行无法为我编译。
PS:最终应用程序应该可以在Android 10+上运行。
解决方案
Desugering lib被认为是非官方的。我们不能期望一个确切的答案。当功能准备好时,我们就会得到它。现在,List.CopyOf()方法正在使用最新的Gradle版本。
关于LambdaMetafactory
类,它不包括在Android Javadoc中。这意味着我们假设我们根本没有LambdaMetafactory
。谷歌精简了一些Java API,称其轻量级。
一般来说,我们应该先检查Android Javadoc。如果Android Javadoc没有提到一些API。我们可以肯定,我们不会在短期内获得该功能。
相关文章