Uygulamanızın boyutunu küçültün

Kullanıcılar, özellikle cihazların 2G ve 3G ağlarına zayıf bağlantılar kurduğu veya veri sınırı olan planlarda çalıştığı gelişmekte olan pazarlarda genellikle çok büyük görünen uygulamaları indirmekten kaçınırlar. Bu sayfada, uygulamanızın indirme boyutunu küçülterek daha fazla kullanıcının uygulamanızı indirmesini sağlama hakkında bilgi verilmektedir.

Uygulamanızı Android App Bundle ile yükleme

Google Play'de yayınlarken uygulama boyutunda hemen tasarruf etmek için uygulamanızı Android App Bundle olarak yükleyin. Android App Bundle, uygulamanızın derlenmiş kod ve kaynaklarının tamamını içeren ancak APK oluşturma ve imzalama işlemini Google Play'e bırakan bir yükleme biçimidir.

Ardından Google Play'in uygulama yayınlama modeli, uygulama paketinizi kullanarak her kullanıcının cihaz yapılandırması için optimize edilmiş APK'lar oluşturur ve sunar. Böylece kullanıcılar, uygulamanızı çalıştırmak için ihtiyaç duydukları kod ve kaynakları indirir. Farklı cihazları desteklemek için birden fazla APK oluşturmanız, imzalamanız ve yönetmeniz gerekmez. Kullanıcılar da daha küçük ve daha optimize edilmiş indirmeler elde eder.

Google Play, uygulama paketleriyle yayınlanan uygulamalar için 200 MB'lık sıkıştırılmış indirme boyutu kısıtlaması uygular. Play Özellik Dağıtımı ve Play Asset Delivery ile daha büyük boyutlar mümkündür ancak uygulamanızın boyutunu artırmak yükleme başarısını olumsuz yönde etkileyebilir ve kaldırma sayısını artırabilir. Bu nedenle, uygulamanızın indirme boyutunu mümkün olduğunca küçültmek için bu sayfada açıklanan yönergeleri uygulamanızı öneririz.

APK yapısını anlama

Uygulamanızın boyutunu küçültmeden önce uygulamanın APK'sının yapısını anlamanız faydalı olacaktır. APK dosyası, uygulamanızı oluşturan tüm dosyaları içeren bir ZIP arşivinden oluşur. Bu dosyalar arasında Java sınıf dosyaları, kaynak dosyaları ve derlenmiş kaynakları içeren bir dosya bulunur.

APK aşağıdaki dizinleri içerir:

  • META-INF/: CERT.SF ve CERT.RSA imza dosyalarının yanı sıra MANIFEST.MF manifest dosyasını içerir.
  • assets/: Uygulamanın öğelerini içerir. Uygulama, bu öğeleri bir AssetManager sınıfı nesnesi kullanarak alabilir.
  • res/: resources.arsc içine derlenmemiş kaynaklar içerir.
  • lib/: Bir işlemcinin yazılım katmanına özgü derlenmiş kodu içerir. Bu dizin, her platform türü için bir alt dizin içerir (ör. armeabi, armeabi-v7a, arm64-v8a, x86, x86_64 ve mips).

APK'lar aşağıdaki dosyaları da içerir. Yalnızca AndroidManifest.xml zorunludur:

  • resources.arsc: Derlenmiş kaynaklar içerir. Bu dosya, res/values/ klasörünün tüm yapılandırmalarındaki XML içeriğini içerir. Paketleme aracı bu XML içeriğini ayıklayıp ikili biçime derleyip arşivler. Bu içerik, dil dizeleri ve stillerin yanı sıra doğrudan resources.arsc dosyasına dahil edilmeyen içeriklerin yollarını (ör. düzen dosyaları ve resimler) içerir.
  • classes.dex: Dalvik veya ART sanal makinesi tarafından anlaşılan DEX dosya biçiminde derlenmiş sınıfları içerir.
  • AndroidManifest.xml: Temel Android manifest dosyasını içerir. Bu dosya, uygulamanın adını, sürümünü, erişim haklarını ve referans verilen kitaplık dosyalarını listeler. Dosyada Android'in ikili XML biçimi kullanılır.

