Android+core LibraryDesugering:我可以期待哪些Java 11API能够工作?

2022-09-24 00:00:00 android java-11

我正在尝试将一些Java库从‘普通’JVM迁移到Android,并坚持使用代码中使用的一些Java 11 API。

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

现在我需要了解哪些API是真正可以使用的。这里有两个用例对我不起作用,我不知道我是做错了什么,还是永远不应该起作用:

  1. List.copyOf()-在Java 11中引入的方法copyOf在Android上不可用。Java 9中引入的方法‘List.of()’工作正常。

  2. 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
所以-问题是:我如何才能确定某个Java API是否应该在去丑化的Android版本中可用?'desugaring'到底可以期待什么?

复制步骤:

  1. 使用Android Studio Canary生成虚拟的基本活动和项目
  2. 确保build.gradle
  3. 中提供了以下内容
android {
    compileOptions {
        coreLibraryDesugaringEnabled true
        sourceCompatibility JavaVersion.VERSION_11
        targetCompatibility JavaVersion.VERSION_11
    }
}
dependencies {
    coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
}
  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);

最后2行无法为我编译。

PS:最终应用程序应该可以在Android 10+上运行。


解决方案

Desugering lib被认为是非官方的。我们不能期望一个确切的答案。当功能准备好时,我们就会得到它。现在,List.CopyOf()方法正在使用最新的Gradle版本。

关于LambdaMetafactory类,它不包括在Android Javadoc中。这意味着我们假设我们根本没有LambdaMetafactory。谷歌精简了一些Java API,称其轻量级。

一般来说,我们应该先检查Android Javadoc。如果Android Javadoc没有提到一些API。我们可以肯定,我们不会在短期内获得该功能。

相关文章