web-dev-qa-db-ja.com

「なぜApache Harmony」または「AndroidでJava 8を使用するか」

私たちのほとんどはJava 8がもたらすクールな機能について聞いたことがあるが、Androidはそれをサポートしていない。これは、GoogleがAndroidで Apache Harmony を使用しているためです。これが、私たち(Androidアプリ開発者)がラムダ、インターフェイスのデフォルトの実装、文字列の切り替えなどでコードを改善するのを妨げている理由です。確かにしばらくは処理しますが、アプリで使用しているいくつかのライブラリがJava 8機能を使用し始めたらどうなりますか?私の知る限り、これは機能しません(間違っている場合は修正してください)。これにより、Standard-JavaとAndroid-Javaの間に非互換性が生じます。 Googleが意図したものではない、または少なくとも広く採用されているオペレーティングシステムを開発している企業が古いJavaバージョン。

質問:

  • なぜApache Harmonyを使用するのですか?
  • 新しいバージョンのJavaを採用できないのはなぜですか?
  • OracleのJavaが必要ない場合、なぜ OpenJDK (ここでnoobのライセンスを取得)のサブセットを使用できないのですか?
  • 使用済みJavaバージョンを更新する計画を知っていますか?
  • 現在のJavaシステムでAndroid 8クラスを使用する方法を知っていますか?
64
tilpner

なぜApache Harmonyを使用するのですか?

Sunは、Sun(現在のOracle)JavaのライセンスをGoogleに許可する条件で提供することを拒否したためです。グーグルとサンは交渉したが、結局彼らは取引から立ち去った。

Nitpick:実際、AndroidライブラリーはApache Harmonyではありません。 Harmonyに基づいて開始されましたが、2つのコードベースは分かれています。さらに、Apache Harmonyプロジェクトは2011年11月に正式に「廃止」されました。

新しいバージョンのJavaを採用できないのはなぜですか?

まず、AndroidはJava(tm)を実行しません。 Javaクラスライブラリ(+ Android固有のライブラリのsubsetと機能的に同等のクラスライブラリを使用して、Javaと同一の言語を実行します。 )、different命令セットを持つ仮想マシン上。

技術的な観点からは、...の可能性がありますが、_のJava 7およびJava 8言語機能、ライブラリ機能などの実装に多大な労力を費やした場合のみAndroidプラットフォーム。

[〜#〜] update [〜#〜]-Android 19(KitKat)およびEclipse ADT 22.6以降、AndroidはJava 7言語拡張をサポートするようになりました。 http://tools.Android.com/recent/eclipseadt226preview を参照してください

OracleのJavaが必要ない場合、OpenJDKのサブセットを使用できないのはなぜですか?

OpenJDKに切り替えても何も変わらないと思います。 Oracle JavaとOpenJDKは99.9%同じです。

とにかく、ライセンスと関連する法的問題があるかもしれません。 (そして、その感触をつかむために、オラクル対グーグルの訴訟について読んでください...それはアピールするつもりです。)

おそらく、グーグルは、変化に必要な(大規模な)努力と、それがAndroidエコシステムにもたらす混乱に対抗するのに十分な商業的価値を見ていません...すでに断片化の問題に苦しんでいます。

使用済みJavaバージョンを更新する計画を知っていますか?

いいえ、しません。それは計画がないという意味ではありませんが、もしあれば、それらは公開されていません。

現在のJavaシステムでAndroid 8クラスを使用する方法を知っていますか?

それらを移植できます。または、少なくとも、tryで移植できます。 (一部のJava AP​​Iは、JVMのネイティブコード側と密接な関係にあります。これにより、移植に問題が生じる可能性があります。)

55
Stephen C

現在のJavaシステムでAndroid 8クラスを使用する方法を知っていますか?

Java 8 APIの一部をバックポートするライブラリがいくつかあります(最新のAndroidでのこれらのAPIのネイティブサポートについては、以下のupdateセクションを参照してください)バージョン):

  • ThreeTenABP Javaのバックポート8 Android向けに最適化された日時API
  • ストリームサポート は、Javaのユーザー向けのJava 8 Java.util.function(機能インターフェイス)およびJava.util.stream(ストリーム)APIのバックポートです。 ] 6または7は、Javaには存在しなかったJava.util.concurrentから選択された追加で補完されます。

そして、 retrolambdagradle-retrolambda プラグインとともに)を使用して、Android開発でラムダを利用できます。

[〜#〜] update [〜#〜]

ただし、Android Studio 2.4 Preview 4(Android plugin 2.4.0-alpha4と組み合わせて)からは、Java 8言語の一部の組み込みサポートがあります。特徴:

  • ラムダ式
  • メソッド参照
  • 繰り返し注釈

上記の機能は、任意のAndroid APIレベルで使用できます。

APIレベル24から、デフォルトおよび静的インターフェースメソッド、および次のJava 8 APIも使用できます。

  • Java.util.stream
  • Java.util.function
  • Java.lang.FunctionalInterface

APIレベル26(Android Oプレビュー)はJava.time AP​​Iサポートを追加します。

12
Idolon

更新。

AndroidはOpenJDKの使用を計画しています。おそらく、彼らはあなたのように考えており、Java 8つの機能を使用したいと考えているためです。 this を参照してください。

5