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

Android + coreLibraryDesugaring: which Java 11 APIs can I expect to work?(Android+core LibraryDesugering:我可以期待哪些Java 11API能够工作?)
本文介绍了Android+core LibraryDesugering:我可以期待哪些Java 11API能够工作?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试将一些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。我们可以肯定,我们不会在短期内获得该功能。

这篇关于Android+core LibraryDesugering:我可以期待哪些Java 11API能够工作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

How to target newer versions in .gitlab-ci.yml using auto devops (java 11 instead of 8 and Android 31 instead of 29)(如何在.gitlab-ci.yml中使用自动开发工具(Java 11而不是8,Android 31而不是29)瞄准较新的版本)
How to render something in an if statement React Native(如何在If语句中呈现某些内容Reaction Native)
How can I sync two flatList scroll position in react native(如何在本机Reaction中同步两个平面列表滚动位置)
Get an event when UIBarButtonItem menu is displayed(显示UIBarButtonItem菜单时获取事件)
iOS: Send multiple actions to a bar button(IOS:向一个栏按钮发送多个动作)
appearance().setBackgroundImage Not Working On Custom Class(外观().setBackoundImage在自定义类上不起作用)