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

Kullanıcılar, özellikle cihazların kesintili 2G ve 3G ağlarına bağlandığı veya veri sınırları olan planlar üzerinde çalıştığı gelişmekte olan pazarlarda, çok büyük görünen uygulamaları indirmekten genellikle kaçınır. Bu sayfada, daha fazla kullanıcının uygulamanızı indirmesini sağlamak için uygulamanızın indirme boyutunu nasıl küçülteceğiniz açıklanmaktadır.

Uygulamanızı Android App Bundle ile yükleme

Google Play'de yayınladığınızda uygulama boyutunu hemen kaydetmek için uygulamanızı Android App Bundle olarak yükleyin. Android App Bundle, uygulamanızın tüm derlenmiş kodunu ve kaynaklarını içeren ancak APK oluşturmayı ve Google Play'de imzalamayı erteleyen bir yükleme biçimidir.

Google Play'in uygulama sunma modeli, uygulama paketinizi kullanarak her kullanıcının cihaz yapılandırmasına göre optimize edilmiş APK'lar oluşturup sunar. Böylece, kullanıcılar yalnızca uygulamanızı çalıştırmak için ihtiyaç duydukları kodu ve kaynakları indirirler. Farklı cihazları desteklemek için birden fazla APK oluşturmanız, imzalamanız ve yönetmeniz gerekmez. Böylece kullanıcılar daha küçük ve daha optimize edilmiş indirmeler elde ederler.

Google Play, uygulama paketleriyle yayınlanan uygulamalar için en fazla 200 MB boyutunda sıkıştırılmış indirme boyutu kısıtlaması uyguladığından, uygulamanızın indirme boyutunu mümkün olduğunca küçültmek için bu sayfada açıklanan yönergeleri uygulamaya devam etmenizi öneririz.

APK yapısını anlama

Uygulamanızın boyutunu küçültmeden önce, uygulamanızın APK'sının yapısını anlamanız yararlı olur. 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.

Bir 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ı da içerir.
  • assets/: Uygulamanın AssetManager nesnesini kullanarak alabileceği öğeleri içerir.
  • res/: resources.arsc için derlenmemiş kaynaklar içerir.
  • lib/: Bir işlemcinin yazılım katmanına özel derlenmiş kodu içerir. Bu dizin her platform türü için (ör. armeabi, armeabi-v7a, arm64-v8a, x86, x86_64 ve mips) bir alt dizin içerir.

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

  • resources.arsc: Derlenmiş kaynakları içerir. Bu dosyada, res/values/ klasörünün tüm yapılandırmalarından gelen XML içeriği yer alır. Paketleme aracı bu XML içeriğini çıkarır, ikili biçimde derler ve içeriği arşivler. Bu içerik, dil dizeleri ve stillerinin yanı sıra düzen dosyaları ve resimler gibi doğrudan resources.arsc dosyasına dahil edilmeyen içeriğe giden yolları içerir.
  • classes.dex: Dalvik veya ART sanal makinesinin anladığı DEX dosyası biçiminde derlenmiş sınıfları içerir.
  • AndroidManifest.xml: Temel Android manifest dosyasını içerir. Bu dosyada uygulamanın adı, sürümü, erişim hakları ve başvurulan kitaplık dosyaları listelenir. Dosya, Android'in ikili XML biçimini kullanır.

Kaynak sayısını ve boyutunu azaltın

APK'nızın boyutu uygulamanızın yüklenme hızını, kullandığı bellek miktarını ve ne kadar 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 nesnelerini kullanabilirsiniz. Bu bölümde bu yöntemler ve APK'nızın genel boyutunu küçültmek için uygulamanızdaki kaynakları azaltabileceğiniz diğer yöntemler ele alınmaktadır.

Kullanılmayan kaynakları kaldırın

Android Studio'da bulunan statik bir kod analizcisi olan lint aracı, res/ klasörünüzdeki kodunuzun başvuruda bulunmadığı kaynakları algılar. lint aracı, projenizde kullanılmamış olabilecek bir kaynak tespit ettiğinde aşağıdaki örneğe benzer bir mesaj yazdırır:

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

Kodunuza eklediğiniz kitaplıklar, kullanılmayan kaynaklar içerebilir. Uygulamanızın build.gradle.kts dosyasında shrinkResources özelliğ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")
        }
    }
}

Modern

