デフォルト設定でアプリの最適化を有効にすると、R8 はパフォーマンスのメリットを最大限に高めるために、広範な最適化を行います。R8 は、クラス、フィールド、メソッドの名前の変更、移動、削除など、コードに大幅な変更を加えます。これらの変更によってエラーが発生する場合は、keep ルールで宣言して、R8 が変更すべきでないコードの部分を指定する必要があります。
保持ルールが必要な一般的なシナリオ
R8 は、コード内のすべての直接呼び出しを特定して保持します。ただし、R8 は間接的なコードの使用を認識できないため、アプリに必要なコードが削除されてクラッシュが発生する可能性があります。keep ルールを使用して、間接的に使用されるコードを保持するように R8 に指示します。保持ルールが必要になる一般的な状況は次のとおりです。
- リフレクションによってアクセスされるコード: R8 は、クラス、フィールド、メソッドがリフレクションによってアクセスされるタイミングを特定できません。たとえば、R8 は
Class.getDeclaredMethod()
を使用して名前でルックアップされたメソッドや、Class.getAnnotation()
で取得されたアノテーションを識別できません。このような場合、R8 はこれらのメソッドとアノテーションの名前を変更するか、完全に削除する可能性があります。これにより、実行時にClassNotFoundException
またはNoSuchMethodException
が発生します。 - Java Native Interface(JNI)から呼び出されるコード: ネイティブ(C または C++)コードが Java または Kotlin メソッドを呼び出す場合、または Java または Kotlin コードが JNI を使用して C++ コードを呼び出す場合、呼び出しはメソッド名の動的文字列ルックアップに基づきます。R8 は動的な文字列ベースのメソッド呼び出しを認識できないため、最適化によってコードが破損する可能性があります。
これは保持ルールが必要なシナリオの完全なリストではありませんが、保持ルールが必要になる可能性のあるほとんどのケースを網羅しています。
アプリに保持ルールを追加する方法
ルールは、アプリ モジュールのルート ディレクトリにある proguard-rules.pro
ファイルに追加する必要があります。ファイルがすでに存在している場合もあれば、存在していない場合もあります。存在していない場合は作成してください。ファイル内のルールを適用するには、次のコードに示すように、モジュール レベルの build.gradle.kts
(または build.gradle
)ファイルでファイルを宣言する必要があります。
Kotlin
android { buildTypes { release { isMinifyEnabled = true isShrinkResources = true proguardFiles( // File with default rules provided by the Android Gradle Plugin getDefaultProguardFile("proguard-android-optimize.txt"), // File with your custom rules "proguard-rules.pro" ) // ... } } // ... }
Groovy
android { buildTypes { release { minifyEnabled true shrinkResources true proguardFiles( // File with default rules provided by the Android Gradle Plugin getDefaultProguardFile('proguard-android-optimize.txt'), // File with your custom rules. 'proguard-rules.pro' ) // ... } } // ... }
デフォルトでは、ビルドファイルには proguard-android-optimize.txt
ファイルも含まれます。このファイルには、ほとんどの Android プロジェクトに必要なルールが含まれているため、ビルドファイルに残しておく必要があります。このファイルは proguard-common.txt
ファイルに基づいており、コンテンツを共有しています。
大規模なアプリでは、通常、複数のライブラリ モジュールにコードが含まれています。このような場合は、特定のライブラリ モジュール内で、適用されるコードの横に保持ルールを配置する方が望ましいことがよくあります。ライブラリのキープルールの維持における重要な違いは、ライブラリ モジュールの build.gradle.kts
(または build.gradle
)ファイル内でこれらのルールを宣言する方法にあります。詳しくは、ライブラリ作成者向けの最適化をご覧ください。
保持ルールを追加する
保持ルールを追加する際は、グローバル オプションを含めることも、独自の保持ルールを定義することもできます。
- グローバル オプション: グローバル オプションは、コードベース全体に対する R8 の動作に影響する一般的なディレクティブです。詳細については、グローバル オプションをご覧ください。
- 保持ルール: 保持ルールは、アプリを誤って破損させることなくコードの最適化を最大限に高める適切なバランスを確保するために、慎重に設計する必要があります。独自の保持ルールの構文については、保持ルールの構文をご覧ください。
ライブラリ作成者向けのルールを保持する
グローバル オプションと保持ルールの構文について学習したら、ライブラリ作成者向けの最適化で詳細を確認してください。