グローバル オプションを追加する

R8 には、アプリ全体で R8 の最適化を変更するか、すべての保持ルールに影響するグローバル オプションがあります。これらのオプションは、保持ルールとともに proguard-rules.pro ファイルに保持されます。これらのグローバル オプションの一部は追加の最適化を構成し、他のオプションは最適化の特定の側面をオフにします。

R8 は、ProGuard から引き継がれた一部のレガシー オプションも受け入れますが、無視します。詳しくは、以前の ProGuard オプションを削除するをご覧ください。

追加の最適化のグローバル オプション

次のグローバル オプションを使用すると、追加の最適化が可能になります。

  • -repackageclasses [<optional-package-name>]: クラスを単一のパッケージに再パッケージ化して、アプリのサイズを縮小します。オプションのパッケージ名を指定しない場合、クラスは名前のない(デフォルトの)パッケージに移動されます。クラス名からパッケージ接頭辞を省略することで DEX ファイルのサイズを小さくできるため、アプリにはこの設定が推奨されます。Android Gradle プラグイン(AGP)9.1 以降では、これがアプリのデフォルトの構成です。この最適化をオプトアウトするには、-dontrepackage を使用します。
  • -allowaccessmodification: R8 がクラス、フィールド、メソッドの可視性を変更(通常は拡大)して、より広範な最適化を実行できるようにします。proguard-android-optimize.txt が使用されている場合に有効になります。Android Gradle プラグイン(AGP)8.2 以降では、R8 による完全な最適化を有効にすると、これがデフォルトの構成になります。
  • -processkotlinnullchecks [level]: R8 が Kotlin Intrinsics の null チェックを変更して、エラー メッセージを削除するか、明示的な null チェックを完全に削除できるようにします。

    level の値は、弱いものから強いものの順に並べられ、次のような効果があります。

    • keep はチェックを変更しません。
    • remove_message は、各チェック メソッド呼び出しを、呼び出しの最初の引数に対する getClass() の呼び出しに書き換えます(効果的に null チェックを維持しますが、メッセージは含まれません)。
    • remove はチェックを完全に削除します。

    デフォルトでは、R8 は remove_message を使用します。-processkotlinnullchecks の仕様は、この設定をオーバーライドします。複数回指定された場合は、最も強い値が使用されます。

    -processkotlinnullchecks は AGP 9.0.0 以降でサポートされています。

次の例は、追加の最適化が有効になっている構成を示しています。

-repackageclasses
-allowaccessmodification

最適化を制限するグローバル オプション

次のグローバル オプションを使用すると、アプリの最適化の特定の側面をオフにできます。これらは、保持ルールを調整したり、R8 を初めてオンにしたりする場合に役立ちます。

  • -dontoptimize: コードの最適化(メソッドのインライン化など)を防ぎます。このオプションは開発中に使用できますが、本番環境ビルドでは使用しないでください。
  • -dontshrink: 参照されていないコードの削除とコードの最適化を防ぎます。このオプションは開発中に使用できますが、本番環境ビルドでは使用しないでください。
  • -dontobfuscate: クラスとメソッドの名前が短縮されるのを防ぎます。デバッグ中に難読化をオフにすると、スタック トレースが読みやすくなるため、特に便利です。このオプションは開発中に使用できますが、本番環境のビルドでは使用しないでください。
  • -keepattributes <attributes>: 保持する属性のカンマ区切りのリストを受け入れます。デフォルトの proguard-android-optimize.txt を使用していない場合、R8 は RuntimeVisibleAnnotations や Signature を含むすべての属性を削除しますが、リフレクションなどのケースでこれらの属性が必要な場合は、保持しておくと便利です。指定できる属性の一覧については、属性を保持するをご覧ください。

属性を保持する

属性は、コードのさまざまな部分に付加される追加情報です。属性には、コードのアノテーションや汎用シグネチャなどの情報が保存されます。

一部のリフレクション オペレーションでは、正常に実行するために特定の属性を保持する必要があります。次に例を示します。

  • getEnclosingMethod() または getDeclaredClasses() を使用して内部クラスまたは外部クラスの構造にアクセスする場合は、EnclosingMethod 属性と InnerClasses 属性が必要です。
  • getTypeParameters() を使用して汎用シグネチャにアクセスする場合は、属性 Signature が必要です。
  • getAnnotation() を使用してアノテーションにアクセスする場合は、RuntimeVisibleAnnotations 属性が必要です。

一般的に必要な属性

デフォルトの Proguard ファイル(proguard-android-optimize.txt または proguard-android.txt)を使用する場合、Android Gradle プラグイン(AGP)は次の属性を保持します。これらの属性の一部には、新しいバージョンの AGP が必要です。

属性 説明
AnnotationDefault この属性はアノテーション型自体にあり、アノテーション要素のデフォルト値を保存します。

注: この属性は AGP 7.1 以降ではデフォルトで保持されるため、それ以前のバージョンの AGP を使用するアプリでのみ明示的に保持する必要があります。
EnclosingMethod この属性は、ローカル クラスまたは匿名クラスではない内部クラスに存在します。クラスを直接含むメソッドまたは初期化子を識別します。
InnerClasses この属性は、別のクラス内で定義されたネストされたクラス(内部クラス、静的ネストされたクラス、ローカルクラス、匿名クラス)に関する情報を記録します。
LineNumberTable この属性は、バイトコード命令を元のソースファイル内の対応する行番号にマッピングします。

