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ı sağlamanı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ı olabildiğince spesifiktir ve aşağıdaki kalıplara uyar:

  • 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 kullanın ve ardından bu ek açıklamaları doğrudan saklama kurallarınızda hedefleyin. Bu sayede kodunuz ile onu koruyan kurallar arasında net ve açık bir bağlantı oluşturulur. Böylece yapılandırmanız daha sağlam, anlaşılması daha kolay ve kod değiştiğinde bozulmaya daha az eğilimli olur.

    Örneğin, aşağıdaki snippet, MyClass sınıfını ve @com.example.DisplayComponent ile açıklama eklenmiş diğer sınıfları nasıl koruyabileceğinizi gösterir:

    // In the source code
    @com.example.DisplayComponent
    class MyClass { /* ... */ }
    
    // In the keep rules
    -keep @com.example.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 sınıfın, uygulamanın çalışması için korunması gereken 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.

  • Yansıtma ile erişilen tüm öğeler için saklama kurallarını koruyun. Bu tür öğeler, açık tutma kuralları olmadan R8 tarafından tutulsa bile gelecekteki kod değişiklikleri R8'in bu öğeleri tutmamasına neden olabileceğinden gerçek kuralların korunması çok önemlidir.

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:

  • -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.
  • Mümkün olduğunda, özellikle paket genelinde olmak üzere, saklama kurallarını kopyalayıp yapıştırmanızı öneren kitaplıklardan kaçının. Android'de iyi performans gösterecek şekilde tasarlanan kitaplıklar, mümkün olduğunca yansıtmadan kaçınmalı ve gerekli olduğunda tüketici saklama kurallarını yerleştirmelidir.
  • 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.

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).