一般的な保持ルール、追加の保持ルールのタイプ、グローバル オプションの他に、特定のルールを使用して最適化のトラブルシューティングを行うことができます。
-checkdiscard
-checkdiscard ルールを使用すると、削除されるはずのクラスまたはそのメンバーが R8 によって正常に破棄されたかどうかを確認できます。指定されたクラスまたはメンバーが破棄されない場合、ビルドは失敗します。
-checkdiscard の構文は次のとおりです。
-checkdiscard <class_specification>
次の例では、com.example.models.User クラスの userId フィールドまたは setLabel() メソッドのいずれかが保持されている場合、ビルドは失敗します。
-checkdiscard class com.example.models.User{
private java.lang.String userId;
public void setLabel(java.lang.String);
}
メソッドが他のクラスにインライン化されている場合、クラスのコードはアプリに残っている可能性があります。コードが完全に削除され、インライン化されていないことを確認するには、-checkdiscard と -keep,allowshrinking ルールを組み合わせて、R8 がターゲット クラスで最適化を実行しないようにする対応するルールを追加します。これにより、クラスの統合やインライン化などの最適化が禁止されます。-checkdiscard ルールが合格した場合、一致するクラスのコンテンツは最適化されたアプリに含まれません。
使用例を次に示します。
# Either keep or remove the class, don't rename or otherwise optimize it
-keep,allowshrinking class com.example.foo { *; }
# Verify that the class and all of its fields and methods are removed.
-checkdiscard class com.example.foo
-whyareyoukeeping
-whyareyoukeeping ルールを使用して、R8 がアプリのビルドで特定のクラス、フィールド、メソッドを保持した理由を特定します。アイテムが保持される理由は複数考えられますが、このルールでは、保持されたアイテムからアイテムへの最短パスを説明する理由のみが提供されます。このパスをコードから削除しても、別の理由でアイテムが保持されることがあります。
考えられる原因は次のとおりです。
keep ルール: keep ルールは、アプリ、使用されたライブラリ、または AAPT(Android Asset Packaging Tool)によって生成されたルールから取得できます。
保持されたコードまたはリソースからの推移的参照: R8 によってコードまたは XML(レイアウトなど)が保持されると、静的に参照されるものはすべて保持されます。
構文は次のとおりです。
-whyareyoukeeping <class_specification>
次に例を示します。
-whyareyoukeeping class com.example.foo.MainActivity {
private void setLabel(...);
}
出力がコンソールに出力されます。
setLabel() を保持するルールがない場合、出力は次のようになります。
com.example.foo.MainActivity
|- is referenced in keep rule:
| /app/build/intermediates/aapt_proguard_file/release/processReleaseResources/aapt_rules.txt:4:1
Nothing is keeping void com.example.foo.MainActivity.setLabel()
setLabel() をターゲットとする保持ルールがある場合、出力は次のようになります。
com.example.foo.MainActivity
|- is referenced in keep rule:
| /app/proguard-rules.pro:23:1
void com.example.foo.MainActivity.setLabel()
|- is referenced in keep rule:
| /app/proguard-rules.pro:23:1