web-dev-qa-db-ja.com

OSバージョン、APIレベル、およびJavaバージョンの関係

Android APIのレベルとバージョンに関する質問がたくさんあることは承知していますが、この質問は異なるため、重複としてマークしないでください。

Javaバージョン1.6、1.7、1.8 ...がこれら2つにどのように関係しているのかと思います。混乱の原因は、以下に示すように、Pattern.compileフラグをPattern.UNICODE_CHARACTER_CLASSフラグとともに使用しようとしていることです。

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

From the docs on Pattern.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バージョンの関係も誰かに説明できますか?ありがとうございました

9
strikerdude10

与えられた例の場合、そのフラグは API 24 まで追加されませんでした。多くの場合、特定の言語レベル(7など)のサポートが以前に追加されていても、すべてが即座に追加されるわけではありません。 Googleがそれを待っている理由があるとしても、いくつかのものは待っています。

理由がわからないのでわかりません。

そしてGabeが述べたように、Javaのバージョンは必ずしもAndroidと互換性があるわけではありません。

したがって、API 19以降でフラグを使用するコードのために、フラグがまだ追加されていないため、19〜23のバージョンでクラッシュします。

また、バージョンの互換性がJavaのバージョンをAndroidのバージョンによって制限しないことにも注意してください。これで、インスタンスのJava 8をAndroidのどのバージョンでも実行できます。これは互換性です。

しかしながら。 Android Java 8言語機能 を読んだ場合、次のように書かれています(私の強調):

Android Studio 3.0以降は、すべてのJava 7言語機能と、プラットフォームバージョンによって異なるJava 8言語機能のサブセットをサポートしています

ここでは例としてJava 8を使用していますが、これはAndroidとJavaのほとんどすべてのバージョンに当てはまります。

基本的に:

  • 使用しているフラグはAPI 24まで追加されませんでした。AFAIK、ハードコードされた変数があるにもかかわらず使用法は追加されませんでした
  • Androidは必ずしもすべてのJava APIを備えている必要はなく、これらはAndroidのバージョンによって異なります
  • JavaのバージョンはAPIによって制限されていませんが、アクセス可能な機能はさまざまです。必要に応じて、API(乱数)12でJava 8を実行できることを意味します。

2つの間に固定関係(Android [x] = Java [x])はありません。異なるfields/methods/classesは、最終的に、瞬時に(特定のバージョンのJavaのサポートのリリース時に)追加されるか、まったく追加されない可能性があります。


Javaはプラットフォームベースであり、Javaはバージョンベースであるため、通常のAndroidとAndroidで使用されるJavaのバージョンは大きく異なります。それらの間でバージョンを比較することはできません。それらは両方とも個別のドキュメントを持っています。

Android(Java)の質問については、Oracleのドキュメントを使用する代わりに、 APIリファレンス にあるAndroidのドキュメントを参照する必要があることに注意してください。 APIには大きな違いがあるため、Androidには適用されません。

6

1.7以降で利用可能と表示されている場合は、誰が見ているドキュメントであるか-Oracle(公式Javaドキュメント)に注意してください。したがって、常にJavaバージョンになります。 Androidのドキュメントでは、常にAndroid SDKのバージョンが提供されています。

Androidは常にJavaの公式バージョンと100%互換性があるわけではないことに注意してください。それはそうしようとしますが、明らかにライブラリの大きなチャンクはありません。疑問がある場合は、Oracleではなく、クラスのAndroidドキュメントを参照してください。

Javaバージョンについては、ほとんどがAndroidバージョンから独立しています。 Java 8は、AS3で正式に完全にサポートされるように作成されました。それ以前は実験的なものと見なされていました。必要な場合は、引き続きJava 7を使用できます。 Java 8の場合、ほとんどの言語機能はすべてのプラットフォームで使用できますが、1つまたは2つには最低24のSDKバージョンが必要です。私が知っている2つは、Javaストリームと注釈タイプ/繰り返し注釈です。

特定の問題については、Androidのドキュメントにフラグについて次のように記載されていることに注意してください。「このフラグはAndroidには影響しません。Unicode文字クラスが常に使用されます。」だからあなたはそれを取り除くことができます。

3
Gabe Sechan