Podczas pracy z regułami zachowywania danych ważne jest, aby osiągnąć odpowiedni poziom szczegółowości, który zapewni Ci korzyści przy jednoczesnym zachowaniu działania aplikacji. W sekcjach poniżej znajdziesz informacje o dobrych wzorcach i rzeczach, których należy unikać w przypadku reguł przechowywania.
Dobre wzorce w regułach przechowywania
Dobrze zdefiniowane reguły przechowywania są jak najbardziej szczegółowe:
W specyfikacji klasy zawsze podawaj konkretną klasę, klasę bazową lub klasę z adnotacjami, jeśli to możliwe, jak pokazano w tych przykładach:
-keepclassmembers class com.example.MyClass { void someSpecificMethod(); }
-keepclassmembers ** extends com.example.MyBaseClass { void someSpecificMethod(); }
-keepclassmembers @com.example.MyAnnotation class ** { void someSpecificMethod(); }
W miarę możliwości należy zadeklarować specyfikację elementu i odwoływać się tylko do tych części klasy, które muszą być zachowane, aby aplikacja działała. Nie zalecamy stosowania reguły do całej klasy przez zdefiniowanie opcjonalnego zakresu elementu jako
{ *; }
, chyba że jest to bezwzględnie konieczne.-keepclassmembers com.example.MyClass { void someSpecificMethod(); void @com.example.MyAnnotation *; }
Jeśli nie możesz przestrzegać tych wytycznych, możesz tymczasowo odizolować kod, który ma zostać zachowany, w dedykowanym pakiecie i zastosować do niego regułę zachowywania. Nie jest to jednak rozwiązanie długoterminowe. Więcej informacji znajdziesz w artykule Stopniowe wprowadzanie optymalizacji. Aby użyć reguły przechowywania pakietu, zdefiniuj ją tak jak w tym przykładzie:
-keepclassmembers class com.example.pkg.** { *; }
Czego warto unikać
Składnia reguły zachowywania ma wiele opcji, ale w przypadku mierzalnych korzyści związanych ze zrównoważonym rozwojem nie zalecamy używania tych elementów:
- Unikaj używania operatora odwrócenia
!
w regułach zachowywania, ponieważ możesz nieumyślnie zastosować regułę do niemal każdej klasy w aplikacji. - Nie używaj reguł przechowywania obejmujących cały pakiet, takich jak
-keep class com.example.pkg.** { *; }
, przez dłuższy czas. Można ich tymczasowo używać do rozwiązywania problemów podczas konfigurowania R8. Więcej informacji znajdziesz w artykule Ograniczanie zakresu optymalizacji. Ogólnie rzecz biorąc, zachowaj ostrożność w przypadku symboli wieloznacznych – upewnij się, że zachowujesz tylko potrzebny kod.
Jeśli nie możesz przestrzegać tych reguł, prawdopodobnie używasz wielu otwartych odbić i powinieneś ich unikać lub unikać biblioteki, która ich używa (patrz studium przypadku Gson).