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 gibi 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ı gerektiren 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 birkaç yaygın durum aşağıda verilmiştir:

  • 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

Saklama kurallarınızın yapılandırması, kullandığınız AGP sürümüne bağlıdı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 bildirdiğinizdir. Daha fazla bilgi edinmek için Kütüphane yazarları için optimizasyon başlıklı makaleye bakın.

AGP 9.3 ve sonraki sürümler için

Kurallarınızı src/<variant>/keepRules dizininde .keep sonekini içeren bir dosyaya ekleyin. Örneğin, src/main/keepRules/custom-rules.keep. AGP 9.3 ve sonraki sürümler için güncellenen DSL'nin hem kod hem de kaynak optimizasyonunu etkinleştirdiğini ve varsayılan olarak dahil edildiği için açıkça çıkarılmadığı sürece varsayılan Android keep kuralları dosyasını (proguard-android-optimize.txt) açıkça tanımlamanızı gerektirmediğini unutmayın.

Kotlin

android {
    buildTypes {
        release {
            optimization {
                enable = true // Enables code and resource optimizations.
            }
        }
    }
}

Modern

android {
    buildTypes {
        release {
            optimization {
                enable = true // Enables code and resource optimizations.
            }
        }
    }
}

Varsayılan Android platformu saklama kurallarını atlama (Gelişmiş)

AGP, bir dizi varsayılan Android platform kuralı sağlar. Bu kuralları projenizin yapılandırmasından çıkarmak ve tüm saklama kurallarını kendiniz yönetmek için optimization.keepRules.includeDefault seçeneğini false olarak ayarlayın.

Kotlin

android {
    buildTypes {
        release {
            optimization {
                enable = true // Enables code and resource optimizations.
                keepRules {
                    includeDefault = false // The file with optimization
                    // rules for the Android platform is included by
                    // default. To omit this file, set this option to false.
                }
            }
        }
    }
}

Modern

android {
    buildTypes {
        release {
            optimization {
                enable = true // Enables code and resource optimizations.
                keepRules {
                    includeDefault = false // The file with optimization
                    // rules for the Android platform is included by
                    // default. To omit this file, set this option to false.
                }
            }
        }
    }
}

9.3'ten eski AGP sürümleri için eski DSL

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

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 dayanmaktadır ve bu dosya ile içerik paylaşmaktadır.

Eski DSL (Kotlin)

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

            proguardFiles(
                // Default file with default optimization rules.
                getDefaultProguardFile("proguard-android-optimize.txt"),
                ...
            )
        }
    }
}

Eski DSL (Groovy)

android {
    buildTypes {
        release {
            minifyEnabled = true
            shrinkResources = true

            // Default file with default optimization rules.
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt')
            ...
        }
    }
}

Saklama kuralı ekleme

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

  • Genel seçenekler: Genel seçenekler, R8'in tüm kod tabanınızda nasıl çalıştığı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. Koruma kurallarını nasıl yazacağınızı öğrenmek için Koruma kuralları ekleme başlıklı makaleyi inceleyin.

Kitaplık yazarları için kuralları koruma

Saklama kurallarıyla ilgili genel seçenekler 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.