Android N Java 8機能(Jackコンパイラー)およびKotlin相互運用機能


98

アップデート 3。KOTLINは現在、 Androidの開発で公式にサポートされています。Googleによる。やぁぁぁぁぁぁぁぁぁす!

アップデート2JetBrainsは長期的にはKotlin for Androidのサポートに本当に取り組んでいるようです。私は幸せなkotlinユーザーです:)。

更新:JetBrainsのHadi Haririは、このトピックに関する情報をリリースする予定であると述べました。更新があり次第、この投稿を更新します。


===次のスタッフの廃止===

Googleは、いくつかの興味深い機能を備えたAndroid Nのプレビューをリリースしました。最も顕著なのは、Java 8言語の部分的なサポートです。これは、Googleが取り組んでいる新しいJackツールチェーンのために可能です。

javacまたはkotlincを使用する現在のツールチェーン:
javac.java-> .class)-> dx.class-> .dex
kotlinc.kt-> .class)-> dx.class-> .dex

新しいジャックツールチェーン:
ジャック.java-> .jack-> .dex

私は、GoogleがJackをAndroid開発のデフォルトのツールチェーンにすることを推進すると想定しています。更新:Jack非推奨になりました。ヤス。

私の質問は、この新しいツールチェーンが、将来、Android開発のkotlinユーザーとしてどのように影響するかということです。「過去に行き詰まった」のでしょうか?


1
(kotlin_library(multiple * .kt)=> .jar)、次にJill(.jar => Jayce)をジャックにインポートします(他の(android以外の)(plain java)jarと同様)
Selvin

ドキュメントを読む:「Jackを使用するために別のことをする必要はありません。標準のmakefileコマンドを使用してツリーまたはプロジェクトをコンパイルしてください。JackはMのデフォルトのAndroidビルドツールチェーンです。」-sourcesource.android.com/source/jack.html確かにタイプミスであり、「M」ではなくN」を意味しますか?
マークキーン、2016年

ジャックは死んだ、喜ぶ:P
EpicPandaForce 2018

回答:


63

免責事項:私はジャックに取り組んでいます

これは影響しません。KotlinのコンパイラはJava 6バイトコードを生成しますが、Jack / Jillはそれをうまくインポートできます。


7
詳細について教えてください。:)
Tudor Luca

しかし、コトリンはジャックのパフォーマンス最適化に利益をもたらすことができますか?(少なくとも1日)ジャックは非常に素晴らしいようです(現在、いくつかのベンチマークを待つことができません)
NitroG42

私はproguardの作者からのベンチマークのビデオプレゼンテーションを見てきました。少しグーグルで見つけることができます
sakis kaliakoudas

Kotlin stdlibを接続してAndroidプロジェクトを構築する際にいくつかの問題が発生しています。Jill / Jackのバグのようです。調べていただけますか?code.google.com/p/android/issues/detail?id=196084
yanex

1
それはジルがJava 8バイトコードを受け入れないことを意味しますか?ライブラリモジュールについてはどうですか?それらが.aarにコンパイルされ、Jillによってインポートされた場合も、Java 8を使用できませんか?つまり、Javaの新機能は内部プロジェクトの.javaソースでのみ使用できるということですか。
far.be 2016年

15

@Pavel Dudka

ジャック-コンパイラです。javacに似ていますが、処理が少し異なります。

ここに画像の説明を入力してください

ご覧のとおり、JackはJavaソースコードを直接Dexファイルにコンパイルします。中間の* .classファイルがないため、dxツールは必要ありません。

ちょっと待って!プロジェクトにサードパーティのライブラリ(.classファイルのコレクションとして提供される)を含めるとどうなりますか?

そして、ジルが出場する時です:

ここに画像の説明を入力してください

Jillはクラスファイルを処理し、Jackコンパイラの入力として使用できる特別なJayce形式に変換できます。

それでは、少し脇に置いて考えてみましょう...中毒になったクールなプラグインはすべてどうなりますか?それらはすべて.classファイルを必要とし、Jackコンパイラーにはもうありません...

幸いなことに、ジャックは私たちにとって重要な機能のいくつかをすぐに利用できるように提供します。

  • Retrolambda-必要ありません。ジャックはラムダを適切に処理できます
  • Proguard-ジャックに組み込まれているため、難読化と最小化を引き続き使用できます

