R8 には、アプリ全体で R8 の最適化を変更するか、すべての保持ルールに影響するグローバル オプションが用意されています。これらのオプションは、保持ルールとともに proguard-rules.pro
ファイルに保持されます。これらのグローバル オプションの一部は追加の最適化を構成し、一部は最適化の特定の側面をオフにします。
追加の最適化のグローバル オプション
次のグローバル オプションを使用すると、追加の最適化を有効にできます。
-repackageclasses [<optional-package-name>]
: アプリサイズをさらに縮小するため、クラスを単一の指定されたパッケージに再パッケージ化します。オプションのパッケージ名を指定しない場合、クラスは空のデフォルト パッケージに移動されます。これはアプリの推奨設定です。-allowaccessmodification
: R8 がクラス、フィールド、メソッドの可視性を変更(通常は拡大)して、より広範な最適化を実行できるようにします。proguard-android-optimize.txt
が使用されている場合に有効になります。Android Gradle プラグイン(AGP)8.2 以降では、R8 をフルモードで使用する場合、これがデフォルトの構成になります。
追加の最適化が有効になっている構成の例を次に示します。
-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 |
この属性は、宣言だけでなく型の使用にも適用されるアノテーションを保存します。この属性は実行時には表示されません。 アプリ デベロッパーはこの属性を保持すべきではありません。ライブラリ作成者にとって、この属性はコンシューマーの保持ルールでは関係ありませんが、ライブラリのビルド時に使用されることがよくあります。ライブラリの最適化の詳細については、ライブラリ作成者向けの最適化をご覧ください。 |