使用保留規則時,請務必達到適當的精確度,確保您能獲得好處,同時維持應用程式的行為。如要瞭解良好的保留規則模式,以及應避免的事項,請參閱以下各節。
保留規則的良好模式
定義完善的保留規則會盡可能具體:
如為類別規格,請盡可能指定特定類別、基本類別或註解類別,如下列範例所示:
-keepclassmembers class com.example.MyClass { void someSpecificMethod(); }
-keepclassmembers ** extends com.example.MyBaseClass { void someSpecificMethod(); }
-keepclassmembers @com.example.MyAnnotation class ** { void someSpecificMethod(); }
盡可能宣告成員規格,並只參照應用程式運作時必須保留的類別部分。建議不要將規則套用至整個類別,方法是將選用成員範圍定義為
{ *; }
,除非有嚴格需求。-keepclassmembers com.example.MyClass { void someSpecificMethod(); void @com.example.MyAnnotation *; }
如果無法遵守這些規範,可以暫時將需要保留的程式碼隔離到專屬套件中,並將保留規則套用至該套件。不過,這並非長遠之計。詳情請參閱「逐步採用最佳化措施」。如要為套件使用保留規則,請定義保留規則,如下列範例所示:
-keepclassmembers class com.example.pkg.** { *; }
應避免的事項
保留規則語法有很多選項,但為了獲得可衡量的永續效能優勢,建議不要使用下列項目:
- 請避免在保留規則中使用反轉運算子
!
,因為您可能會不慎將規則套用至應用程式中的幾乎每個類別。 - 請勿長期使用套件範圍的保留規則,例如
-keep class com.example.pkg.** { *; }
。設定 R8 時,可暫時使用這些規則解決問題。詳情請參閱「限制最佳化範圍」。一般來說,請謹慎使用萬用字元,確保只保留所需的程式碼。
如果無法遵守這些規則,您可能使用了大量開放式反射,因此應避免反射或避免使用反射的程式庫 (請參閱 Gson 個案研究)。