Kaynak sayısını ve boyutunu azaltma

APK'nızın boyutu, uygulamanızın ne kadar hızlı yüklendiğini, ne kadar bellek ve güç tükettiğini etkiler. İçerdiği kaynakların sayısını ve boyutunu azaltarak APK'nızı küçültebilirsiniz. Özellikle, uygulamanızın artık kullanmadığı kaynakları kaldırabilir ve resim dosyaları yerine ölçeklenebilir Drawable nesneleri kullanabilirsiniz. Bu bölümde, APK'nızın genel boyutunu küçültmek için uygulamanızdaki kaynakları azaltabileceğiniz bu yöntemler ve diğer yöntemler ele alınmaktadır.

Kullanılmayan kaynakları kaldırma

Android Studio'ya dahil edilmiş statik kod analiz aracı olan lint aracı, res/ klasörünüzde kodunuzun referans vermediği kaynakları tespit eder. lint aracı, projenizde kullanılmayan bir kaynak keşfettiğinde aşağıdaki örnekteki gibi bir mesaj yazdırır:

res/layout/preferences.xml: Warning: The resource R.layout.preferences appears
    to be unused [UnusedResources]

Kodunuza eklediğiniz kitaplıklarda kullanılmayan kaynaklar bulunabilir. Uygulamanızın build.gradle.kts dosyasında shrinkResources seçeneğini etkinleştirirseniz Gradle, kaynakları sizin adınıza otomatik olarak kaldırabilir.

Kotlin

android {
    // Other settings.

    buildTypes {
        getByName("release") {
            minifyEnabled = true
            shrinkResources = true
            proguardFiles(getDefaultProguardFile('proguard-android.txt'), "proguard-rules.pro")
        }
    }
}

Groovy

