Kitaplıkları akıllıca seçin

Uygulama optimizasyonunu etkinleştirmek için Android optimizasyonuyla uyumlu kitaplıklar kullanmanız gerekir. Bir kitaplık Android optimizasyonu için yapılandırılmamışsa (ör. ilişkili tutma kurallarını gruplandırmadan yansıtma kullanıyorsa) Android uygulaması için uygun olmayabilir. Bu sayfada, bazı kitaplıkların uygulama optimizasyonu için neden daha uygun olduğu açıklanmakta ve seçim yapmanıza yardımcı olacak genel ipuçları verilmektedir.

Yansıtma yerine kod oluşturma tercihi

Genellikle, yansıma yerine kod oluşturma (codegen) kullanan kitaplıkları seçmeniz gerekir. Kod oluşturma sayesinde optimizatör, çalışma zamanında gerçekten hangi kodun kullanıldığını ve hangi kodun kaldırılabileceğini daha kolay belirleyebilir. Bir kitaplığın kod oluşturma mı yoksa yansıma mı kullandığını anlamak zor olabilir ancak bazı işaretler vardır. Yardım için ipuçlarını inceleyin.

Kod oluşturma ve yansıma hakkında daha fazla bilgi için Kitaplık yazarları için optimizasyon başlıklı makaleyi inceleyin.

Kitaplık seçerken genel ipuçları

Kitaplıklarınızın uygulama optimizasyonuyla uyumlu olmasını sağlamak için bu ipuçlarını kullanın.

Optimizasyon sorunlarını kontrol etme

Yeni bir kitaplık kullanmayı düşünüyorsanız kitaplığın sorun izleyicisine ve uygulama optimizasyonunu yapılandırma veya kod sıkıştırma ile ilgili olup olmadığını kontrol etmek için online tartışmalara göz atın. Öyleyse söz konusu kitaplığa alternatifler aramayı denemelisiniz. Aşağıdakileri göz önünde bulundurun:

  • AndroidX kitaplıkları ve Hilt gibi kitaplıklar, yansıma yerine kod oluşturma kullandığından uygulama optimizasyonuyla iyi çalışır. Yansıtma kullanırken yalnızca gereken kodu tutmak için minimum saklama kuralları sağlarlar.
  • Nesneleri örneklendirirken veya serileştirirken ortak metin kodundan kaçınmak için serileştirme kitaplıkları genellikle yansımayı kullanır. Yansıtma tabanlı yaklaşımlar (JSON için Gson gibi) yerine, bu sorunlardan kaçınmak için codegen kullanan kitaplıklar arayın. Örneğin, Kotlin Serialization'i kullanabilirsiniz.
  • Mümkünse paket genelindeki saklama kurallarını içeren kitaplıklardan kaçınılmalıdır. Paket genelindeki saklama kuralları, hataları çözmeye yardımcı olabilir ancak geniş saklama kuralları, sonunda yalnızca gerekli kodu saklayacak şekilde hassaslaştırılmalıdır. Daha fazla bilgi için Optimizasyonları aşamalı olarak kullanma başlıklı makaleyi inceleyin.

Yeni bir kitaplık ekledikten sonra optimizasyonu etkinleştirme

Yeni bir kitaplık eklediğinizde optimizasyonu etkinleştirin ve hata olup olmadığını kontrol edin. Hata varsa söz konusu kitaplığın alternatiflerini arayın veya tutma kuralları yazın. Bir kitaplık optimizasyonla uyumlu değilse ilgili kitaplıkla ilgili bir hata kaydı gönderin.

Kurallar eklemelidir

Saklama kurallarının eklemeli olduğunu unutmayın. Bu, bir kitaplık bağımlılığının içerdiği belirli kuralların kaldırılamayacağı ve uygulamanızın diğer bölümlerinin derlenmesini etkileyebileceği anlamına gelir. Örneğin, bir kitaplık kod optimizasyonlarını devre dışı bırakma kuralını içeriyorsa bu kural, projenizin tamamı için optimizasyonları devre dışı bırakır.