android {
    // Other settings.

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

shrinkResources kullanmak için kod daraltmayı etkinleştirin. Derleme işlemi sırasında R8 önce kullanılmayan kodu 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üçültme diğer yöntemleri hakkında daha fazla bilgi için Uygulamanızı küçültme, gizleme ve optimize etme konusuna bakın.

Android Gradle Plugin 7.0 ve sonraki sürümlerde, uygulamanızın desteklediği yapılandırmaları beyan edebilirsiniz. Gradle, resourceConfigurations ve defaultConfig seçeneğini kullanarak bu bilgileri derleme sistemine iletir. Daha sonra derleme sistemi, diğer desteklenmeyen yapılandırmalara ait 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 bölümüne bakın.

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

Bir Android uygulaması geliştirirken uygulamanızın kullanılabilirliğini ve çok yönlülüğünü iyileştirmek için genellikle harici kitaplıklardan yararlanırsınız. Örneğin, önceki cihazlardaki kullanıcı deneyimini iyileştirmek için AndroidX'e başvurabilir veya uygulamanızdaki metnin otomatik çevirilerini almak için Google Play Hizmetleri'ni kullanabilirsiniz.

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

Yerel animasyonlu resim kod çözme

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

APK boyutunu daha da küçültmek, güvenlik ve 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 örneğe bakın.

Yalnızca belirli yoğunlukları destekle

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

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

Android, önceki yoğunlukları desteklese de pikselleştirilmiş öğelerinizi her bir yoğunluğa dışa aktarmanıza gerek yoktur.

Kullanıcılarınızın yalnızca küçük bir bölümünün belirli yoğunluklara sahip cihazları olduğunu biliyorsanız bu yoğunlukları uygulamanızda paket haline getirmeniz 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ızda yalnızca ölçeklendirilmiş resimler gerekiyorsa drawable-nodpi/ ürününde bir resmin tek bir varyantını kullanarak daha da fazla alandan tasarruf edebilirsiniz. Uygulamanıza en az xxhdpi resim varyantı eklemenizi öneririz.

Ekran yoğunlukları hakkında daha fazla bilgi için Ekran boyutları ve yoğunlukları konusuna bakın.

Çekilebilir nesneler kullanma

Bazı görüntüler statik bir resim kaynağı gerektirmez. Çerçeve, resmi çalışma zamanında dinamik olarak çizebilir. Drawable nesneleri (veya XML'de <shape>) APK'nızda çok az yer kaplayabilir. Buna ek olarak, XML Drawable nesneleri, Materyal Tasarım yönergelerine uygun tek renkli görüntüler üretir.

Kaynakları yeniden kullanma

Bir resmin tonlanmış, gölgeli veya döndürülmüş versiyonları gibi bir resmin varyasyonları için ayrı bir kaynak ekleyebilirsiniz. Ancak, aynı kaynak grubunu yeniden kullanmanızı ve bunları çalışma zamanında gereken şekilde özelleştirmenizi öneririz.

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

Ayrıca, yalnızca başka bir kaynağın dönüşümlü eşdeğeri olan kaynakları çıkarabilirsiniz. Aşağıdaki kod snippet'i, bir "beğenme" hareketinin "beğenmeme" şeklinin "beğenmeme" şekline dönüştürülmesine dair bir örnek sunmaktadır.

<?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ştur

Ayrıca, resimlerinizi prosedürel olarak oluşturarak APK'nızın boyutunu azaltabilirsiniz. Prosedürel oluşturma, artık APK'nızda bir resim dosyası depolamadığınız için yer açar.

PNG dosyalarını aç

aapt aracı, derleme işlemi sırasında kayıpsız sıkıştırma ile res/drawable/ içine yerleştirilen resim kaynaklarını optimize edebilir. Örneğin, aapt aracı, 256'dan fazla renk gerektirmeyen gerçek renkli bir PNG dosyasını, renk paleti bulunan 8 bit PNG'ye dönüştürebilir. Bu işlem, eşit kalitede ancak daha az bellek kaplaması olan bir resimle sonuçlanır.

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

  • aapt aracı, asset/ klasöründe bulunan PNG dosyalarını küçültmez.
  • aapt aracının resim dosyalarını optimize edebilmesi için resim dosyalarının 256 veya daha az renk kullanması gerekir.
  • aapt aracı, sıkıştırılmış PNG dosyalarını şişirebilir. Bunu önlemek için isCrunchPngs işaretini kullanarak PNG dosyalarında bu işlemi devre dışı bırakabilirsiniz:
  • Kotlin

        buildTypes.all { isCrunchPngs = false }
        

    Modern

        buildTypes.all { isCrunchPngs = false }
        

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

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

pngcrush aracı özellikle etkilidir. Bu araç, resmi sıkıştırmak için her bir filtre ve parametre kombinasyonunu kullanarak PNG filtreleri ve zlib (Deflate) parametreleri üzerinde yinelenir. 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 kullanın

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

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

Vektörel grafikleri kullan

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

Ancak sistemin her bir VectorDrawable nesnesini işlemesi ç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 resimleri görüntülerken kullanmayı düşünün.

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

Animasyonlu resimler için vektör grafikleri kullanma

Animasyonların her bir karesi için ayrı bir bit eşlem dosyası eklemeniz gerektiğinden, kare kare animasyonlar oluşturmak için AnimationDrawable kullanmayın. Bu işlem APK'nızın boyutunu önemli ölçüde artırır.

Bunun yerine, animasyonlu vektörel çizimler oluşturmak için AnimatedVectorDrawableCompat kullanın.

Yerel ve Java kodunu azaltın

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

Oluşturulan gereksiz kodu kaldırın

Otomatik olarak oluşturulan tüm kodların kapladığı alanı anladığınızdan emin olun. Örneğin, birçok protokol arabelleği aracı, uygulamanızın boyutunu iki veya üç katına çıkarabilecek aşırı sayıda yöntem ve sınıf oluşturur.

Numaralandırmalardan kaçının

Tek bir numaralandırma, uygulamanızın classes.dex dosyasına yaklaşık 1,0 ila 1,4 KB ekleyebilir. Bu eklemeler, karmaşık sistemler veya paylaşılan kitaplıklar için hızla birikebilir. Mümkünse numaralandırmaları çıkarıp tam sayılara dönüştürmek için @IntDef ek açıklamasını ve kod küçültmeyi kullanmayı düşünün. Bu tür bir dönüştürme, enum'ların tüm güvenlik avantajlarını korur.

Yerel ikili programların boyutunu azaltma

Uygulamanız yerel kod ve Android NDK kullanıyorsa kodunuzu optimize ederek uygulamanızın yayınlanan sürümünün boyutunu da azaltabilirsiniz. Kullanışlı iki teknik, hata ayıklama simgelerini kaldırmak ve yerel kitaplıkları çıkarmamaktır.

Hata ayıklama sembollerini kaldır

Uygulamanız geliştirme aşamasında olmasına rağmen hata ayıklama gerektiriyorsa hata ayıklama sembollerini kullanmak mantıklıdır. Yerel kitaplıklardan gereksiz hata ayıklama sembollerini 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ı çıkarmaktan 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 APK'daki sıkıştırılmamış .so dosyalarını paketleyin. Bu işaretin devre dışı bırakılması, PackageManager uygulamasının yükleme sırasında .so dosyalarını APK'dan dosya sistemine kopyalamasını engeller. Bu yöntem, uygulamanızın güncellemelerini küçültür.

Birden fazla yalın APK'yı yönetme

APK'nız, ek dil veya ekran yoğunluğu kaynakları gibi kullanıcıların indirdiği ancak hiçbir zaman kullanmadığı içerikler barındırabilir. Kullanıcılarınızın indirme işlemlerinin minimum düzeyde olmasını sağlamak için Android App Bundle'ı kullanarak uygulamanızı Google Play'e yükleyin. Uygulama paketi yüklemek, Google Play'in her kullanıcının cihaz yapılandırmasına göre optimize edilmiş APK'lar oluşturup sunmasını sağlar. Böylece kullanıcılar yalnızca uygulamanızı çalıştırmak için gereken kod ve kaynakları indirir. Farklı cihazları desteklemek için birden fazla APK oluşturmanız, imzalamanız ve yönetmeniz gerekmez. Böylece kullanıcılar daha küçük boyutlu, daha optimize edilmiş indirmeler elde ederler.

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

Bir kullanıcı uygulamanızı indirdiğinde cihazı, kendi özelliklerine ve ayarlarına bağlı olarak doğru APK'yı alır. Böylece cihazlar, kendilerinde bulunmayan özelliklerin öğelerini almaz. Örneğin, bir kullanıcının hdpi cihazı varsa kullanıcı, daha yüksek yoğunluklu ekranlara sahip cihazlar için dahil edebileceğiniz xxxhdpi kaynaklarına ihtiyaç duymaz.

Daha fazla bilgi için Birden fazla APK oluşturma ve Birden fazla APK desteği konularına bakın.