我正在尝试将一些 Java 库从“普通”JVM 迁移到 android,并坚持使用代码中使用的一些 Java11 API。
我已经得到的第一件事 - Java11 语言功能似乎仅适用于 Android Studio 的 Canary 版本,请参阅此处的答案
现在我需要了解哪些 API 可以真正使用。这里有两个对我不起作用的用例,如果我做错了什么或者它永远不应该起作用,我就无法得到:
List.copyOf()- Java11中引入,该方法copyOf在android上不可用。Java 9 中引入的“List.of()”方法可以正常工作。
class java.lang.invoke.LambdaMetafactory- 随 Java 1.8 引入 - 用于以编程方式创建 lambda 以供使用,而不是用于反射,在 Android 上不可见。
我在这里的来源中看到了它们desugar_jdk_libs:
所以 - 问题是:我如何确定某些 Java API 是否应该在“脱糖”android 版本中可用?“脱糖”到底能带来什么?
重现步骤:
build.gradleandroid {
compileOptions {
coreLibraryDesugaringEnabled true
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
}
}
dependencies {
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
}
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
最后两行对我来说无法编译。
PS:最终应用程序应该可以在 Android 10+ 上运行。
脱糖库被认为是非官方的。我们无法期待确切的答案。当该功能准备就绪时,我们就会获得该功能。现在 List.copyOf() 方法现在可以使用最新的 Gradle 版本。
关于该类LambdaMetafactory,它没有包含在Android Javadoc中。LambdaMetafactory这意味着我们假设我们根本没有。为了轻量级,Google 剥离了一些 Java API。
一般来说,我们应该首先检查android Javadoc。如果 android Javadoc 没有提及某些 API。我们可以确定我们不会很快获得该功能。
| 归档时间: |
|
| 查看次数: |
8318 次 |
| 最近记录: |