操作系统版本,API级别和Java版本之间的关系

str*_*e10 8 java android android-version

我知道这里有很多关于Android API级别和版本的问题,但这个问题有所不同所以请不要将其标记为重复.

我想知道Java版本1.6,1.7,1.8 ......是如何与这两者相关的.我混淆的原因是我尝试使用Pattern.compile带有Pattern.UNICODE_CHARACTER_CLASS标志的方法,如下所示.

Pattern pattern = Pattern.compile("\\b" + keywordToCheck + "\\b", Pattern.UNICODE_CHARACTER_CLASS);
Run Code Online (Sandbox Code Playgroud)

在文档Pattern.UNICODE_CHARACTER_CLASS它说,它说,自从:1.7,这是我承担意味着它是在Java版本1.7及更高版本.我试图在Android项目中使用该行代码,但每次在我的设备上运行它时,我得到:

java.lang.IllegalArgumentException: Unsupported flags: 256
Run Code Online (Sandbox Code Playgroud)

以下是build.gradle文件的相关部分

defaultConfig {
        minSdkVersion 19
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
Run Code Online (Sandbox Code Playgroud)

根据我的理解,这意味着我的应用程序将使用任何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
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释为什么我会收到此错误,以及Android API级别,版本和Java版本之间的关系?谢谢

Zoe*_*Zoe 6

在给定示例的情况下,直到API 24才添加该标志.在很多情况下,尽管先前添加了对给定语言级别(例如7)的支持并不意味着所有内容都会立即添加.有些事情是等待谷歌等待它的原因.

我不能告诉你为什么,因为我不知道.

正如Gabe所说,Java的版本不一定与Android兼容.

因此,由于您在API 19及更高版本上使用标志的代码,您将在19和23之间的版本上崩溃,因为尚未添加该标志.

并且值得注意的是,版本兼容性并不限制Android版本的Java版本.现在,您可以在任何版本的Android上运行Java 8.这是兼容性.

然而.如果您阅读Android Java 8语言功能,它会说(强调我的):

Android Studio 3.0及更高版本支持所有Java 7语言功能和Java 8语言功能子集,这些功能因平台版本而异.

我在这里使用Java 8作为示例,但这适用于大多数Android和Java版本.

实质上:

  • 您使用的标志在API 24之前未添加.AFAIK,即使硬编码变量存在,也未添加使用情况
  • Android不一定拥有每一个Java API,而且这些API因Android版本而异
  • Java的版本不受API限制,但可访问的功能各不相同.这意味着如果您愿意,可以在API(随机数)12上运行Java 8.

两者之间没有固定的关系(Android [x] = Java [x]).最终可以立即添加不同的字段/方法/类(在发布对给定版本的Java的支持时)或者根本不添加.


Android中使用的常规Java和Java版本是两个非常不同的,因为Android是基于平台的,而Java是基于版本的.您无法比较它们之间的版本,它们都有单独的文档.

值得一提的是,为Android(Java)的问题,你应该看看它可以在发现了Android文档API参考,而不是使用它并不适用于Android系统,因为API在庞大的差异Oracle文档.


Gab*_*han 3

当它说从 1.7 开始可用时,请注意您正在查看的文档 - Oracle(官方 Java 文档)。所以它永远是Java版本。Android 文档将始终为您提供此后可用的 Android SDK 版本。

请注意,Android 并不总是 100% 兼容 Java 的官方版本。它试图做到这一点,但显然图书馆的大部分内容都不在那里。如有疑问,请查看该类的 Android 文档,而不是 Oracle。

至于 Java 版本 - 它们大多独立于 Android 版本。Java 8 刚刚正式获得 AS3 的全面支持。在此之前,它被认为是实验性的。如果您愿意,您仍然可以使用 Java 7。对于 Java 8,大多数语言功能在所有平台上都可用,但一两个功能要求最低 SDK 版本为 24。我知道的两个功能是 Java 流和注释类型/重复注释。

对于您的具体问题,请注意 android 文档对此标志的说明:“此标志对 Android 没有影响,始终使用 unicode 字符类。” 所以你可以直接删除它。