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ı uygulamalarına kolayca 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 sayesinde kod, çalışma zamanında analiz edilir ve değiştirilir. Kod, yürütülene kadar gerçekten tamamlanmadığından optimizasyon aracı, 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 ve kullanıcıların uygulamalarının kilitlenmesine neden olan kodu büyük olasılıkla kaldırır.

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ırlandırır 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, genellikle kitaplık derlemeyi 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.

Yine de 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ı sıkıştırıcıları destekleme (gelişmiş)

Kuralları, belirli sıkıştırıcılara (R8 veya ProGuard) ve belirli sıkıştırıcı sürümlerine göre uyarlayabilirsiniz. Bu sayede kitaplığınız, yeni sıkıştırıcı sürümlerini kullanan projelerde optimum şekilde çalışırken mevcut kuralların eski sıkıştırıcı sürümlerine sahip projelerde kullanılmaya devam etmesine olanak tanır.

Hedeflenen sıkıştırma kurallarını belirtmek için bunları aşağıda açıklandığı gibi bir AAR veya JAR kitaplığının belirli konumlarına eklemeniz gerekir.

In an AAR library:
    consumer-proguard-rules.pro (legacy location)
    classes.jar
    └── META-INF
        └── com.android.tools (targeted shrink rules location)
            ├── r8-from-<X>-upto-<Y>/<R8-rules-file>
            └── proguard-from-<X>-upto-<Y>/<ProGuard-rules-file>

In a JAR library:
    META-INF
    ├── proguard/<ProGuard-rules-file> (legacy location)
    └── com.android.tools (targeted shrink rules location)
        ├── r8-from-<X>-upto-<Y>/<R8-rules-file>
        └── proguard-from-<X>-upto-<Y>/<ProGuard-rules-file>

Yani hedeflenen sıkıştırma kuralları, JAR dosyasının META-INF/com.android.tools dizininde veya AAR dosyasının classes.jar içindeki META-INF/com.android.tools dizininde depolanır.

Bu dizinin altında, dizinlerdeki kuralların hangi sıkıştırıcının hangi sürümleri için yazıldığını belirtmek üzere r8-from-<X>-upto-<Y> veya proguard-from-<X>-upto-<Y> biçiminde adlara sahip birden fazla dizin 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 kesintisiz olması gerektiğini unutmayın.

Örneğin, r8-upto-8.0.0, r8-from-8.0.0-upto-8.2.0 ve r8-from-8.2.0 geçerli bir hedeflenen küçültme kuralı grubu oluşturur. 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ılır.

Android Gradle eklentisi, bu bilgiler doğrultusunda eşleşen R8 dizinlerindeki kuralları seçer. Bir kitaplıkta hedeflenen sıkıştırma kuralları belirtilmezse Android Gradle eklentisi, kuralları eski konumlardan (AAR için proguard.txt veya JAR için META-INF/proguard/<ProGuard-rules-file>) seçer.