利点:

JackはJavaプログラミング言語1.7をサポートし、以下に説明する追加機能を統合します。

  • プレデキシング

    JACKライ​​ブラリファイルを生成すると、ライブラリの.dexが生成され、.jackライブラリファイル内にpre-dexとして格納されます。コンパイル時に、JACKは各ライブラリのpre-dexを再利用します。すべてのライブラリは事前に指定されています。

  • インクリメンタルコンパイル

    増分コンパイルとは、最後のコンパイル以降に変更されたコンポーネントとその依存関係のみが再コンパイルされることを意味します。インクリメンタルコンパイルは、変更がコンポーネントの限られたセットのみに制限されている場合、フルコンパイルよりも大幅に高速化できます。

  • 再梱包

    JACKはjarjar構成ファイルを使用して再パッケージを行います。

  • Multidexサポート

    dexファイルは65Kメソッドに制限されているため、65Kを超えるメソッドを持つアプリは複数のdexファイルに分割する必要があります。(multidexの詳細については、「65Kを超える方法でアプリを構築する」を参照してください。)

短所:

  • 変換APIはジャックではサポートされていません-変更できる中間Javaバイトコードがないため、ここで言及しなかった一部のプラグインは機能しなくなります
  • 注釈処理は現在Jackではサポートされていないため、DaggerやAutoValueなどのライブラリに大きく依存している場合は、Jackに切り替える前によく考える必要があります。編集:Jake Whartonが指摘したように、Jack in N Previewは注釈処理をサポートしていますが、Gradleからはまだ公開されていません。
  • Javaバイトコードレベルで動作するLint検出器はサポートされていません。
  • Jacocoはサポートされていません-まあ、私は個人的にJacocoに疑問がある(それは本当にあなたが見たいものを示していない)ので、それなしで完全に生きることができます
  • Dexguard-エンタープライズバージョンのProguardは現在サポートされていません

2016年9月現在、「注釈処理は現在ジャックによってサポートされていません」はまだ保持されますか?現在サポートされているようです...
ticofab 2016

サポートされていますが、まだバグがあります。たとえば、データバインディングはまだ機能しません。android#210615を
TmTron

注、その注釈処理が完全にジャックでサポートされていない-それはジャックが(に基づいているEclipseのコンパイラ、と同じ老朽化した状態にあるいくつかの方法が呼び出されたときにスロー例外があること、プレースホルダとして実装され、数多くの未修正のバグが提出され、そこにありますECJバグトラッカー)。
user1643723 2016年

7

Googleはデフォルトのツールとしてジャックをプッシュしませんが、Jack and Jill
Jillを使用して.classファイルをdexにコンパイルする作業はこれからです。そうでなければ、jar / aarライブラリに別れを告げることができます。

ジャックまたはジルが遅くなるかどうかはまだ議論の余地があります。Androidチームは、jackが現在のビルドプロセスよりも速くなることを望んでいますが、現在はそうではありません。

さらに、JackとDexはオープンで使用できます。kotlinチームがkotlinソースコードから.jackまたは.dexファイルを出力するツールを作成することを妨げるものはありません。


7

アップデート(2017年3月16日)

幸い、ジャックは死んでいるので、Kotlin開発者には影響しません。


ジャックが未来であるなら、あなたは過去にコトリンで立ち往生するでしょう。現在Jackは、Java以外のソースをDalvikバイトコードにコンパイルできるプラグインをサポートしていません。そして、たとえそれができたとしても、JetBrainsはKotlinコンパイラに新しいバックエンドを追加する必要がありますが、これは簡単な作業ではありません。したがって、JillでKotlinを使用する必要があり、これは現在使用しているツールチェーンと非常によく似たものになります。

下の画像を見るとわかるように、Jackを明示的にオフにできない場合でも、プロジェクトをライブラリプロジェクトに変換してJillを使用することができます。そして、アプリケーションプロジェクトはこのライブラリプロジェクトを参照するだけです。

ジャックとジルのアプリケーションビルド

KotlinがJackでどのように動作するかを確認する唯一の方法は、おそらく実装されないでしょうが、JavaバックエンドをKotlinコンパイラー、つまりXtendのようなJavaコードを生成するバックエンドに追加することです。この場合、Kotlinコンパイラーによって生成されたコードは、他のJavaコードと同様にJackによって処理できます。

