web-dev-qa-db-ja.com

Android N Java 8つの機能(Jackコンパイラ)とKotlin相互運用機能

アップデート3。KOTLIN IS NOWOFFIALIALLY SUPPORTED FOR FOR Android DEVELOPMENT 。BY GOOGLE。YAAAAAAAAS!

Update 2JetBrainsは、長期的にはAndroid 。私は幸せなkotlinユーザーです:)。

Update:JetBrainsのHadi Hariri、 このトピックに関する情報を公開する予定であることに言及 。彼らが行ったら、この投稿を更新します。


===廃止されたもの次へ===

Googleは、近日公開予定のAndroid Nにいくつかの興味深い機能があり、最も注目すべきは部分的な Java 8言語サポート です。これは新しいため可能です- ジャックツールチェーン Googleは作業中です。

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

新しいJackツールチェーン:
Jack.Java-> .jack-> .dex

Googleは、JackAndroid development。Update:Jack廃止予定 になりました。

私の質問は、この新しいツールチェーンが将来、Android開発用のkotlinユーザーとして私にどのような影響を与えるでしょうか? 「過去にスタック」しますか?

97
Tudor Luca

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

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

62
Lukas Bergstrom

@ Pavel Dudka

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

enter image description here

ご覧のとおり、JackはJavaソースコードを直接Dexファイルにコンパイルします!中間の* .classファイルはもうないので、dxツールは不要です!

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

そして、それがジルの出番です。

enter image description here

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

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

幸いなことに、ジャックはすぐに使用できる重要な機能をいくつか提供しています。

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

利点:

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

  • Predexing

    JACKライ​​ブラリファイルを生成すると、ライブラリの.dexが生成され、pre-dexとして.jackライブラリファイル内に保存されます。コンパイル時に、JACKは各ライブラリのプレデックスを再利用します。すべてのライブラリは事前設定されています。

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

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

  • 再梱包

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

  • Multidexサポート

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

欠点:

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

GoogleはデフォルトのツールとしてPush Jackを使用しませんが、Jack and Jill
Jillを使用して.classファイルをdexにコンパイルすることはここにあります。それ以外の場合は、jar/aarライブラリに別れを告げることができます。

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

さらに、JackとDexは公開されています。kotlinチームは、kotlinソースコードから.jackまたは.dexファイルを出力するツールを作成することを妨げるものはありません。

7
Teovald

更新(2017/03/16)

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


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

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

Jack and Jill Application Build

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

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

7
Michael

今日のブログ投稿( Kotlin's Android Roadmap )で述べたように:

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

したがって、Kotlinは最終的にJack&Jillをサポートし、その恩恵を受けることになります。

5
hotkey

最新のGoogle発表によると-

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

Jackツールチェーンを介してJava 8のサポートを追加することを最初にテストしました。 Jackツールチェーンを試してみて、すばらしいフィードバックをくれてありがとう。新しいサポートがリリースされるまで、Jackを使用してJava 8コードをビルドし続けることができます。 。

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

ソース: Java Androidでの8言語機能サポート)の将来

2
Aniket Thakur

公式のKotlinのブログからこのブログ投稿を既に見つけました:: Kotlin’s Android Roadmap

そこには、それを伝える部分があります:

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

だから、@ LukasBergstromが言ったように、「過去に立ち往生する」ことに問題はありません;-)

このトピックにリンクされているRedditディスカッションも確認できます。 ジャックとジルとのコトリンのステータスは?

ハッピーコーディング。

1
piotrek1543

Kotlin blog によると、リリース1.1-beta2の新機能セクション:

Jackツールチェーンが有効な場合のAndroidプロジェクトのビルドのサポート(jackOptions {true});

0
David Kindred