R8とは何か

2019/07/19

R8はProGuardの後継として導入されたAndroid用のコード圧縮ツールです。

特徴は

  • コードの圧縮、desugar、dexをまとめて一気に実行できる
  • ProGuardよりも高速で、出力サイズも小さくなる(というのが謳い文句)
  • ProGuardの設定ファイルをそのまま読める

といったあたりでしょうか。

このR8、Android Gradle plugin 3.4.0からは標準で有効になっています。

R8 enabled by default: R8 integrates desugaring, shrinking, obfuscating, optimizing, and dexing all in one step—resulting in noticeable build performance improvements. R8 was introduced in Android Gradle plugin 3.3.0 and is now enabled by default for both app and Android library projects using plugin 3.4.0 and higher.

Android Gradle plugin 3.4.0はAndroid Studio 3.4に同梱されています。なので、Android Studioを最新化していて設定を特に弄っていない場合は、意識せずともProGuardではなくR8が適用されている、ということになります。

大抵のケースではそのままR8に移行して問題ないようなのですが、やはり完全ではない様子。

意識せずにR8を導入していて何か変だぞ?と感じた方は一度チェックしてみるといいかもしれません。

ちなみに冒頭で「R8はProGuardの後継」と書きましたが、これ厳密には正しくないです。R8はAndroid開発チームの手によるもので、ProGuardはGuardSquareが開発しています。両者は別モノ。ProGuardはAndroid専用ではないですしね。

ProGuardの開発元は「全ての面でR8が優れているというわけじゃないよ」と主張しているようです。

GuardSquareはProGuardを引き続き開発していくようですし、最適化って一筋縄じゃいかない領域なので、場合によってはProGuardのほうが好ましい、というケースも多少は残るのかな、と思っています。

補足:desugarとは

javacがコンパイルした出力に対してバイトコード変換を行う仕組みです。Java 8の言語機能で実装されている部分をJava 6のバイトコードに変換します。

Androidの仮想マシン(Dalvik処理系)はJava 6相当なので、Java 8の言語機能(ラムダ式とか)を動かすために必要な工程です。

参考URL




関連(するかもしれない)記事


おススメ