Yansıtma kullanılıp kullanılmadığını kontrol etme (gelişmiş)

Bir kitaplığın yansıma kullanıp kullanmadığını kodunu inceleyerek anlayabilirsiniz. Kitaplıkta yansıtma kullanılıyorsa ilişkili saklama kuralları sağladığını kontrol edin. Aşağıdakileri yapan bir kitaplık muhtemelen yansıma kullanıyordur:

  • kotlin.reflect veya java.lang.reflect paketlerindeki sınıfları ya da yöntemleri kullanır
  • Class.forName veya classLoader.getClass işlevleri kullanılır.
  • Ek açıklamaları çalışma zamanında okur. Örneğin, val value = myClass.getAnnotation() veya val value = myMethod.getAnnotation() kullanarak bir ek açıklama değeri depolar ve ardından value ile bir işlem yaparsa
  • Yöntem adlarını dize olarak kullanarak yöntemleri çağırır. Örneğin:

    // Calls the private `processData` API with reflection
    myObject.javaClass.getMethod("processData", DataType::class.java)
    ?.invoke(myObject, data)
    

Kötü saklama kurallarını filtreleme (gelişmiş)

Gerçekten kaldırılması gereken kodu saklayan keep kuralları içeren kitaplıklardan kaçınmalısınız. Ancak bunları kullanmanız gerekiyorsa kuralları aşağıdaki kodda gösterildiği gibi filtreleyebilirsiniz:

// If you're using AGP 8.4 and higher
buildTypes {
    release {
        optimization.keepRules {
          it.ignoreFrom("com.somelibrary:somelibrary")
        }
    }
}

// If you're using AGP 7.3-8.3
buildTypes {
    release {
        optimization.keepRules {
          it.ignoreExternalDependencies("com.somelibrary:somelibrary")
        }
    }
}

Örnek olay: Gson'un optimizasyonlarla ilgili sorunları

Gson, yansıtmayı yoğun bir şekilde kullandığı için genellikle uygulama optimizasyonuyla ilgili sorunlara neden olan bir serileştirme kitaplığıdır. Aşağıdaki kod snippet'inde, Gson'un genellikle nasıl kullanıldığı gösterilmektedir. Bu kullanım, çalışma zamanında kolayca kilitlenmelere neden olabilir. User nesnelerinin listesini almak için Gson'u kullandığınızda, kurucuyu çağırmadığınızı veya fromJson() işlevine bir fabrika iletmediğinizi unutmayın. Uygulama tanımlı sınıfları aşağıdakilerden biri olmadan oluşturmak veya kullanmak, bir kitaplığın açık uçlu yansıma kullanabileceğinin bir işaretidir:

  • Kitaplık, standart arayüz veya sınıf uygulayan uygulama sınıfı
  • KSP gibi kod oluşturma eklentisi
class User(val name: String)
class UserList(val users: List<User>)

// This code runs in debug mode, but crashes when optimizations are enabled
Gson().fromJson("""[{"name":"myname"}]""", User::class.java).toString()

R8 bu kodu analiz ettiğinde UserList veya User sınıfının hiçbir yerde oluşturulmadığını görürse alanları yeniden adlandırabilir ya da kullanılmadığı anlaşılan kurucuları kaldırabilir. Bu da uygulamanızın kilitlenmesine neden olabilir. Benzer şekillerde başka kitaplıklar kullanıyorsanız bunların uygulama optimizasyonunu etkilemeyeceğini kontrol etmeniz gerekir. Etkileyeceklerini düşünüyorsanız bu kitaplıkları kullanmaktan kaçının.

Hem Room hem de Hilt'in uygulama tanımlı türleri oluşturduğunu ancak yansıtma ihtiyacını önlemek için codegen'i kullandığını unutmayın.