Genel saklama kuralları, ek saklama kuralı türleri ve global seçenekler dışında, optimizasyonunuzla ilgili sorunları gidermek için belirli kuralları kullanabilirsiniz.
-checkdiscard
-checkdiscard kuralı, R8'in kaldırılmasını beklediğiniz bir sınıfı veya üyesini başarıyla silip silmediğini kontrol etmenize olanak tanır. Belirtilen sınıf veya üye atılmazsa derleme başarısız olur.
-checkdiscard söz dizimi aşağıdaki gibidir:
-checkdiscard <class_specification>
Aşağıdaki örnekte, com.example.models.User sınıfındaki userId alanı veya setLabel() yöntemi korunursa derleme başarısız olur:
-checkdiscard class com.example.models.User{
private java.lang.String userId;
public void setLabel(java.lang.String);
}
Yöntemleri diğer sınıflara yerleştirilmişse sınıfın kodu uygulamada bulunmaya devam edebilir. Kodun tamamen kaldırıldığından ve yalnızca satır içi olarak eklenmediğinden emin olmak için -checkdiscard ile -keep,allowshrinking kuralını birleştirerek R8'in hedef sınıfta optimizasyon yapmasını engelleyen ilgili bir kural ekleyin. Bu, sınıf birleştirme ve satır içi yerleştirme gibi optimizasyonları engeller. -checkdiscard kuralı geçerse eşleşen sınıflardaki içeriklerin hiçbiri optimize edilmiş uygulamada yer almaz.
Bu kullanım şekli aşağıdaki örnekte gösterilmektedir:
# 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
R8'in uygulamanızın derlemesinde neden belirli bir sınıfı, alanı veya yöntemi tuttuğunu belirlemek için -whyareyoukeeping kuralını kullanın. Bir öğe birden fazla nedenden dolayı saklanabilir ancak bu kural yalnızca saklanan bir öğeden öğeye giden en kısa yolu açıklayan nedeni sağlar. Bu yolu kodunuzdan kaldırsanız bile öğenin farklı bir nedenle saklandığını görmeye devam edebilirsiniz.
Olası nedenler şunlardır:
Saklama kuralı: Saklama kuralı uygulamadan, kullanılan bir kitaplıktan veya AAPT (Android Asset Packaging Tool) tarafından oluşturulan kurallardan gelebilir.
Saklanan kod veya kaynaklardan gelen geçişli referanslar: R8 tarafından kod veya XML (ör. düzenler) saklanırsa statik olarak referans verdiği her şey saklanır.
Söz dizimi:
-whyareyoukeeping <class_specification>
Örneğin:
-whyareyoukeeping class com.example.foo.MainActivity {
private void setLabel(...);
}
Çıkış konsola yazdırılır.
setLabel() öğesini saklayan bir kuralınız yoksa çıkış şöyledir:
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() hedefleyen bir saklama kuralınız varsa çıkış aşağıdaki gibidir:
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