Android+core LibraryDesugering:我可以期待哪些Java 11API能夠工作? [英] Android + coreLibraryDesugaring: which Java 11 APIs can I expect to work?

查看:0
本文介紹了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的源代碼中都看到了它們:

所以-問題是:我如何才能確定某個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被認為是非官方的。我們不能期望一個確切的答案。當功能準備好時,我們就會得到它?,F在,List.CopyOf()方法正在使用最新的Gradle版本。

關于LambdaMetafactory類,它不包括在Android Javadoc中。這意味著我們假設我們根本沒有LambdaMetafactory。谷歌精簡了一些Java API,稱其輕量級。

一般來說,我們應該先檢查Android Javadoc。如果Android Javadoc沒有提到一些API。我們可以肯定,我們不會在短期內獲得該功能。

這篇關于Android+core LibraryDesugering:我可以期待哪些Java 11API能夠工作?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持IT屋!

查看全文
登錄 關閉
掃碼關注1秒登錄
發送“驗證碼”獲取 | 15天全站免登陸
全免费A级毛片免费看无码播放