文章指出「這與Java 8無關」。這似乎只是部分正確的,但不會使我的兩個問題無效。所以這裏是我自己的結論,基於自從我的OP之後做的額外閱讀,並且我會根據回覆來修復它。
官方文檔很明確:Android supports ... a subset of Java 8 language features that vary by platform version。
請注意術語「語言功能」,而不是「API」。後者通常是指在特定SDK中定義的常量,類和類成員(以及方法,它們的簽名),並且可以從代碼訪問/調用;而「語言特性」則是諸如運算符,優先級規則,嘗試資源等等。所以,雖然「SDK」和「API」經常互換使用,但它們在Android上可能並不相同:SDK可能是API +工具(如編譯器,編譯器,用於錯誤檢查的腳本等)。
的報價意味着在SDK水平的提高,越來越多的語言的Java 8的功能規格成爲支持。關鍵字是「支持」:如果語言功能 A在SDK 27支持,但不在26,並且您使用compileSdk: 27
編譯程序,並且它在具有平臺26的Android設備上正確運行(假定您的程序不使用任何新的API 27,它只是使用新的操作符等新的語言功能),玩什麼魔術?
我唯一的解釋(我希望我的OP中的第二個問題的答案)是額外的編譯,我不知道什麼時候發佈:Java字節碼(.class文件)從Java編譯器被轉換爲DEX格式。這個額外的步驟涉及一個工具,它不是API的一部分,但可能是SDK的一部分。這個DEX編譯器是語言功能得到實現:如果DEX編譯器不知道如何傳輸Java字節碼,那麼Android不支持該運算符。這表明,如果可能,新的Java字節碼可能不會轉換爲新的DEX字節碼;相反,它們被轉換爲執行舊平臺(其具有較老的Dalvik VM)中的操作的DEX字節碼的等效序列。當這樣的等價過於繁瑣而無法確定時,minSdk會受到影響(那麼老式的Dalvik虛擬機就無法運行DEX文件了)。
對於第一個問題,每個SDK可能包含「檢查規則」,檢查DEX編譯器尚未支持的Java JDK功能,從而判斷給定SDK是否支持JAVA語言功能範圍就是棉絨,並且假定棉絨標記所使用的檢查規則都是正確的(沒有誤報或否定)。
任何更正歡迎!
*這似乎是一個Java 8功能。* - 它與java版本無關。它取決於android SDK中的語法,在26版本中進行了更改,因此如果targetSdk 26可以使用此功能 –
@TimCastelijns感謝您的澄清,但這並非完全正確:只要compileSdk> = 26,您就可以使用它,無論目標SDK如何。此外,這並不會使我的問題無效,因爲[Android支持... Java 8語言功能的子集,因平臺版本而異](https://developer.android.com/guide/platform/j8-jack.html)。 – Schollii