64

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

質問:

  • Apache Harmony を使用する理由
  • 新しいバージョンの Java を採用できないのはなぜですか?
  • 彼らが Oracle の Java を必要としないのであれば、OpenJDKのサブセットを使用できないのはなぜですか (ライセンス noob here)。
  • 使用している Java のバージョンを更新する予定はありますか?
  • 現在の Android システムで Java 8 クラスを使用する方法を知っていますか?
4

3 に答える 3

55

Apache Harmony を使用する理由

Sun が、受け入れ可能な条件で Sun (現在の Oracle) Java のライセンスを Google に提供することを拒否したためです。Google と Sun は交渉しましたが、最終的には取り引きを取りやめました。

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

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

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

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

更新- Android 19 (KitKat) および Eclipse ADT 22.6 の時点で、Android は Java 7 言語拡張機能をサポートするようになりました。http://tools.android.com/recent/eclipsadt226previewを参照してください

Oracle の Java が必要ないのであれば、なぜ OpenJDK のサブセットを使用できないのでしょうか?

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

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

おそらく、Google は、変更に必要な (大規模な) 労力と、それによって引き起こされる Android エコシステムの混乱に対抗するのに十分な商業的価値を見出していません。

使用している Java のバージョンを更新する予定はありますか?

いいえ、私はしません。予定がないわけではありませんが、あったとしても非公開です。

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

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

于 2013-06-04T15:24:44.213 に答える
12

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

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

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

また、 ( gradle -retrolambdaプラグインと共に) retrolambda を使用して、Android 開発でラムダを利用できます。


アップデート

Android Studio 3.0 では、Java 8 言語機能の一部に対する組み込みサポートの提供が開始されました。

  • ラムダ式
  • メソッド参照
  • 型注釈 (情報はコンパイル時に利用できますが、実行時には利用できません)
  • 注釈の繰り返し
  • デフォルトおよび静的インターフェース メソッド

また、API レベル 24 以降では、次の Java 8 API を使用できます。

  • java.util.stream
  • java.util.function
  • java.lang.FunctionalInterface
  • java.lang.annotation.Repeatable
  • java.lang.reflect.AnnotatedElement.getAnnotationsByType(Class)
  • java.lang.reflect.Method.isDefault()

API レベル 26 (Android O) でjava.timeAPI サポートが追加されました。


2020/01/17更新

Android Studio 4.0には、アプリの最小 API レベルを必要とせずに、desugaring と呼ばれる手法を使用して、多数の Java 8 言語 API を使用するためのサポートが含まれています:
https://developer.android.com/studio/preview/features#j8-desugar

このリリースでは、次の一連の API がサポートされています。

  • 順次ストリーム ( java.util.stream)
  • のサブセットjava.time
  • java.util.function
  • への最近の追加java.util.{Map,Collection,Comparator}
  • オプション ( java.util.Optionaljava.util.OptionalIntおよびjava.util.OptionalDouble) と、上記の API で役立つその他の新しいクラス
  • ( 、およびのjava.util.concurrent.atomic新しいメソッド)へのいくつかの追加AtomicIntegerAtomicLongAtomicReference
  • ConcurrentHashMap(Android 5.0 のバグ修正を含む)

これらの言語 API をサポートするために、D8 は不足している API の実装を含む別のライブラリ DEX ファイルをコンパイルし、それをアプリに含めます。脱糖プロセスでは、実行時に代わりにこのライブラリを使用するようにアプリのコードを書き換えます。

これらの言語 API のサポートを有効にするには、モジュールのbuild.gradleファイルに次を含めます。

android {
  defaultConfig {
    // Required when setting minSdkVersion to 20 or lower
    multiDexEnabled true
  }

  compileOptions {
    // Flag to enable support for the new language APIs
    coreLibraryDesugaringEnabled true
    // Sets Java compatibility to Java 8
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }
}

dependencies {
  coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.4'
}

脱糖の実装方法に関する技術的な詳細については、Jake Wharton の記事を参照してください。

于 2014-10-04T22:59:51.437 に答える