Kitaplık yazarları için optimizasyon

Kitaplık yazarı olarak, uygulama geliştiricilerin son kullanıcılara yüksek kaliteli bir deneyim sunarken kitaplığınızı kolayca uygulamalarına entegre edebildiğinden emin olmanız gerekir. Kitaplığınızın ek kurulum olmadan Android optimizasyonuyla uyumlu olduğundan emin olmanız veya kitaplığın Android'de kullanıma uygun olmayabileceğini belgelemeniz gerekir.

Bu dokümanlar, yayınlanmış kitaplıkların geliştiricilerini hedef almakla birlikte büyük, modüler bir uygulamadaki dahili kitaplık modüllerinin geliştiricileri için de yararlı olabilir.

Uygulama geliştiriciyseniz ve Android uygulamanızı optimize etme hakkında bilgi edinmek istiyorsanız Uygulama optimizasyonunu etkinleştirme başlıklı makaleyi inceleyin. Hangi kitaplıkların kullanılmasının uygun olduğu hakkında bilgi edinmek için Kitaplıkları akıllıca seçin başlıklı makaleyi inceleyin.

Yansıtma yerine codegen kullanın

Mümkün olduğunda, yansıma yerine kod oluşturma (codegen) özelliğini kullanın. Kod oluşturma ve yansıma, programlama sırasında şablon koddan kaçınmak için kullanılan yaygın yaklaşımlardır ancak kod oluşturma, R8 gibi bir uygulama optimizasyon aracıyla daha uyumludur:

  • Kod oluşturma işleminde kod, derleme işlemi sırasında analiz edilir ve değiştirilir. Derleme zamanından sonra önemli bir değişiklik yapılmadığından, optimizatör nihai olarak hangi koda ihtiyaç duyulduğunu ve hangilerinin güvenli bir şekilde kaldırılabileceğini bilir.
  • Yansıtma ile kod, çalışma zamanında analiz edilir ve değiştirilir. Kod, yürütülene kadar gerçekten tamamlanmadığından optimizatör, hangi kodun güvenli bir şekilde kaldırılabileceğini bilemez. Bu işlem, çalışma zamanında yansıma yoluyla dinamik olarak kullanılan kodu kaldırır ve kullanıcılar için uygulama kilitlenmelerine neden olur.

Birçok modern kütüphane, yansıma yerine codegen kullanır. Room, Dagger2 ve diğer birçok platform tarafından kullanılan ortak bir giriş noktası için KSP'ye bakın.

Yansımanın kabul edildiği durumlar

Yansıma kullanmanız gerekiyorsa yalnızca aşağıdakilerden birine yansıtmanız gerekir:

  • Belirli hedeflenen türler (belirli arayüz uygulayıcılar veya alt sınıflar)
  • Belirli bir çalışma zamanı ek açıklamasını kullanan kod

Yansıtmayı bu şekilde kullanmak, çalışma zamanı maliyetini sınırlar ve hedeflenen tüketici tutma kuralları yazmanızı sağlar.

Bu belirli ve hedeflenmiş yansıtma biçimi, hem Android çerçevesinde (ör. etkinlikleri, görünümleri ve çizilebilir öğeleri şişirirken) hem de AndroidX kitaplıklarında (ör. WorkManager ListenableWorker'ları veya RoomDatabase'leri oluştururken) görebileceğiniz bir kalıptır. Buna karşılık, Gson'un açık uçlu yansıması Android uygulamalarında kullanıma uygun değildir.

Tüketici tutma kuralları yazma

Kitaplıklar, uygulama saklama kurallarıyla aynı biçimi kullanan "tüketici" saklama kurallarını paketlemelidir. Bu kurallar, kitaplık yapılarına (AAR'lar veya JAR'lar) gruplandırılır ve kitaplık kullanıldığında Android uygulaması optimizasyonu sırasında otomatik olarak tüketilir.

AAR kitaplıkları

Bir AAR kitaplığı için tüketici kuralları eklemek üzere Android kitaplık modülünün derleme komut dosyasında consumerProguardFiles seçeneğini kullanın. Daha fazla bilgi için kitaplık modülü oluşturmayla ilgili yönergelerimize göz atın.

Kotlin

android {
    defaultConfig {
        consumerProguardFiles("consumer-proguard-rules.pro")
    }
    ...
}

Groovy

android {
    defaultConfig {
        consumerProguardFiles 'consumer-proguard-rules.pro'
    }
    ...
}

JAR kitaplıkları

Kuralları, JAR olarak dağıtılan Kotlin/Java kitaplığınızla birlikte paketlemek için kural dosyanızı herhangi bir dosya adıyla nihai JAR'ın META-INF/proguard/ dizinine yerleştirin. Örneğin, kodunuz <libraryroot>/src/main/kotlin içindeyse <libraryroot>/src/main/resources/META-INF/proguard/consumer-proguard-rules.pro içine bir tüketici kuralları dosyası koyun. Böylece kurallar, çıkış JAR'ınızda doğru konumda paketlenir.

Kuralların META-INF/proguard dizininde olup olmadığını kontrol ederek nihai JAR'ın kuralları doğru şekilde paketlediğini doğrulayın.

