Saklama kuralları hakkında

Varsayılan ayarları kullanarak uygulama optimizasyonunu etkinleştirdiğinizde R8, performans avantajlarınızı en üst düzeye çıkarmak için kapsamlı optimizasyonlar gerçekleştirir. R8, sınıfları, alanları ve yöntemleri yeniden adlandırma, taşıma ve kaldırma da dahil olmak üzere kodda önemli değişiklikler yapar. Bu değişikliklerin hatalara neden olduğunu fark ederseniz R8'in kodun hangi bölümlerini değiştirmemesi gerektiğini keep kurallarında belirterek belirtmeniz gerekir.

Saklama kurallarının gerekli olduğu yaygın senaryolar

R8, kodunuzdaki tüm doğrudan çağrıları tanımlar ve korur. Ancak R8, dolaylı kod kullanımlarını göremez. Bu durum, R8'in uygulamanızın ihtiyaç duyduğu kodu kaldırmasına ve kilitlenmelere neden olabilir. R8'e bu tür dolaylı olarak kullanılan kodu korumasını söylemek için koruma kurallarını kullanın. Saklama kurallarına ihtiyaç duyabileceğiniz bazı yaygın durumlar şunlardır:

  • Yansıtma yoluyla erişilen kod: R8, sınıflara, alanlara veya yöntemlere yansıtma yoluyla erişildiğinde bunu tanımlayamaz. Örneğin, R8, Class.getDeclaredMethod() kullanılarak adına göre aranan bir yöntemi veya Class.getAnnotation() ile alınan bir ek açıklamayı tanımlayamaz. Bu durumlarda R8, bu yöntemleri ve ek açıklamaları yeniden adlandırabilir veya tamamen kaldırabilir. Bu da çalışma zamanında ClassNotFoundException veya NoSuchMethodException hatasına neden olur.
  • Java Native Interface (JNI) üzerinden çağrılan kod: Yerel (C veya C++) kodu bir Java ya da Kotlin yöntemini çağırdığında veya Java ya da Kotlin kodu JNI ile C++ kodunu çağırdığında, çağrı yöntemin adının dinamik dize aramasına dayanır. R8, dinamik dize tabanlı yöntem çağrısını göremediği için optimizasyonları kodunuzu bozabilir.

Bu, saklama kurallarının gerekli olduğu senaryoların tam listesi değildir ancak bu senaryolar, saklama kurallarına ihtiyaç duyabileceğiniz durumların çoğunu kapsar.

Uygulamanıza saklama kuralları ekleme

Kurallarınızı, uygulama modülünün kök dizininde bulunan bir proguard-rules.pro dosyasına eklemeniz gerekir. Bu dosya zaten mevcut olabilir ancak mevcut değilse oluşturun. Dosyadaki kuralları uygulamak için dosyayı aşağıdaki kodda gösterildiği gibi modül düzeyindeki build.gradle.kts (veya build.gradle) dosyanızda beyan etmeniz gerekir:

Kotlin

android {
    buildTypes {
        release {
            isMinifyEnabled = true
            isShrinkResources = true

            proguardFiles(
                // File with default rules provided by the Android Gradle Plugin
                getDefaultProguardFile("proguard-android-optimize.txt"),

                // File with your custom rules
                "proguard-rules.pro"
            )
           // ...
        }
    }
    // ...
}

Groovy

android {
    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true

            proguardFiles(
                // File with default rules provided by the Android Gradle Plugin
                getDefaultProguardFile('proguard-android-optimize.txt'),

                // File with your custom rules.
                'proguard-rules.pro'
            )
           // ...
        }
    }
    // ...
}

Derleme dosyanız varsayılan olarak proguard-android-optimize.txt dosyasını da içerir. Bu dosya, çoğu Android projesi için gerekli olan kuralları içerir. Bu nedenle, derleme dosyasında kalmasına izin vermelisiniz. Bu dosya, proguard-common.txt dosyasına dayanır ve bu dosya ile içerik paylaşır.

Daha büyük uygulamalarda genellikle birden fazla kitaplık modülünde kod bulunur. Bu gibi durumlarda, saklama kurallarını genellikle belirli kitaplık modülünde uygulandıkları kodun yanına yerleştirmek daha iyidir. Kitaplıklar için saklama kurallarını korumadaki en önemli fark, bu kuralları kitaplık modülünüzün build.gradle.kts (veya build.gradle) dosyasında nasıl beyan ettiğinizdir. Daha fazla bilgi edinmek için Kütüphane yazarları için optimizasyon başlıklı makaleye bakın.

Saklama kuralı ekleme

Saklama kuralları eklerken genel seçenekleri dahil edebilir ve kendi saklama kurallarınızı tanımlayabilirsiniz.

  • Global seçenekler: Global seçenekler, R8'in kod tabanınızın tamamında nasıl çalışacağını etkileyen genel yönergelerdir. Daha fazla bilgi edinmek için Genel seçenekler başlıklı makaleyi inceleyin.
  • Koruma kuralları: Koruma kuralları, uygulamanızı yanlışlıkla bozmadan kod optimizasyonunu en üst düzeye çıkarma konusunda doğru dengeyi elde etmenizi sağlamak için dikkatli bir şekilde tasarlanmalıdır. Kendi koruma kurallarınızın söz dizimini öğrenmek için Koruma kuralları söz dizimi başlıklı makaleyi inceleyin.

Kitaplık yazarları için kuralları koruma

Saklama kurallarının genel seçenekleri ve söz dizimi hakkında bilgi edindikten sonra daha fazla ayrıntı için Kitaplık yazarları için optimizasyon başlıklı makaleyi inceleyin.