R8, uygulamadaki R8 optimizasyonlarını değiştiren veya tüm keep kurallarını etkileyen genel seçenekler sunar. Bu seçenekler, saklama kurallarıyla birlikte proguard-rules.pro dosyasında tutulur. Bu genel seçeneklerden bazıları ek optimizasyon yapılandırırken bazıları optimizasyonun belirli yönlerini devre dışı bırakır.
Ek optimizasyon için genel seçenekler
Aşağıdaki genel seçenekler ek optimizasyon sağlar:
-repackageclasses [<optional-package-name>]: Uygulama boyutunu küçültmek için sınıfları tek bir pakette yeniden paketler. İsteğe bağlı paket adını sağlamazsanız sınıflar, adsız varsayılan pakete taşınır. Bu, sınıf adlarından paket önekini çıkararak daha küçük DEX dosyaları oluşturduğu için uygulamalar için önerilen ayardır.-allowaccessmodification: R8'in daha kapsamlı optimizasyonlar gerçekleştirmek için sınıfların, alanların ve yöntemlerin görünürlüğünü değiştirmesine (genellikle genişletmesine) olanak tanır.proguard-android-optimize.txtkullanıldığında etkinleştirilir. Android Gradle eklentisi (AGP) 8.2'den itibaren, R8 ile tam optimizasyonu etkinleştirirseniz bu varsayılan yapılandırmadır.-processkotlinnullchecks [level]: R8'in Kotlin Intrinsics null kontrollerini yalnızca hata mesajını kaldıracak veya açık null kontrolünü tamamen kaldıracak şekilde değiştirmesine olanak tanır.En zayıftan en güçlüye doğru sıralanan
leveldeğerleri aşağıdaki etkiye sahiptir:keepkontrolleri değiştirmez.remove_messageher kontrol yöntemi çağrısını, çağrının ilk bağımsız değişkenindegetClass()çağrısı olarak yeniden yazar (null kontrolünü etkili bir şekilde korur ancak mesaj içermez).remove, kontrolleri tamamen kaldırır.
R8, varsayılan olarak
remove_messagekullanır.-processkotlinnullchecksile ilgili tüm tanımlamalar bunu geçersiz kılar. Birden fazla kez belirtilirse en güçlü değer kullanılır.-processkotlinnullchecks, AGP 9.0.0'dan itibaren desteklenir.
Aşağıda, ek optimizasyonun etkinleştirildiği bir yapılandırma örneği verilmiştir:
-repackageclasses
-allowaccessmodification
Optimizasyonu sınırlamaya yönelik genel seçenekler
Aşağıdaki genel seçenekler, uygulama optimizasyonunun belirli yönlerini devre dışı bırakmanıza olanak tanır ve saklama kurallarınızı hassaslaştırırken veya R8'i ilk kez etkinleştirirken faydalıdır.
-dontoptimize: Kod optimizasyonunu (ör. yöntem satır içi yerleştirme) önler. Bu seçenek geliştirme sırasında kullanılabilir ancak üretim derlemelerinde kullanılmamalıdır.-dontshrink: Referans verilmeyen kodun ve kod optimizasyonlarının kaldırılmasını önler. Bu seçenek geliştirme sırasında kullanılabilir ancak üretim derlemelerinde kullanılmamalıdır.-dontobfuscate: Sınıf ve yöntem adlarının kısaltılmasını önler. Yığın izlemelerinin daha kolay okunabilmesi için hata ayıklama sırasında karartmayı devre dışı bırakmak özellikle yararlı olabilir. Bu seçenek geliştirme sırasında kullanılabilir ancak üretim derlemelerinde kullanılmamalıdır.-keepattributes <attributes>: Korunması gereken özelliklerin virgülle ayrılmış listesini kabul eder. Varsayılanproguard-android-optimize.txt'ı kullanmıyorsanız R8,RuntimeVisibleAnnotationsveSignaturedahil olmak üzere tüm özellikleri kaldırır. Ancak yansıtma gibi durumlarda bu özelliklere ihtiyaç duyulursa korunmaları faydalı olabilir. Belirtebileceğiniz özelliklerin listesi için Özellikleri koruma başlıklı makaleyi inceleyin.
Özellikleri koruma
Özellikler, kodunuzun farklı bölümlerine eklenen ek bilgi parçalarıdır. Özellikler, kodunuzdaki ek açıklamalar ve genel imzalar gibi bilgileri saklar.
Belirli yansıtıcı işlemlerin başarılı bir şekilde yürütülmesi için belirli özelliklerin korunması gerekir. Örneğin:
getEnclosingMethod()veyagetDeclaredClasses()kullanarak iç veya dış sınıf yapısına erişirkenEnclosingMethodveInnerClassesözellikleri gerekir.getTypeParameters()kullanılarak genel imzalara erişilirkenSignatureözelliği gerekir.getAnnotation()kullanılarak açıklamalara erişilirkenRuntimeVisibleAnnotationsözelliği gerekir.
Sık kullanılan zorunlu özellikler
Varsayılan Proguard dosyası (proguard-android-optimize.txt veya proguard-android.txt) kullanılırken Android Gradle eklentisi (AGP) aşağıdaki özellikleri korur. Bu özelliklerden bazıları için AGP'nin daha yeni sürümlerinin gerektiğini unutmayın:
| Özellik | Açıklama |
|---|---|
AnnotationDefault |
Bu özellik, açıklama türlerinde bulunur ve bir açıklama öğesinin varsayılan değerini depolar. Not: Bu özellik, AGP 7.1'den itibaren varsayılan olarak korunur ve yalnızca AGP'nin önceki sürümlerini kullanan uygulamalarda açıkça korunması gerekir. |
EnclosingMethod |
Bu özellik, yerel veya anonim olmayan iç sınıflarda bulunur. Sınıfı hemen içeren yöntemi veya başlatıcıyı tanımlar. |
InnerClasses |
Bu özellik, başka bir sınıf içinde tanımlanan iç içe sınıflar (iç sınıflar, statik iç içe sınıflar, yerel sınıflar ve anonim sınıflar) hakkındaki bilgileri kaydeder. |
LineNumberTable |
Bu özellik, bayt kodu talimatlarını orijinal kaynak dosyasındaki karşılık gelen satır numaralarıyla eşler. Not: Bu özellik, Android Gradle Eklentisi (AGP) 8.6'dan itibaren varsayılan olarak korunur ve yalnızca AGP'nin önceki sürümlerini kullanan uygulamalarda açıkça korunması gerekir. |
RuntimeVisibleAnnotations |
Bu özellik, yansıtma yoluyla çalışma zamanında görülebilen ek açıklamaları depolar. Genellikle, çalışma zamanında ek açıklamalar kullanılıyorsa bu, uygulamaların ve kitaplık tüketicisi kurallarında gereken *Annotation özelliklerinden tek ek açıklamadır. |
RuntimeVisibleParameterAnnotations |
Bu özellik, bir yöntemin parametreleri üzerinde yansıtma yoluyla çalışma zamanında görülebilen ek açıklamaları depolar. |
RuntimeVisibleTypeAnnotations |
Bu özellik, yalnızca bildirimler için değil, tür kullanımları için de geçerli olan ek açıklamaları saklar. Bu özellik, çalışma zamanında görünür. |
Signature |
Bu özellik, özellikle jenerik türler (ör. List<String>) kullanıldığında sınıflar, yöntemler ve alanlar için daha genel bir tür imzası depolar. |
SourceFile |
Bu özellik, bir sınıfın derlendiği kaynak dosyanın (.kt veya .java dosyası) adını saklar. Bu özellik, derlenmiş Java kodunda adım adım ilerlerken orijinal kaynak kodu satırlarını görüntülemek için öncelikle hata ayıklayıcılar tarafından kullanılır. Geliştiricilerin yürütmeyi yazdıkları koda kadar izlemelerine yardımcı olur. Not: Bu özellik, AGP 8.2'den itibaren varsayılan olarak korunur ve yalnızca AGP'nin eski sürümlerini kullanan uygulamalarda açıkça korunması gerekir. |
proguard-android-optimize.txt kullanan uygulamalarda, AGP tarafından tanımlanan saklama kuralları çoğu senaryoda yeterlidir. Ancak bir kitaplık için kod yazıyorsanız bu listede tanımlanmış olsalar bile kitaplığınızın gerektirdiği tüm özellikleri tüketici saklama kurallarında belirtmeniz gerekir. Bu, geliştiriciler proguard-android-optimize.txt'yı dahil etmemeye karar verirse kitaplığınızın sağlam olmasını sağlar.
Ek saklama özellikleri
Saklanacak ek özellikler belirtebilirsiniz ancak bu özellikler, yansıtıcı veya JNI erişimi senaryolarının büyük çoğunluğu için gerekli değildir. Ancak bunlardan bazıları kitaplıkları optimize ederken sık sık kullanılmaya devam edebilir.
| Özellik | Açıklama |
|---|---|
MethodParameters |
Bu özellik, bir yöntemin parametreleri (özellikle adları ve erişim işaretleri) hakkında bilgi sağlar. |
Exceptions |
Bu özellik, bir yöntemin oluşturduğu kontrol edilmiş istisnaları listeler. Bu özellik genellikle uygulamalar için kullanılmaz. Kitaplık yazarları için genellikle tüketici saklama kurallarında kullanılmaz ancak kitaplık oluştururken sıklıkla kullanılır. Kitaplıkları optimize etme hakkında ayrıntılı bilgi için Kitaplık yazarları için optimizasyon başlıklı makaleyi inceleyin. |
RuntimeInvisibleAnnotations |
Bu özellik, bir sınıfta, alanda veya yöntemde çalışma zamanında yansıtma ile görünmeyen ek açıklamaları depolar. Uygulama geliştiriciler bu özelliği saklamamalıdır. Kitaplık yazarları için bu özellik, tüketici saklama kurallarında geçerli değildir ancak kitaplık oluştururken sıklıkla kullanılır. Kitaplıkları optimize etme hakkında ayrıntılı bilgi için Kitaplık yazarları için optimizasyon başlıklı makaleyi inceleyin. |
RuntimeInvisibleParameterAnnotations |
Bu özellik, bir yöntemin parametrelerinde çalışma zamanında yansıtmayla görünür olmayan ek açıklamaları depolar. Uygulama geliştiriciler bu özelliği saklamamalıdır. Kitaplık yazarları için bu özellik, tüketici saklama kurallarında geçerli değildir ancak kitaplık oluştururken sıklıkla kullanılır. Kitaplıkları optimize etme hakkında ayrıntılı bilgi için Kitaplık yazarları için optimizasyon başlıklı makaleyi inceleyin. |
RuntimeInvisibleTypeAnnotations |
Bu özellik, yalnızca bildirimler için değil, tür kullanımları için de geçerli olan ek açıklamaları saklar. Bu özellik çalışma zamanında görünmez. Uygulama geliştiriciler bu özelliği saklamamalıdır. Kitaplık yazarları için bu özellik, tüketici saklama kurallarında geçerli değildir ancak kitaplık oluştururken sıklıkla kullanılır. Kitaplıkları optimize etme hakkında ayrıntılı bilgi için Kitaplık yazarları için optimizasyon başlıklı makaleyi inceleyin. |