android {
    // Other settings.

    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

shrinkResources kodunu kullanmak için kod küçültmeyi etkinleştirin. R8, derleme işlemi sırasında önce kullanılmayan kodları kaldırır. Ardından Android Gradle eklentisi, kullanılmayan kaynakları kaldırır.

Kod ve kaynak küçültme ve Android Studio'nun APK boyutunu küçültmenin diğer yolları hakkında daha fazla bilgi için Uygulamanızı küçültme, karartma ve optimize etme başlıklı makaleyi inceleyin.

Android Gradle Eklentisi 7.0 ve sonraki sürümlerde, uygulamanızın desteklediği yapılandırmaları belirtebilirsiniz. Gradle, bu bilgileri resourceConfigurations flavor ve defaultConfig seçeneğini kullanarak derleme sistemine iletir. Ardından derleme sistemi, desteklenmeyen diğer yapılandırmalardaki kaynakların APK'da görünmesini engelleyerek APK'nın boyutunu küçültür. Bu özellik hakkında daha fazla bilgi için Kullanılmayan alternatif kaynakları kaldırma başlıklı makaleyi inceleyin.

Kitaplıklardan kaynak kullanımını en aza indirme

Android uygulaması geliştirirken genellikle uygulamanızın kullanılabilirliğini ve çok yönlülüğünü iyileştirmek için harici kitaplıklar kullanırsınız. Örneğin, eski cihazlardaki kullanıcı deneyimini iyileştirmek için AndroidX'e referans verebilir veya uygulamanızdaki metinlerin otomatik çevirisini almak için Google Play Hizmetleri'ni kullanabilirsiniz.

Bir kitaplık, sunucu veya masaüstü için tasarlandıysa uygulamanızın ihtiyaç duymadığı birçok nesne ve yöntem içerebilir. Lisans, kitaplığı değiştirmenize izin veriyorsa kitaplığın yalnızca uygulamanızın ihtiyaç duyduğu bölümlerini dahil etmek için kitaplığın dosyalarını düzenleyebilirsiniz. Uygulamanıza belirli işlevler eklemek için mobil cihazlara uygun alternatif bir kitaplık da kullanabilirsiniz.

Yerel animasyonlu resim kod çözme

Android 12'de (API düzeyi 31), NDK ImageDecoder API'si, animasyonlu GIF ve animasyonlu WebP dosya biçimlerini kullanan resimlerdeki tüm karelerin ve zamanlama verilerinin kodunu çözecek şekilde genişletildi.

APK boyutunu daha da küçültmek ve güvenlik ile performansla ilgili gelecekteki güncellemelerden yararlanmak için üçüncü taraf kitaplıkları yerine ImageDecoder kullanın.

ImageDecoder API hakkında daha fazla bilgi için API reference ve GitHub'daki örnek sayfasına bakın.

Yalnızca belirli yoğunlukları destekleme

Android, aşağıdakiler gibi farklı ekran yoğunluklarını destekler:

  • ldpi
  • mdpi
  • tvdpi
  • hdpi
  • xhdpi
  • xxhdpi
  • xxxhdpi

Android, yukarıdaki yoğunlukları desteklese de rasterleştirilmiş öğelerinizi her yoğunluğa dışa aktarmanız gerekmez.

Kullanıcılarınızın yalnızca küçük bir yüzdesinin belirli yoğunluklara sahip cihazlara sahip olduğunu biliyorsanız bu yoğunlukları uygulamanıza eklemeniz gerekip gerekmediğini düşünün. Belirli bir ekran yoğunluğu için kaynak eklemezseniz Android, başlangıçta diğer ekran yoğunlukları için tasarlanmış mevcut kaynakları otomatik olarak ölçeklendirir.

Uygulamanız yalnızca ölçeklendirilmiş resimlere ihtiyaç duyuyorsa drawable-nodpi/ içinde bir resmin tek bir varyantını kullanarak daha da fazla yer kazanabilirsiniz. Uygulamanıza en az bir xxhdpi resim varyantı eklemenizi öneririz.

Ekran yoğunlukları hakkında daha fazla bilgi için Ekran boyutları ve yoğunlukları başlıklı makaleyi inceleyin.

Çizilebilir nesneleri kullanma

Bazı resimler için statik resim kaynağı gerekmez. Bunun yerine çerçeve, çalışma zamanında resmi dinamik olarak çizebilir. Drawable nesneleri (veya XML'de <shape>) APK'nızda çok az yer kaplar. Ayrıca XML Drawable nesneleri, Materyal Tasarım kurallarına uygun tek renkli resimler oluşturur.

Kaynakları yeniden kullanma

Bir resmin varyantları için ayrı bir kaynak ekleyebilirsiniz (ör. aynı resmin renkli, gölgeli veya döndürülmüş sürümleri). Ancak aynı kaynak grubunu yeniden kullanmanızı ve çalışma zamanında gerektiği gibi özelleştirmenizi öneririz.

Android, android:tint ve tintMode özelliklerini kullanarak bir öğenin rengini değiştirmek için çeşitli yardımcı programlar sağlar.

Yalnızca başka bir kaynağın döndürülmüş eşdeğeri olan kaynakları da atlayabilirsiniz. Aşağıdaki kod snippet'inde, resmin ortasından 180 derece döndürülerek "beğen"in "beğenme"ye dönüştürülmesi örneği verilmiştir:

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/ic_thumb_up"
    android:pivotX="50%"
    android:pivotY="50%"
    android:fromDegrees="180" />

Koddan oluşturma

Resimlerinizi işleme yöntemiyle oluşturarak APK boyutunuzu da küçültebilirsiniz. Prosedürel oluşturma, APK'nızda resim dosyası depolamadığınız için yer açar.

PNG dosyalarını sıkıştırma

aapt aracı, derleme işlemi sırasında res/drawable/ içine yerleştirilen resim kaynaklarını kayıpsız sıkıştırma ile optimize edebilir. Örneğin, aapt aracı 256'tan fazla renk gerektirmeyen gerçek renkli bir PNG'yi renk paleti içeren 8 bit PNG'ye dönüştürebilir. Bu işlem, eşit kalitede ancak daha küçük bellek kullanımı olan bir resim elde etmenizi sağlar.

aapt aşağıdaki sınırlamalara sahiptir:

  • aapt aracı, asset/ klasöründeki PNG dosyalarını küçültmüyor.
  • aapt aracının resim dosyalarını optimize edebilmesi için resim dosyalarında 256 veya daha az renk kullanılmalıdır.
  • aapt aracı, zaten sıkıştırılmış PNG dosyalarını şişirebilir. Bunu önlemek için PNG dosyalarında bu işlemi devre dışı bırakmak üzere isCrunchPngs işaretini kullanabilirsiniz:
  • Kotlin

        buildTypes.all { isCrunchPngs = false }
        

    Groovy

        buildTypes.all { isCrunchPngs = false }
        

PNG ve JPEG dosyalarını sıkıştırma

pngcrush, pngquant veya zopflipng gibi araçları kullanarak resim kalitesini kaybetmeden PNG dosya boyutlarını küçültebilirsiniz. Bu araçların tümü, algılanan resim kalitesini korurken PNG dosya boyutunu küçültebilir.

pngcrush aracı özellikle etkilidir. Bu araç, PNG filtreleri ve zlib (Deflate) parametreleri üzerinde iterasyon yaparak resmi sıkıştırmak için her filtre ve parametre kombinasyonunu kullanır. Ardından, en küçük sıkıştırılmış çıkışı sağlayan yapılandırmayı seçer.

JPEG dosyalarını sıkıştırmak için packJPG ve guetzli gibi araçları kullanabilirsiniz.

WebP dosya biçimini kullanma

PNG veya JPEG dosyaları yerine resimleriniz için WebP dosya biçimini de kullanabilirsiniz. WebP biçimi, JPG ve PNG gibi kayıplı sıkıştırma ve şeffaflık sağlar. Ayrıca JPEG veya PNG'den daha iyi sıkıştırma sağlayabilir.

Android Studio'yu kullanarak mevcut BMP, JPG, PNG veya statik GIF resimlerini WebP biçimine dönüştürebilirsiniz. Daha fazla bilgi için WebP resimleri oluşturma başlıklı makaleyi inceleyin.

Vektör grafikleri kullanın

Çözünürlükten bağımsız simgeler ve ölçeklenebilir diğer medya öğeleri oluşturmak için vektör grafikleri kullanabilirsiniz. APK'nızın boyutunu önemli ölçüde azaltmak için bu grafikleri kullanabilirsiniz. Vektör resimler Android'de VectorDrawable nesneleri olarak temsil edilir. 100 baytlık bir dosya, VectorDrawable nesnesi kullanılarak ekran boyutunda keskin bir resim oluşturabilir.

Ancak sistemin her VectorDrawable nesneyi oluşturması çok daha uzun sürer ve daha büyük resimlerin ekranda görünmesi daha da uzun sürer. Bu nedenle, bu vektör grafiklerini yalnızca küçük resimler gösterirken kullanmayı düşünün.

VectorDrawable nesneleriyle çalışma hakkında daha fazla bilgi için Çizilebilirler bölümüne bakın.

Animasyonlu resimler için vektör grafikleri kullanın

Kare kare animasyon oluşturmak için AnimationDrawable kullanmayın. Çünkü bu, animasyondaki her kare için ayrı bir bitmap dosyası eklemenizi gerektirir ve APK'nızın boyutunu önemli ölçüde artırır.

Bunun yerine, animasyonlu vektör çizilebilir öğeler oluşturmak için AnimatedVectorDrawableCompat kullanın.

Yerel ve Java kodunu azaltma

Uygulamanızdaki Java ve yerel kod tabanının boyutunu azaltmak için aşağıdaki yöntemleri kullanabilirsiniz.

Gereksiz olarak oluşturulan kodu kaldırma

Otomatik olarak oluşturulan kodların ayak izini anladığınızdan emin olun. Örneğin, birçok protokol arabelleği aracı çok fazla sayıda yöntem ve sınıf oluşturur. Bu da uygulamanızın boyutunu iki katına veya üç katına çıkarabilir.

Listelemelerden kaçının

Tek bir enum, uygulamanızın classes.dex dosyasına yaklaşık 1,0 ila 1,4 KB eklenebilir. Bu eklemeler, karmaşık sistemler veya paylaşılan kitaplıklarda hızla birikebilir. Mümkünse @IntDef ek açıklamalarını ve kod küçültme özelliğini kullanarak listeleri çıkarıp tam sayılara dönüştürebilirsiniz. Bu tür dönüştürme, enum'ların tüm tür güvenliği avantajlarını korur.

Yerel ikili dosyaların boyutunu azaltma

Uygulamanız yerel kod ve Android NDK kullanıyorsa kodunuzu optimize ederek uygulamanızın sürüm sürümünün boyutunu da azaltabilirsiniz. Hata ayıklama sembollerini kaldırmak ve yerel kitaplıkları ayıklamak iki yararlı tekniktir.

Hata ayıklama sembollerini kaldırma

Uygulamanız geliştirme aşamasındaysa ve hâlâ hata ayıklama gerektiriyorsa hata ayıklama simgelerini kullanmak mantıklı bir seçimdir. Yerel kitaplıklardan gereksiz hata ayıklama simgelerini kaldırmak için Android NDK'da sağlanan arm-eabi-strip aracını kullanın. Ardından, sürüm derlemenizi derleyebilirsiniz.

Yerel kitaplıkları ayıklamaktan kaçının

Uygulamanızın sürüm sürümünü oluştururken, uygulamanızın build.gradle.kts dosyasında useLegacyPackaging değerini false olarak ayarlayarak sıkıştırılmamış .so dosyalarını APK'ya paketleyin. Bu işaret devre dışı bırakıldığında PackageManager, yükleme sırasında .so dosyalarını APK'dan dosya sistemine kopyalayamaz. Bu yöntem, uygulamanızın güncellemelerinin daha küçük olmasını sağlar.

Birden fazla yalın APK'yı koruma

APK'nız, kullanıcıların indirdiği ancak hiç kullanmadığı içerikler (ör. ek dil veya ekran yoğunluğuna göre kaynaklar) içerebilir. Kullanıcılarınıza en az indirme deneyimi sunmak için uygulamanızı Android App Bundle'leri kullanarak Google Play'e yükleyin. Uygulama paketlerini yüklediğinizde Google Play, her kullanıcının cihaz yapılandırması için optimize edilmiş APK'lar oluşturur ve sunar. Böylece kullanıcılar, uygulamanızı çalıştırmak için ihtiyaç duydukları kod ve kaynakları indirir. Farklı cihazları desteklemek için birden fazla APK oluşturmanız, imzalamanız ve yönetmeniz gerekmez. Ayrıca kullanıcılar daha küçük ve daha optimize edilmiş indirme işlemleri gerçekleştirir.

Uygulamanızı Google Play'de yayınlamıyorsanız uygulamanızı ekran boyutu veya GPU doku desteği gibi faktörlere göre farklılaştırılmış birkaç APK'ya segmentlere ayırabilirsiniz.

Bir kullanıcı uygulamanızı indirdiğinde, cihazı, cihazın özelliklerine ve ayarlarına göre doğru APK'yı alır. Bu sayede cihazlar, sahip olmadıkları özelliklerle ilgili öğeler almaz. Örneğin, bir kullanıcının hdpi cihazı varsa daha yüksek yoğunluklu ekranlara sahip cihazlar için dahil edebileceğiniz xxxhdpi kaynaklarına ihtiyacı yoktur.

Daha fazla bilgi için Birden fazla APK oluşturma ve Birden fazla APK desteği başlıklı makalelere göz atın.