Android studioは2つの新しいツールD8とR8を導入しました。Googleのドキュメントによると、D8はdexツールであり、R8はprogourdツールですが、その説明として、両方とも以下のようにほぼ同じことを行っています:
D8は、Javaバイトコードをdexコードに変換するデクサーです。
R8はJavaプログラムの縮小および縮小ツールであり、Javaバイトコードを最適化されたdexコードに変換します。
どちらもJavaバイトコードを文字通りdexコードに変換しているようです。それで、dexコードを変換する場合、実際に彼らは内部で何をしていますか?
D8デクサーとR8シュリンカー
D8-> D8は、Javaバイトコードをdexコードに変換するデクサーです。
R8-> R8は、Javaプログラムの縮小および縮小ツールであり、Javaバイトコードを最適化されたdexコードに変換します。
Android開発者は、dexのコンパイルがAPKを構築する上で重要なステップであることを知っています。これは、Androidランタイム(または古いバージョンのAndroidの場合はDalvik)の.classバイトコードを.dexバイトコードに変換するプロセスです。dexコンパイラは、ほとんどの場合、日常の内部で動作します。日間のアプリ開発ですが、アプリのビルド時間、.dexファイルサイズ、ランタイムパフォーマンスに直接影響します。
R8プロジェクトは、chromiumプロジェクトのdepot_toolsを使用して依存関係を管理します。続行する前に、depot_toolsをインストールしてパスに追加します。
R8プロジェクトはJava 8言語機能を使用し、Java 8コンパイラおよびランタイムシステムが必要です。
真のデバッグビルドのサポート。 Androidマニフェストでデバッグ可能の値を変更する必要はありません。
インクリメンタルビルドは自動的にdebuggable == trueを挿入しますが、「署名付き/署名なしのアプリケーションパッケージのエクスポート」は使用しません。 debuggable = trueが設定されている場合、リリースビルドは実際にデバッグビルドを実行します。
リリースビルドでの自動Proguardサポート。 proguard.configのみが必要です
proguard構成ファイルを指すdefault.propertiesのプロパティ。
Visual Layout Editorを完全に書き直しました。これは非常に進行中の作業です。
ウィジェットをレイアウトビュー内で、あるレイアウトビューから別のレイアウトビューに、またあるレイアウトファイルから別のレイアウトファイルに移動します。
列挙型/フラグ型のプロパティを持つコンテキストメニュー。
このブログポストの紹介は、その質問に答えるための素晴らしいリソースだと思います: https://jakewharton.com/r8-optimization-staticization
R8は、最適化も実行するD8のバージョンです。これは別個のツールやコードベースではなく、同じツールがより高度なモードで動作するだけです。 D8が最初にJavaバイトコードを独自の中間表現(IR)に解析してからDalvikバイトコードを書き出す場合、R8は、書き出される前にIRに最適化パスを追加します。
D8は各Javaクラスファイルをプログラム全体を個別に調べることなく個別に処理します。これにより、クラスを並行して処理できるため、DEXへの変換が高速になり、開発中にコードがクラスが変更された。
一方、R8(ProGuardのような)はアプリケーション全体を読み取り、クラス階層全体を知る必要のある変更と最適化(インライン化など)を行います。たとえば、R8は未使用のクラスとメソッド(「ツリーの揺れ」)を削除し、クラス、メソッド、およびフィールドの名前を変更します(アプリケーションのエントリポイントを除く)。
Android Studio 3.1では、D8はDXをJavaクラスファイルをDEXに変換するツールとして置き換えましたが、R8はまだ有効になっていません。