Android で新しい Java 7 言語機能を使用したことがある人はいるでしょうか? Android は Java が吐き出すバイトコードを読み取って dex に変換することは知っています。そこで、質問したいのは、Android が Java 7 のバイトコードを理解できるかどうかです。
ベストアンサー1
使用している場合アンドロイドスタジオ、Java 7言語パッチなしで自動的に有効になるはずです。try-with-resource には API レベル 19 以上が必要で、NIO 2.0 の機能が不足しています。
Java 7の機能を使用できない場合は、ヌーノの編集方法に関する回答build.gradle
。
以下は歴史的な興味のためだけのものです。
Java 7 のごく一部は Android でも使用できます (注: 4.1 でのみテストしました)。
まず、EclipseのADTは使えません。ハードコードされているJava コンパイラ 1.5 と 1.6 のみが準拠しています。ADT を再コンパイルすることもできますが、Android 全体を再コンパイルする以外に簡単な方法はないようです。
しかしEclipseを使う必要はありません。例えば、Android Studio 0.3.2、IntelliJ IDEA CEその他のJavaベースのIDEはAndroidへのコンパイルをサポートしているそして次のようにして、Java 8 までの準拠を設定できます。
- ファイル → プロジェクト構造 → モジュール → (2 番目のペインでモジュールを選択) → 言語レベル → (「7.0 - Diamonds、ARM、マルチキャッチなど」を選択)
これはJava 7のみを許可します言語機能改善の半分もライブラリから得られるため、ほとんど何もメリットがありません。使用できる機能は、ライブラリに依存しない機能です。
- ダイヤモンド演算子 (
<>
) - 文字列スイッチ
- 複数キャッチ(
catch (Exc1 | Exc2 e)
) - 数値リテラル内のアンダースコア (
1_234_567
) - バイナリリテラル (
0b1110111
)
これらの機能は使用できませんまだ:
- -with-resourcesステートメント
try
— 存在しないインターフェース「java.lang.AutoCloseable」を必要とするため (これは 4.4 以降でパブリックに使用できます) - @SafeVarargs アノテーション — 「java.lang.SafeVarargs」が存在しないため
...「まだ」:) Androidのライブラリは1.6をターゲットにしていますが、Androidのソースには次のようなインターフェースが含まれています。自動クローズ可能従来のインターフェース閉じることができるAutoCloseable から継承されます (ただし、SafeVarargs は実際には存在しません)。リフレクションによってその存在を確認できました。これらは、Javadoc にタグがあるために非表示になっており@hide
、"android.jar" に含まれません。
すでに存在する質問 隠し API と内部 API を利用できる Android SDK をビルドするにはどうすればよいですか? これらのメソッドを復元する方法については、交換する現在のプラットフォームの既存の「android.jar」参照をカスタマイズされたものと置き換えると、Java 7 API の多くが利用できるようになります (手順は Eclipse の場合と同様です。プロジェクト構造 → SDK を確認してください)。
AutoCloseableに加えて、次のJava 7のみライブラリ機能以下も明らかになった。
- ConcurrentModificationException、LinkageError、AssertionError の例外連鎖コンストラクタ
- プリミティブの静的 .compare() メソッド: Boolean.compare()、Byte.compare()、Short.compare()、Character.compare()、Integer.compare()、Long.compare()。
- 通貨: .getAvailableCurrencies(), .getDisplayName() (ただしそれなし.getNumericCode())
- ビットセット: .previousSetBit()、.previousClearBit()、.valueOf()、.toLongArray()、.toByteArray()
- コレクション: .emptyEnumeration(), .emptyIterator(), .emptyListIterator()
- 自動クローズ可能
- 投げられる: .addSuppressed()、.getSuppressed()、および4つの引数を持つコンストラクタ
- キャラクター: .compare(), .isSurrogate(), .getName(), .highSurrogate(), .lowSurrogate(), .isBmpCodePoint() (ただしそれなし.isAlphabetic() および .isIdeographic())
- システム: .lineSeparator() (文書化されていない?)
- java.lang.reflect.修飾子: .classModifiers()、.constructorModifiers()、.fieldModifiers()、.interfaceModifiers()、.methodModifiers()
- ネットワークインターフェース: .getIndex()、.getByIndex()
- InetSocketアドレス: .getHostString()
- Inetアドレス: .getLoopbackAddress()
- ロガー: .getGlobal()
- 同時リンクデク
- 抽象キュー同期化: .hasQueuedPredecessors()
- デフレータ出力ストリーム: 「syncFlush」を持つ 3 つのコンストラクター。
- デフレーター: .NO_FLUSH、.SYNC_FLUSH、.FULL_FLUSH、4 つの引数を持つ .deflate()
基本的にはこれですべてです。特に、NIO 2.0 は存在せず、Arrays.asList はまだ @SafeVarargs ではありません。