しかし、現時点では、Jackがリリースされたときに何をサポートするかは正確にはわかりません。多分何かが劇的に変化し、KotlinサポートをJackに追加することが可能になるでしょう。


7
実際、KotlinチームはJack&Jillをサポートする計画を持っています。彼らのライブイベントで聞いたそうですが、JetBrainsからの公式の投稿を好むので、質問には答えませんでした。
ホットキー2016年

それは素晴らしいことですが、私が聞いた唯一のサポートはジル経由です。回答で述べたように、このサポートを追加する方法はそれほど多くありません。
Michael

実際、メモリ内のコード生成(および、あまり現実的ではないオプションであるKotlin-> dex)について何かがあったため、Kotlin Androidビルドも大幅に高速化されました。
ホットキー2016年

インメモリコード生成がJack統合にどのように関係するか理解していません。そして、Kotlinからdexへのコンパイルは、JetBrainsがJackと同様の独自のツールチェーンを作成してサポートする必要があることを意味します。
Michael

1
Kotlinチーム以外の誰もができることとできないこと、またはできることとできないことを言うべきかどうかはわかりません。彼らは以前にこれについて話し、彼らが提示できる計画を持っています。
ジェイソンミナード2016年

5

今日登場したブログ投稿(KotlinのAndroidロードマップ)で述べたように、

現在、JackがKotlinで生成されたバイトコードを正しく処理できないいくつかの問題(196084および203531)がありますが、Googleチームと協力して問題を解決するか、回避策を提供する予定です。これが完了すると、すべてのクラスファイルを毎回翻訳するのではなく(古いAndroidツールで唯一可能な動作)、Jillを使用して変更されたクラスファイルのみを逐次コンパイル中に翻訳できます。

したがって、Kotlinは最終的にJack&Jillをサポートし、そこから利益を得るでしょう。


2

最新のGoogleの発表に従って-

Java 8言語機能のサポートを現在のjavacおよびdxツールセットに直接追加し、Jackツールチェーンを廃止することを決定しました。この新しい方向性があれば、Javaクラスファイル形式に依存する既存のツールとプラグインは引き続き機能します。今後、Java 8言語機能はAndroidビルドシステムでネイティブにサポートされます。今後数週間でAndroid Studioの一部としてこれをリリースすることを目指しており、この決定を早期に共有したいと考えています。

最初に、Jackツールチェーンを介したJava 8サポートの追加をテストしました。アノテーションプロセッサ、バイトコードアナライザ、リライタの影響を検討したところ、私たちのコミュニティにとってジャックへの切り替えコストが高すぎることに気付きました。Jackツールチェーンを試していただき、素晴らしいフィードバックをお寄せいただきありがとうございます。新しいサポートがリリースされるまで、Jackを使用してJava 8コードをビルドし続けることができます。Jackからの移行は、ほとんどまたはまったく作業を必要としません。

そのため、ジャックツールチェーンがAndroid開発のデフォルトツールチェーンになることを心配する必要はありません。kotlinを引き続き使用するか、通常のjavac / dxツールセットを使用できます。

出典: AndroidでのJava 8言語機能サポートの将来


1

Kotlinの公式ブログからこのブログ投稿を既に見つけました::KotlinのAndroidロードマップ

そこであなたはそれを伝える部分を見つけるでしょう:

Androidビルドのパフォーマンスを向上させるために次に計画していることは、Androidの新しいJack and Jillツールチェーンとの統合を提供することです。現在、JackがKotlinで生成されたバイトコードを正しく処理できないいくつかの問題(196084および203531)がありますが、Googleチームと協力して問題を解決するか、回避策を提供する予定です。これが完了すると、すべてのクラスファイルを毎回変換するのではなく(古いAndroidツールで可能な唯一の動作)、Jillを使用して、変更されたクラスファイルのみを逐次コンパイル中に変換できます。

したがって、@ LukasBergstromが言ったように、「過去のスタック」には何の問題もありません;-)

Redditこのトピックにリンクされたディスカッションを確認することもできます:ジャックとジルとのコトリンの状況は?

ハッピーコーディング。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.