Genel seçenekler ekleme

R8, uygulamada R8'in optimizasyonlarını değiştiren veya her saklama (keep) kuralı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.

R8, ProGuard'dan aktarılan bazı eski seçenekleri de kabul eder ancak bunları yoksayar. Daha fazla bilgi için Eski ProGuard seçeneklerini kaldırma başlıklı makaleyi inceleyin.

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. Android Gradle eklentisi (AGP) 9.1'den itibaren bu, uygulamaların varsayılan yapılandırmasıdır. Bu optimizasyonu devre dışı bırakmak için -dontrepackage simgesini kullanın.
  • -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ılırken 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 level değerleri aşağıdaki etkiye sahiptir:

    • keep kontrolleri değiştirmez.
    • remove_message, her kontrol yöntemi çağrısını, çağrının ilk bağımsız değişkeninde getClass() çağrısı olarak yeniden yazar (null kontrolünü mesaj olmadan etkili bir şekilde korur).
    • remove, kontrolleri tamamen kaldırır.

    R8 varsayılan olarak remove_message kullanır. -processkotlinnullchecks ile ilgili tüm spesifikasyonlar 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 genişletme) ö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 (stack trace) daha kolay okunabilmesi için hata ayıklama sırasında kod 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 dosyasını 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 Saklama özellikleri bölümünü inceleyin.

Saklama özellikleri

Özellikler, kodunuzun farklı bölümlerine eklenen ek bilgilerdir. Özellikler, kodunuzdaki ek açıklamalar ve genel imzalar gibi bilgileri depolar.

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() kullanarak açıklamalara erişirken RuntimeVisibleAnnotations özelliği gerekir.

Genellikle gerekli olan ö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 beri varsayılan olarak tutulur ve yalnızca AGP'nin önceki sürümlerini kullanan uygulamalarda açıkça tutulması gerekir.
EnclosingMethod Bu özellik, yerel veya anonim olmayan sınıflarda 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ı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 eski 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 için 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ı 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östermek için öncelikle hata ayıklayıcılar tarafından kullanılır. Bu sayede geliştiriciler, yürütmeyi yazdıkları koda kadar takip edebilir.

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 dosyasını 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şim senaryolarının büyük çoğunluğu için gerekli değildir. Ancak kitaplıklar optimize edilirken bu işlemlerden bazıları hâlâ sık sık 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, 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şturulurken 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 yansıtma yoluyla çalışma zamanında görülemeyen 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şturulurken 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şturulurken 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.

Eski ProGuard seçeneklerini kaldırma

R8, yalnızca ProGuard'da etkisi olan bazı seçenekleri kabul eder ancak bunları yoksayar. Bu seçenekler genellikle ProGuard'dan taşınan veya eski projelerden kopyalanan yapılandırmalarda kalır. R8 çıkışı üzerinde etkileri olmadığından, yapılandırmanızın anlaşılmasını ve sürdürülmesini kolaylaştırmak için bunları proguard-rules.pro dosyanızdan kaldırın.

R8, aşağıdaki seçenekleri uyarı vermeden yoksayar:

  • -adaptkotlinmetadata
  • -android
  • -dontpreverify
  • -dontskipnonpubliclibraryclasses
  • -dontskipnonpubliclibraryclassmembers
  • -dontusemixedcaseclassnames
  • -forceprocessing
  • -mergeinterfacesaggressively
  • -optimizationpasses
  • -optimizations
  • -overloadaggressively
  • -target
  • -verbose

R8, aşağıdaki seçenekleri yoksayar ve derleme sırasında uyarı bildirir:

  • -addconfigurationdebugging (destek, AGP 9.0'da kaldırıldı)
  • -assumenoescapingparameters
  • -assumenoexternalreturnvalues
  • -assumenoexternalsideeffects
  • -dump
  • -useuniqueclassmembernames

R8, -skipnonpubliclibraryclasses öğesini desteklemez ve yapılandırmanızda bu öğe varsa hata bildirir.