2017-11-10 203 views
3

我知道這裏有很多關於Android API級別和版本的問題,但這個問題不同,所以請不要將其標記爲重複。操作系統版本,API級別和Java版本之間的關係

我在想,Java版本1.6,1.7,1.8是如何與這兩者相關的。我的困惑的來源是我試圖使用標誌Pattern.compile方法如下所示。

Pattern pattern = Pattern.compile("\\b" + keywordToCheck + "\\b", Pattern.UNICODE_CHARACTER_CLASS); 

the docsPattern.UNICODE_CHARACTER_CLASS它說,它說,自從:1.7,這是我承擔意味着它是在Java版本1.7及更高版本。我想使用該行的代碼在Android項目,但每次我的設備上運行它時,我得到:

java.lang.IllegalArgumentException: Unsupported flags: 256 

下面是我的build.gradle文件中的相關部分

defaultConfig { 
     minSdkVersion 19 
     targetSdkVersion 26 
     versionCode 1 
     versionName "1.0" 
     testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 
    } 

根據我的理解,這意味着我的應用程序將使用任何API級別19及以上,這意味着它可以在Android 4.4(KitKat)或更高版本上運行。我正在運行該應用程序的設備具有Android 6.0。 Java版本如何適應這一點?我使用過Android Studio 3.0它說我使用的是:

Android Studio 3.0 
Build #AI-171.4408382, built on October 20, 2017 
JRE: 1.8.0_152-release-915-b08 x86_64 
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o 
Mac OS X 10.12.6 

爲什麼我得到這個錯誤可以有人向我解釋,還Android的API級別,版本和Java版本之間的關係?謝謝

回答

2

從1.7開始可用時,請注意您正在查看的文檔 - Oracle(官方Java文檔)。所以它將永遠是Java版本。 Android文檔將始終爲您提供可用的Android SDK版本。

請注意,Android並不總是100%與Java官方版本兼容。它試圖成爲,但顯然圖書館的大塊大塊不在那裏。如果有疑問,請查看該類的Android文檔,而不是Oracle。

至於Java版本 - 它們主要是獨立於Android版本的。 Java 8剛剛完全由AS3完全支持。在此之前它被認爲是實驗性的。如果你願意,你仍然可以使用Java 7。對於Java 8,大多數語言功能都可以在所有平臺上使用,但有一兩種語言需要最低24的SDK版本。我知道的那兩種是Java流和註釋類型/重複註釋。

針對您的特定問題,請注意android文檔對此標誌的說明:「此標誌對Android沒有影響,始終使用unicode字符類。」所以你可以刪除它。

+0

非常感謝!看起來特殊的標誌在API Level 24之前不被支持。你能否解釋「Oracle Java」和「Android Java」之間的區別? Google是否與Oracle分開實施這個Pattern類?或者兩者之間的JRE不同?兩者有什麼區別? – strikerdude10

+1

Java是一種語言。甲骨文收購了創建它的公司(Sun)並且有參考實現。 Android使用單獨的Java實現 - 語法是相同的,但它不支持所有的庫(並增加了許多它自己的)。就像不同的公司有他們自己的C++或Javascript版本一樣。谷歌的實施是100%自己的。事實上谷歌使用不同的字節碼語言 - 達爾維克。 –

+0

啊,確定了。語言的語法是一樣的(Java是什麼),但是之後的所有東西:編譯器,JVM庫都特定於Google/Oracle? – strikerdude10

1

在你給出的例子中,該標誌直到API 24才被添加。在很多情況下,即使支持給定的語言級別(例如7)被提前添加,並不意味着所有內容都會立即添加。無論出於何種原因,Google都會等待一些事情。

我不能告訴你爲什麼,因爲我不知道。

正如Gabe所說,Java的版本不一定與Android兼容。

因此,由於您的代碼在API 19及更高版本上使用了標誌,因此該標誌尚未添加,您將在等於19和23的版本之間發生崩潰。

而且值得注意的是,版本兼容性不會限制Android版本的Java版本。現在你可以在任何你想要的Android版本上運行Java 8。這是兼容性。

但是,如果你讀Android Java 8 Language Features,它說(重點煤礦):

的Android 3.0工作室及更高版本支持所有Java 7語言功能和對Java 8語言特性,通過平臺版本改變一個子集。

我在這裏使用Java 8作爲例子,但這主要適用於Android和java的各個版本。

本質:

  • 您正在使用的標誌未添加到API 24.據我所知,即使硬編碼的變量未添加使用是有
  • 的Android沒有按」不一定有每一個Java API,並且這些因Android的版本而異
  • Java的版本不受API的限制,但可訪問的功能各不相同。這意味着如果你願意,你可以在API(隨機數)12上運行Java 8。

這兩者之間沒有固定的關係(Android [x] = Java [x])。不同的字段/方法/類可能最終被添加,立即(在發佈對給定版本的Java的支持時)或根本不添加。


Android中使用的普通Java和Java版本是兩個截然不同的版本,因爲Android是基於平臺的,而Java是基於版本的。您無法比較它們之間的版本,並且它們都有單獨的文檔。

值得注意的是,對於Android(Java)問題,您應該查看可在API reference中找到的Android文檔,而不是使用不適用於Android的Oracle文檔,因爲API存在巨大差異。

+0

非常感謝!讓我困惑的一件事是這個Oracle和Android API之間的區別。 Oracle和Google各自實施這個模式類嗎?我知道Oracle有他們的JDK 8,Google是否爲Android/Android Studios製作自己的JDK?一個人如何獲得支持而不是另一個? – strikerdude10

+0

語言是Java,但它使用Android SDK作爲JDK。出於比較目的,JDK = SDK。您仍然需要開發工具包來獲取基本語言功能以及類似的功能,但最終使用的界面是通過SDK。 Oracle是Java,他們創建了這個類。儘管一些基於編譯器的「純」語言(比如lambda)會支持較早的版本,但Android稍後爲新版本的Android實現了這一點。字段不會 – Zoe

相關問題