Uygulama optimizasyonunu etkinleştirdiğinizde isShrinkResources = true
ayarı, optimize ediciye kullanılmayan kaynakları kaldırmasını talimatlandırır. Bu da uygulamanızın boyutunu küçültmenize yardımcı olur. Kaynak küçültme yalnızca kod küçültmeyle birlikte çalışır. Bu nedenle, kaynakları optimize ediyorsanız isMinifyEnabled = true
'ı da ayarlayın. Örneğin:
buildTypes {
release {
isMinifyEnabled = true
isShrinkResources = true
...
}
}
Belirli kaynakları saklamak veya silmek istiyorsanız proje kaynaklarınızda bir XML saklama dosyası oluşturun (ör. res/raw/my.package.keep.xml
). Keep dosyası aşağıdaki bileşenleri içerir:
<resources>
etiketi: Tüm alt kaynak öğelerini ve "keep"/"discard" özelliklerini içerir.tools:keep
özelliği: Saklanacak kaynakları tanımlayan, virgülle ayrılmış bir kaynak adı listesi kabul eder.tools:discard
özelliği: Atılacak kaynakları tanımlayan kaynak adlarının virgülle ayrılmış listesini kabul eder.
Aynı klasördeki birden fazla kaynağa referans vermek için yıldız karakterini joker karakter olarak kullanın. Örneğin:
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
tools:keep="@layout/l_used*_c,@layout/l_used_a,@layout/l_used_b*"
tools:discard="@layout/unused2" />
Hangi kaynakların atılacağı belirtilirken bunları silebilirsiniz. Ancak kaynak atma işlemi, derleme varyantları kullanılırken yararlı olabilir.
Belirli derleme varyantlarını hedefleme
Yalnızca bazı derleme varyantlarındaki kaynakları kaldırmak için tüm kaynaklarınızı ortak proje dizinine koyun, ardından varyantın kaynak dizininde her derleme varyantı için farklı bir my.package.build.variant.keep.xml
dosyası oluşturun. Keep dosyasında, belirli bir kaynak kodda kullanılıyor gibi göründüğünde (ve bu nedenle küçültücü tarafından kaldırılmadığında) ancak aslında belirli bir derleme varyantı için kullanılmayacağını bildiğiniz kaynakları manuel olarak belirtin.
Kullanılmayan alternatif kaynakları kaldırma
Optimizasyon aracı yalnızca uygulama kodunuz tarafından referans verilmeyen kaynakları kaldırır. Yani farklı cihaz yapılandırmaları için alternatif kaynakları kaldırmaz.
Uygulamanızın ihtiyaç duymadığı alternatif kaynak dosyalarını kaldırmak için uygulamanızın modül build.gradle
dosyasında Android Gradle resConfigs
mülkünü kullanın.
Örneğin, dil kaynakları içeren bir kitaplık (ör. Google Play Hizmetleri) kullanıyorsanız uygulamanızın geri kalanı aynı dillere çevrilmiş olsun veya olmasın, uygulamanız bu kitaplıklardaki mesajların tüm çevrilmiş dil dizelerini içerir. Yalnızca uygulamanızın resmi olarak desteklediği dilleri tutmak için resConfigs
mülkünü kullanarak bu dilleri belirtin.
Belirtilmeyen diller için tüm kaynaklar kaldırılır.
Aşağıdaki snippet'lerde, dil kaynaklarınızı yalnızca İngilizce ve Fransızca ile nasıl sınırlayacağınız gösterilmektedir:
android {
defaultConfig {
...
resourceConfigurations.addAll(listOf("en", "fr"))
}
}
veya
android {
defaultConfig {
...
resConfigs "en", "fr"
}
}
Android App Bundle (AAB) biçimini kullanarak bir uygulama yayınladığınızda, kullanıcı uygulamayı yüklediğinde varsayılan olarak yalnızca kullanıcının cihazında yapılandırılmış diller indirilir. Benzer şekilde, indirme işlemine yalnızca cihazın ekran yoğunluğuyla eşleşen kaynaklar ve cihazın ABI'siyle eşleşen yerel kitaplıklar dahil edilir. Daha fazla bilgi için Yapılandırma APK'sı türlerini yeniden etkinleştirme veya devre dışı bırakma başlıklı makaleyi inceleyin.
APK ile yayınlanan eski uygulamalarda (Ağustos 2021'den önce oluşturulan) farklı cihaz yapılandırmalarını hedefleyen birden fazla APK oluşturarak APK'nıza dahil edilecek ekran yoğunluğunu veya ABI kaynaklarını özelleştirebilirsiniz.
Kaynakları birleştirirken çakışmaları önleme
Android Gradle eklentisi (AGP), varsayılan olarak aynı ada sahip kaynakları (ör. farklı kaynak klasörlerinde bulunan aynı ada sahip çizilebilir öğeler) birleştirir.
Bu davranış, shrinkResources
mülkü tarafından kontrol edilmez ve birden fazla kaynakta kodunuzun referans verdiği bir ad olduğunda hataları önlemek için gerekli olduğundan devre dışı bırakılamaz.
Kaynak birleştirme yalnızca iki veya daha fazla dosya aynı kaynak adını, türünü ve tanımlayıcıyı paylaştığında gerçekleşir. AGP, kopyalar arasında en iyi seçenek olarak tanımladığı dosyayı seçer (aşağıda açıklanan öncelik sırasına göre) ve nihai derleme yapılarında dağıtılmak üzere yalnızca bu kaynağı AAPT'ye iletir.
AGP, aşağıdaki konumlarda yinelenen kaynaklar arar:
- Ana kaynak kümesiyle ilişkili ana kaynaklar, genellikle
src/main/res/
- Derleme türü ve derleme sürümlerinden varyant yer paylaşımları
- Kitaplık projesi bağımlılıkları
AGP, yinelenen kaynakları aşağıdaki basamaklı öncelik sırasına göre birleştirir:
Örneğin, hem ana kaynaklarınızda hem de bir derleme çeşidinde yinelenen bir kaynak görünürse Gradle, derleme çeşidindeki kaynağı seçer.
Aynı kaynak grubunda aynı kaynaklar görünüyorsa Gradle bunları birleştiremez ve kaynak birleştirme hatası verir. Bu durum, build.gradle
dosyanızın sourceSet
mülkünde birden fazla kaynak kümesi tanımlarsanız (ör. hem src/main/res/
hem de src/main/res2/
aynı kaynakları içeriyorsa) ortaya çıkabilir.
Kullanılmayan kaynakları kaldırmayla ilgili sorunları giderme
Kaynakları küçülttüğünüzde Derleme penceresinde, uygulamadan kaldırılan kaynakların özeti gösterilir. (Gradle'den ayrıntılı metin çıkışını görüntülemek için pencerenin sol tarafındaki Görünümü değiştir'i tıklayın.) Örnek:
:android:shrinkDebugResources
Removed unused resources: Resource data reduced from 2570KB to 1711KB: Removed 33%
:android:validateDebugSigning
Gradle ayrıca <module-name>/build/outputs/mapping/release/
(ProGuard'ın çıkış dosyalarıyla aynı klasör) içinde resources.txt
adlı bir teşhis dosyası oluşturur. Dosyada, hangi kaynakların diğer kaynaklara referans verdiği ve hangi kaynakların kullanıldığı ya da kaldırıldığı gibi ayrıntılar yer alır.
Örneğin, @drawable/ic_plus_anim_016
dosyasının neden hâlâ uygulamanızda olduğunu öğrenmek için resources.txt
dosyasını açıp dosya adını arayın. Başka bir kaynaktan referans aldığını görebilirsiniz:
16:25:48.005 [QUIET] [system.out] @drawable/add_schedule_fab_icon_anim : reachable=true
16:25:48.009 [QUIET] [system.out] @drawable/ic_plus_anim_016
Artık @drawable/add_schedule_fab_icon_anim
'ün neden erişilebilir olduğunu bilmeniz gerekiyor. Yukarı doğru arama yaparsanız kaynağı, resources.txt
'daki Erişilebilen kök kaynaklar: başlığı altında listelenir.
Bu, add_schedule_fab_icon_anim
için bir kod referansı olduğu anlamına gelir. Yani R.drawable
kimliği, erişilebilir kodda bulunmuştur.
Katı kontrol kullanmıyorsanız dinamik olarak yüklenen kaynakların kaynak adlarını oluşturmak için kullanılabilecek dize sabitleri varsa kaynak kimlikleri erişilebilir olarak işaretlenebilir. Bu durumda, derleme çıkışında kaynak adı için arama yaparsanız aşağıdaki gibi bir mesaj görebilirsiniz:
10:32:50.590 [QUIET] [system.out] Marking drawable:ic_plus_anim_016:2130837506
used because its format-string matches string pool constant ic_plus_anim_%1$d.
Bu dizelerden birini görürseniz ve dizenin, belirli bir kaynağı dinamik olarak yüklemek için kullanılmadığından eminseniz kaynak kaldırmak üzere derleme sistemini bilgilendirmek için keep dosyanızda tools:discard
özelliğini kullanın.