En iyi uygulamalardan yararlanma

Saklama kurallarıyla çalışırken, uygulamanızın davranışını korurken avantajlardan yararlanabilmek için doğru düzeyde ayrıntıya ulaşmanız önemlidir. İyi kalıplar ve saklama kurallarında kaçınılması gerekenler hakkında bilgi edinmek için aşağıdaki bölümlere bakın.

Saklama kurallarındaki iyi kalıplar

İyi tanımlanmış saklama kuralları mümkün olduğunca ayrıntılıdır:

  • Sınıf belirtimi için aşağıdaki örneklerde gösterildiği gibi mümkünse her zaman belirli bir sınıf, temel sınıf veya açıklama eklenmiş sınıf belirtin:

    -keepclassmembers class com.example.MyClass {
      void someSpecificMethod();
    }
    
    -keepclassmembers ** extends com.example.MyBaseClass {
      void someSpecificMethod();
    }
    
    -keepclassmembers @com.example.MyAnnotation class ** {
      void someSpecificMethod();
    }
    
  • Mümkün olduğunda kaynak kodunuzda ek açıklamalar (ör. @Keep ek açıklaması) kullanın ve ardından saklama kurallarınızda bu ek açıklamaları doğrudan hedefleyin. Bu, kodunuz ile onu koruyan kurallar arasında net ve açık bir bağlantı oluşturarak yapılandırmanızı daha sağlam, anlaşılması daha kolay ve kod değiştiğinde bozulmaya daha az eğilimli hale getirir.

    Örneğin, androidx.annotation gibi kitaplıklar bu kalıbı kullanır:

    // In your source code
    @Keep
    class MyDataClass { /* ... */ }
    
    // In your R8 rules
    -keep @androidx.annotation.DisplayComponent class * {*;}
    

    Açıklamalarınızı, kod bölümlerinin neden korunduğuyla ilgili anlamlı bağlam sağlayacak şekilde adlandırmanızı öneririz. Örneğin, görüntü bileşenlerinin bazı bölümlerinin korunması gereken bir uygulama için @DisplayComponent simgesini kullanın.

  • Mümkün olduğunda üye spesifikasyonu beyan edilmeli ve yalnızca uygulamanın çalışması için korunması gereken sınıf bölümlerine referans verilmelidir. Kesinlikle gerekli olmadığı sürece, isteğe bağlı üye kapsamını { *; } olarak tanımlayarak bir kuralı sınıfın tamamına uygulamamanız önerilir.

    -keepclassmembers com.example.MyClass {
      void someSpecificMethod();
      void @com.example.MyAnnotation *;
    }
    
  • repackageclasses genel seçeneğini kullanıyorsanız isteğe bağlı paket adını belirtmeyin. Bu, yeniden paketlenen sınıf adlarında paket öneki atlandığından daha küçük DEX dosyalarıyla sonuçlanır.

Bu kurallara uyamıyorsanız korunması gereken kodu geçici olarak özel bir pakette izole edebilir ve koruma kuralınızı pakete uygulayabilirsiniz. Ancak bu, uzun vadeli bir çözüm değildir. Daha fazla bilgi edinmek için Optimizasyonları kademeli olarak uygulama başlıklı makaleyi inceleyin. Bir paket için saklama kuralı kullanmak istiyorsanız aşağıdaki örnekte gösterildiği gibi bir saklama kuralı tanımlayın:

-keepclassmembers class com.example.pkg.** { *; }

Yapılmaması gerekenler

Saklama kuralı söz diziminde birçok seçenek vardır ancak ölçülebilir sürdürülebilir performans avantajları için aşağıdakileri kullanmamanızı öneririz:

  • Tutma kurallarında ters çevirme operatörünü ! kullanmaktan kaçının. Aksi takdirde, uygulamanızdaki neredeyse her sınıfa istemeden bir kural uygulayabilirsiniz.
  • -keep class com.example.pkg.** { *; } uzun vadeli gibi paket genelinde saklama kuralları kullanmayın. R8 yapılandırılırken sorunları geçici olarak çözmek için kullanılabilir. Daha fazla bilgi için Optimizasyon kapsamını sınırlama başlıklı makaleyi inceleyin. Genel olarak, joker karakterleri kullanırken dikkatli olun. Yalnızca ihtiyacınız olan kodu kullandığınızdan emin olun.

Bu kurallara uyamıyorsanız çok fazla açık uçlu yansıtma kullanıyor olabilirsiniz. Bu durumda, yansıtmadan veya yansıtma kullanan kitaplıktan kaçınmanız gerekir (Gson örnek olay incelemesine bakın).