Android + coreLibraryDesugaring:我可以使用哪些 Java 11 API?

Xtr*_*der 12 android java-11

我正在尝试将一些 Java 库从“普通”JVM 迁移到 android,并坚持使用代码中使用的一些 Java11 API。

我已经得到的第一件事 - Java11 语言功能似乎仅适用于 Android Studio 的 Canary 版本,请参阅此处的答案

现在我需要了解哪些 API 可以真正使用。这里有两个对我不起作用的用例,如果我做错了什么或者它永远不应该起作用,我就无法得到:

  1. List.copyOf()- Java11中引入,该方法copyOf在android上不可用。Java 9 中引入的“List.of()”方法可以正常工作。

  2. class java.lang.invoke.LambdaMetafactory- 随 Java 1.8 引入 - 用于以编程方式创建 lambda 以供使用,而不是用于反射,在 Android 上不可见。

我在这里的来源中看到了它们desugar_jdk_libs

所以 - 问题是:我如何确定某些 Java API 是否应该在“脱糖”android 版本中可用?“脱糖”到底能带来什么?

重现步骤:

  1. 使用Android Studio Canary生成一个虚拟的“Basic Activity”项目
  2. 确保以下内容中提供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'
}
Run Code Online (Sandbox Code Playgroud)
  1. 在代码中的某处添加以下行
        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+ 上运行。

hur*_*yag 1

脱糖库被认为是非官方的。我们无法期待确切的答案。当该功能准备就绪时,我们就会获得该功能。现在 List.copyOf() 方法现在可以使用最新的 Gradle 版本。

关于该类LambdaMetafactory,它没有包含在Android Javadoc中。LambdaMetafactory这意味着我们假设我们根本没有。为了轻量级,Google 剥离了一些 Java API。

一般来说,我们应该首先检查android Javadoc。如果 android Javadoc 没有提及某些 API。我们可以确定我们不会很快获得该功能。