En iyi uygulamalardan yararlanma

Saklama kurallarıyla çalışırken, uygulamanızın davranışını korurken avantajlardan yararlanmak için doğru düzeyde ayrıntıya ulaşmak önemlidir. Saklama kurallarında iyi kalıplar ve kaçınılması gerekenler hakkında bilgi edinmek için aşağıdaki bölümleri inceleyin.

Saklama kurallarındaki iyi kalıplar

İyi tanımlanmış saklama kuralları mümkün olduğunca spesifiktir ve aşağıdaki kalıplara uyar:

  • Sınıf spesifikasyonu için aşağıdaki örneklerde gösterildiği gibi her zaman belirli bir sınıf, temel sınıf veya ek açıklamalı 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, daha kolay anlaşılır ve kod değişiklikleri sırasında bozulmaya daha az yatkın hale gelir.

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

    // 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österim 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 global 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ığı için 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 saklama kuralları olmadan R8 tarafından saklansa bile gerçek kuralların korunması çok önemlidir. Çünkü gelecekteki kod değişiklikleri, R8'in bu öğeleri artık saklamamasına neden olabilir.

    Kendi kodunuzda yansıtmak için Jetpack Keep'i kullanarak yönetimi daha kolay olan Keep kuralları oluşturabilirsiniz. Her ek açıklama, yansıtmayı gerçekleştiren kodda yer alır. Bu nedenle, kodu değiştirdiğinizde ek açıklamasını aynı yerde günceller veya kaldırırsınız. Böylece kurallar, uygulamanızın artık yansıtmadığı kodları korumaz. Hata analizi, ek açıklama içermeyen yansıtıcı çağrıları da işaretler.

  • Mümkün olduğunda -assumenosideeffects veya -convertchecknotnull kullanarak boş değer kontrollerini optimize edin. Bu, uygulamanızın DEX boyutunu önemli ölçüde azaltabilir. Daha fazla bilgi için Ek kural türleri başlıklı makaleyi inceleyin.

Bu yönergelere uyamıyorsanız saklanması gereken kodu geçici olarak ayrı bir pakete yerleştirebilir ve saklama kuralınızı bu 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 ve sürdürülebilir performans avantajları için aşağıdakileri kullanmamanızı öneririz:

  • -keep class com.example.pkg.** { *; } gibi paket genelinde geçerli olan saklama kurallarını uzun süreli kullanmayın. R8'i yapılandırırken sorunları geçici olarak çözmek için kullanılabilirler. Daha fazla bilgi için Optimizasyon kapsamını sınırlama bölümüne bakın. Genel olarak, joker karakterlere dikkat edin. Yalnızca ihtiyacınız olan kodu sakladığınızdan emin olun.
  • Mümkün olduğunda, kullandığınızda saklama kurallarını kopyalayıp yapıştırmanızı öneren kitaplıklardan (özellikle paket genelindeki saklama kuralları) kaçının. Android'de iyi performans gösterecek şekilde tasarlanan kitaplıklar, mümkün olduğunca yansımadan kaçınmalı ve gerekli durumlarda tüketici saklama kurallarını yerleştirmelidir.
  • Saklama kurallarında ters çevirme operatörünü ! kullanmaktan kaçının. Aksi takdirde, bir kuralı yanlışlıkla uygulamanızdaki neredeyse her sınıfa uygulayabilirsiniz.

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