注: この属性は、Android Gradle プラグイン(AGP)8.6 以降ではデフォルトで保持されるため、AGP の以前のバージョンを使用するアプリでのみ明示的に保持する必要があります。
RuntimeVisibleAnnotations この属性は、実行時にリフレクションによって可視になるアノテーションを保存します。

通常、実行時にアノテーションが使用される場合、これはアプリとライブラリ コンシューマー ルールで必要な *Annotation 属性からの唯一のアノテーションです。
RuntimeVisibleParameterAnnotations この属性は、メソッドのパラメータのリフレクションによって実行時に表示されるアノテーションを保存します。
RuntimeVisibleTypeAnnotations この属性は、宣言だけでなく型の使用にも適用されるアノテーションを保存します。この属性は実行時に表示されます。
Signature この属性は、クラス、メソッド、フィールドのより一般的な型シグネチャを格納します。特に、ジェネリクス(List<String> など)を使用する場合に格納します。
SourceFile この属性には、クラスがコンパイルされたソースファイル(.kt ファイルまたは .java ファイル)の名前が格納されます。これは主に、コンパイルされた Java コードをステップ実行するときに元のソースコード行を表示するためにデバッガで使用されます。これにより、開発者は実行を記述したコードまでトレースできます。

注: この属性は AGP 8.2 以降ではデフォルトで保持されるため、以前のバージョンの AGP を使用するアプリでのみ明示的に保持する必要があります。

proguard-android-optimize.txt を使用するアプリの場合、AGP で定義された保持ルールはほとんどのシナリオで十分です。ただし、ライブラリのコードを記述する場合は、このリストで定義されている場合でも、ライブラリに必要なすべての属性をライブラリのコンシューマー キープルールで指定する必要があります。これにより、デベロッパーが proguard-android-optimize.txt を含めない場合でも、ライブラリが堅牢になります。

その他の保持属性

保持する追加の属性を指定できますが、ほとんどのリフレクション アクセスまたは JNI アクセスのシナリオでは必要ありません。ただし、ライブラリの最適化中に、これらのメソッドが頻繁に使用されることがあります。

属性 説明
MethodParameters この属性は、メソッドのパラメータ(特に名前とアクセス フラグ)に関する情報を提供します。
Exceptions この属性は、メソッドがスローすると宣言されているチェック済みの例外を一覧表示します。

この属性は通常、アプリには使用されません。ライブラリの作成者にとっては、通常はコンシューマーの保持ルールでは使用されませんが、ライブラリのビルド時に使用されることがよくあります。ライブラリの最適化の詳細については、ライブラリ作成者向けの最適化をご覧ください。
RuntimeInvisibleAnnotations この属性は、実行時にリフレクションで表示されないアノテーションをクラス、フィールド、メソッドに保存します。

アプリ デベロッパーはこの属性を保持しないでください。ライブラリの作成者にとって、この属性はコンシューマーの保持ルールでは関連性がありませんが、ライブラリのビルド時に使用されることがよくあります。ライブラリの最適化の詳細については、ライブラリ作成者向けの最適化をご覧ください。
RuntimeInvisibleParameterAnnotations この属性は、実行時にリフレクションで表示されないアノテーションをメソッドのパラメータに保存します。

アプリ デベロッパーはこの属性を保持しないでください。ライブラリの作成者にとって、この属性はコンシューマーの保持ルールでは関連性がありませんが、ライブラリのビルド時に使用されることがよくあります。ライブラリの最適化の詳細については、ライブラリ作成者向けの最適化をご覧ください。
RuntimeInvisibleTypeAnnotations この属性は、宣言だけでなく型の使用にも適用されるアノテーションを保存します。この属性は実行時に表示されません。

アプリ デベロッパーはこの属性を保持しないでください。ライブラリ作成者にとって、この属性はコンシューマーの保持ルールでは関連性がありませんが、ライブラリのビルド時に使用されることがよくあります。ライブラリの最適化の詳細については、ライブラリ作成者向けの最適化をご覧ください。

以前の ProGuard オプションを削除

R8 は、ProGuard でのみ有効だったオプションを受け入れますが、無視します。これらのオプションは、ProGuard から移行された構成や古いプロジェクトからコピーされた構成に残っていることがよくあります。これらは R8 の出力に影響しないため、構成を理解しやすく維持しやすくするために、proguard-rules.pro ファイルから削除してください。

R8 は、次のオプションを無視し、警告を報告しません。

  • -adaptkotlinmetadata
  • -android
  • -dontpreverify
  • -dontskipnonpubliclibraryclasses
  • -dontskipnonpubliclibraryclassmembers
  • -dontusemixedcaseclassnames
  • -forceprocessing
  • -mergeinterfacesaggressively
  • -optimizationpasses
  • -optimizations
  • -overloadaggressively
  • -target
  • -verbose

R8 は次のオプションを無視し、ビルド中に警告を報告します。

R8 は -skipnonpubliclibraryclasses をサポートしていません。 構成に が含まれている場合は、エラーが報告されます。