Genel seçenekler ekleme

R8, uygulamadaki R8 optimizasyonlarını değiştiren veya tüm koruma 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>]: Sınıfları, uygulama boyutunu daha da küçültmek için tek bir belirtilen pakette yeniden paketler. İsteğe bağlı paket adını sağlamazsanız sınıflar boş olan varsayılan pakete taşınır. Bu, uygulamalar için önerilen bir 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.txt kullanıldığında etkinleştirilir. Android Gradle Plugin (AGP) 8.2'den itibaren, R8'i tam modda kullanıyorsanız bu yapılandırma varsayılan yapılandırmadır.

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 yapma) engeller. 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ılan proguard-android-optimize.txt'ı kullanmıyorsanız R8, RuntimeVisibleAnnotations ve Signature dahil 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 Korunacak özellikler 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() veya getDeclaredClasses() kullanarak iç veya dış sınıf yapısına erişirken EnclosingMethod ve InnerClasses özellikleri gerekir.
  • getTypeParameters() kullanılarak genel imzalara erişilirken Signature özelliği gerekir.
  • getAnnotation() kullanılarak açıklamalara erişilirken RuntimeVisibleAnnotations ö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ının AGP'nin daha yeni sürümlerini gerektirdiğ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 sınıfların iç sınıflarında bulunur. Sınıfı doğrudan içeren yöntemi veya başlatıcıyı tanımlar.
InnerClasses Bu özellik, başka bir sınıfta tanımlanan iç içe sınıflarla (iç sınıflar, statik iç içe sınıflar, yerel sınıflar ve anonim sınıflar) ilgili 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 yerine tür kullanımları için geçerli olan ek açıklamaları depolar. 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ı saklar.
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östermek 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 önceki 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 kitaplıklar optimize edilirken bu yöntemlerden bazıları hâlâ sıkça kullanılabilir.

Ö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, çalışma zamanında yansıtma ile görünmeyen ek açıklamaları bir sınıfta, alanda veya yöntemde 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 yerine tür kullanımları için geçerli olan ek açıklamaları depolar. 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.