AAR kitaplığı derlemesini optimize etme (gelişmiş)

Kitaplık derleme sırasında yapılabilecek optimizasyonlar çok sınırlı olduğundan, kitaplık derlemeyi genellikle doğrudan optimize etmemelisiniz. R8, yalnızca bir kitaplık uygulamanın bir parçası olarak dahil edildiğinde, kitaplığın tüm yöntemlerinin nasıl kullanıldığını ve hangi parametrelerin iletildiğini bilebilir. Kitaplık geliştiricisi olarak, kitaplığı optimize etmeden önce optimizasyonun birden fazla aşamasını değerlendirmeniz ve hem kitaplık hem de uygulama oluşturma zamanında davranışı korumanız gerekir.

Kitaplığınızı derleme sırasında optimize etmek istiyorsanız bu işlem Android Gradle Eklentisi tarafından desteklenir.

Kotlin

android {
    buildTypes {
        release {
            isMinifyEnabled = true
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
        }
        configureEach {
            consumerProguardFiles("consumer-rules.pro")
        }
    }
}

Groovy

android {
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles
                getDefaultProguardFile('proguard-android-optimize.txt'),
                'proguard-rules.pro'
        }
        configureEach {
            consumerProguardFiles "consumer-rules.pro"
        }
    }
}

proguardFiles'ün davranışının consumerProguardFiles'ten çok farklı olduğunu unutmayın:

  • proguardFiles, kitaplık oluşturma sırasında kitaplığınızın hangi bölümünün tutulacağını tanımlamak için genellikle getDefaultProguardFile("proguard-android-optimize.txt") ile birlikte derleme zamanında kullanılır. Bu, en azından herkese açık API'nizdir.
  • consumerProguardFiles ise kitaplığınıza dahil edilir ve daha sonra kitaplığınızı kullanan bir uygulamanın derlenmesi sırasında hangi optimizasyonların yapılacağını etkiler.

Örneğin, kitaplığınız dahili sınıflar oluşturmak için yansıma kullanıyorsa tutma kurallarını hem proguardFiles hem de consumerProguardFiles içinde tanımlamanız gerekebilir.

Kitaplığınızın derlemesinde -repackageclasses kullanıyorsanız sınıfları kitaplığınızın paketinin içinde bir alt pakete yeniden paketleyin. Örneğin, -repackageclasses 'internal' yerine -repackageclasses 'com.example.mylibrary.internal' kullanın.

Farklı R8 sürümlerini destekleme (gelişmiş)

Kuralları, R8'in belirli sürümlerini hedefleyecek şekilde uyarlayabilirsiniz. Bu sayede kitaplığınız, daha yeni R8 sürümlerini kullanan projelerde optimum şekilde çalışırken mevcut kuralların eski R8 sürümlerine sahip projelerde kullanılmaya devam etmesine olanak tanır.

Hedeflenen R8 kurallarını belirtmek için bunları bir AAR'ın classes.jar içindeki META-INF/com.android.tools dizinine veya JAR'ın META-INF/com.android.tools dizinine eklemeniz gerekir.

In an AAR library:
    proguard.txt (legacy location, the file name must be "proguard.txt")
    classes.jar
    └── META-INF
        └── com.android.tools (location of targeted R8 rules)
            ├── r8-from-<X>-upto-<Y>/<R8-rule-files>
            └── ... (more directories with the same name format)

In a JAR library:
    META-INF
    ├── proguard/<ProGuard-rule-files> (legacy location)
    └── com.android.tools (location of targeted R8 rules)
        ├── r8-from-<X>-upto-<Y>/<R8-rule-files>
        └── ... (more directories with the same name format)

META-INF/com.android.tools dizininde, kuralların hangi R8 sürümleri için yazıldığını belirten r8-from-<X>-upto-<Y> biçiminde adlara sahip birden fazla alt dizin olabilir. Her alt dizinde, R8 kurallarını içeren bir veya daha fazla dosya (herhangi bir dosya adı ve uzantısı ile) bulunabilir.

-from-<X> ve -upto-<Y> bölümlerinin isteğe bağlı olduğunu, <Y> sürümünün özel olduğunu ve sürüm aralıklarının genellikle kesintisiz olduğunu ancak örtüşebileceğini unutmayın.

Örneğin, r8, r8-upto-8.0.0, r8-from-8.0.0-upto-8.2.0 ve r8-from-8.2.0, hedeflenen bir R8 kuralları grubunu temsil eden dizin adlarıdır. r8 dizinindeki kurallar tüm R8 sürümleri tarafından kullanılabilir. r8-from-8.0.0-upto-8.2.0 dizinindeki kurallar, R8 tarafından 8.0.0 sürümünden 8.2.0 sürümüne kadar ancak 8.2.0 sürümünü dahil etmeden kullanılabilir.

Android Gradle eklentisi, mevcut R8 sürümü tarafından kullanılabilecek tüm kuralları seçmek için bu bilgileri kullanır. Bir kitaplıkta hedeflenen R8 kuralları belirtilmezse Android Gradle eklentisi, kuralları eski konumlardan (AAR için proguard.txt veya JAR için META-INF/proguard/<ProGuard-rule-files>) seçer.