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

Kullanıcılar genellikle fazla büyük görünen uygulamaları indirmekten kaçınır. Bu durum, özellikle cihazların kesintili 2G ve 3G ağlarına bağlandığı veya veri sınırları olan planlar üzerinden çalıştığı gelişmekte olan pazarlarda daha belirgindir. Bu sayfada, uygulamanızın indirme boyutunu küçültme hakkında bilgi verilmektedir. Bu sayede daha fazla kullanıcı uygulamanızı indirebilir.

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 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.

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

Google Play, uygulama paketleriyle yayınlanan uygulamalar için sıkıştırılmış indirme boyutu kısıtlaması olarak 200 MB'ı zorunlu kılar. 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 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 yapısını anlamanız faydalı 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.

APK'da aşağıdaki dizinler bulunur:

  • 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 AssetManager nesnesiyle alabilir.
  • res/: resources.arsc içinde derlenmemiş kaynaklar içeriyor.
  • lib/: Bir işlemcinin yazılım katmanına özgü derlenmiş kodu içerir. Bu dizinde her platform türü için bir alt dizin bulunur. Örneğin, armeabi, armeabi-v7a, arm64-v8a, x86, x86_64 ve mips.

APK'da aşağıdaki dosyalar da bulunur. Yalnızca AndroidManifest.xml zorunludur:

  • resources.arsc: Derlenmiş kaynaklar içerir. Bu dosya, res/values/ klasöründeki tüm yapılandırmaların XML içeriğini içerir. Paketleme aracı bu XML içeriğini ayıklar, ikili biçimde derler ve içeriği arşivler. Bu içerik; dil dizeleri ve stiller ile resources.arsc dosyasına doğrudan 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 dosyası biçiminde derlenen 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 referans verilen kitaplık dosyaları listelenir. Dosya, Android'in ikili XML biçimini kullanı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 kullandığı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 nesneleri 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 yollar ele alınmaktadır.

Kullanılmayan kaynakları kaldırma

Android Studio'ya dahil edilen statik kod analiz aracı lint, kodunuzun başvurmadığı res/ klasöründeki kaynakları algılar. lint aracı, projenizde kullanılmayan bir kaynak olabileceğini 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 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 özelliğini kullanmak için kod küçültmeyi etkinleştirin. R8, derleme işlemi sırasında önce kullanılmayan kodu kaldırır. Ardından, Android Gradle eklentisi kullanılmayan kaynakları kaldırır.

Kod ve kaynak küçültme ile Android Studio'nun APK boyutunu küçültmek için kullandığı diğer yöntemler hakkında daha fazla bilgi edinmek 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ı bildirebilirsiniz. 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ü artırmak için harici kitaplıklar kullanırsınız. Örneğin, eski cihazlarda kullanıcı deneyimini iyileştirmek için AndroidX'i referans alabilir veya uygulamanızdaki metinler için otomatik çevirileri almak üzere Google Play Hizmetleri'ni kullanabilirsiniz.

Bir kitaplık sunucu veya masaüstü için tasarlanmışsa uygulamanızın ihtiyaç duymadığı birçok nesne ve yöntem içerebilir. Kitaplığın yalnızca uygulamanızın ihtiyaç duyduğu kısımlarını dahil etmek için, lisans kitaplığı değiştirmenize izin veriyorsa 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 kareleri ve zamanlama verilerini kod çözmek için genişletildi.

ImageDecoder yerine üçüncü taraf kitaplıkları kullanarak APK boyutunu daha da küçültün ve güvenlik ile performansla ilgili gelecekteki güncellemelerden yararlanın.

ImageDecoder API hakkında daha fazla bilgi için API reference ve GitHub'daki örneğe 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ğunluk için ayrı ayrı dışa aktarmanız gerekmez.

Kullanıcılarınızın yalnızca küçük bir yüzdesinin belirli yoğunluklara sahip cihazları olduğunu biliyorsanız bu yoğunlukları uygulamanıza dahil etmeniz gerekip gerekmediğini değerlendirin. 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ş resimlere ihtiyaç varsa drawable-nodpi/ içinde tek bir resim varyantı bulundurarak daha da fazla alan tasarrufu sağlayabilirsiniz. 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. Çerçeve, resmi çalışma zamanında dinamik olarak çizebilir. Drawable nesne veya XML'de <shape>, APK'nızda çok az yer kaplayabilir. Ayrıca, XML Drawable nesneleri, Material Design kurallarına uygun tek renkli görüntüler oluşturur.

Kaynakları yeniden kullanma

Bir resmin varyasyonları için ayrı bir kaynak ekleyebilirsiniz. Örneğin, aynı resmin renkli, gölgeli veya döndürülmüş versiyonları. 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 sunar.

Ayrıca, yalnızca başka bir kaynağın döndürülmüş hali olan kaynakları da atlayabilirsiniz. Aşağıdaki kod snippet'inde, resmin ortasında döndürülerek ve 180 derece döndürülerek "beğenme"nin "beğenmeme"ye dönüştürülmesine dair bir örnek 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 prosedürel olarak oluşturarak da APK boyutunuzu küçültebilirsiniz. Prosedürel oluşturma, APK'nızda artık bir 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/ konumuna yerleştirilen resim kaynaklarını kayıpsız sıkıştırma ile optimize edebilir. Örneğin, aapt aracı, 256'dan fazla renk gerektirmeyen gerçek renkli bir PNG'yi renk paleti içeren 8 bitlik bir PNG'ye dönüştürebilir. Bu işlem, eşit kalitede ancak daha küçük bir bellek ayak izine sahip bir görüntüyle sonuçlanır.

aapt ile ilgili aşağıdaki sınırlamalar vardır:

  • aapt aracı, asset/ klasöründe bulunan PNG dosyalarını küçültmez.
  • aapt aracının resim dosyalarını optimize edebilmesi için 256 veya daha az renk kullanılması gerekir.
  • aapt aracı, halihazırda sıkıştırılmış olan PNG dosyalarının boyutunu artırabilir. Bunu önlemek için isCrunchPngs işaretini kullanarak PNG dosyaları için bu işlemi devre dışı bırakabilirsiniz:
  • 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 görüntü kalitesini kaybetmeden PNG dosya boyutlarını küçültebilirsiniz. Bu araçların tümü, algısal görüntü kalitesini korurken PNG dosya boyutunu küçültebilir.

pngcrush aracı özellikle etkilidir. Bu araç, PNG filtrelerini ve zlib (Deflate) parametrelerini yineler. Görüntüyü sıkıştırmak için filtrelerin ve parametrelerin her kombinasyonunu kullanır. Ardından, en küçük sıkıştırılmış çıktıyı veren 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ı kullanmak 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örel grafikleri kullanma

Çözünürlükten bağımsız simgeler ve diğer ölçeklenebilir medya öğeleri oluşturmak için vektör grafikler kullanabilirsiniz. Bu grafikleri kullanarak APK'nızın kapladığı alanı önemli ölçüde azaltabilirsiniz. Vektör resimler, Android'de VectorDrawable nesneleri olarak gösterilir. VectorDrawable nesnesiyle 100 baytlık bir dosya, ekran boyutunda net bir resim oluşturabilir.

Ancak sistemin her bir VectorDrawablenesneyi oluşturması çok daha uzun sürer ve daha büyük resimlerin ekranda görünmesi daha da uzun zaman alır. Bu nedenle, bu vektörel grafikleri yalnızca küçük resimleri görüntülerken kullanmayı düşünebilirsiniz.

VectorDrawable nesneleriyle çalışma hakkında daha fazla bilgi için Çizilebilir öğeler başlıklı makaleyi inceleyin.

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

Kare kare animasyonlar oluşturmak için AnimationDrawable kullanmayın. Bu işlem, animasyonun her karesi için ayrı bir bit eşlem dosyası eklemenizi gerektirir ve APK'nızın boyutunu önemli ölçüde artırır.

Bunun yerine, AnimatedVectorDrawableCompat kullanarak animasyonlu vektör çizimleri oluşturun.

Yerel ve Java kodunu azaltma

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

Gereksiz oluşturulmuş kodu kaldırma

Otomatik olarak oluşturulan kodların kapladığı alanı 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 veya üç katına çıkarabilir.

Numaralandırmalardan kaçının

Tek bir enum, uygulamanızın classes.dex dosyasına yaklaşık 1,0-1,4 KB ekleyebilir. Bu eklemeler, karmaşık sistemlerde veya paylaşılan kitaplıklarda hızla artabilir. Mümkünse numaralandırmaları kaldırıp tam sayılara dönüştürmek için @IntDef ek açıklamasını ve kod küçültmeyi kullanmayı düşünebilirsiniz. Bu tür dönüştürme, numaralandırmaların tür güvenliği avantajlarının tümünü korur.

Yerel ikili dosyaların boyutunu küçültme

Uygulamanızda yerel kod ve Android NDK kullanılıyorsa kodunuzu optimize ederek uygulamanızın yayın sürümünün boyutunu da küçültebilirsiniz. Hata ayıklama sembollerini kaldırma ve yerel kitaplıkları ayıklamama, bu konuda faydalı olabilecek iki tekniktir.

Hata ayıklama sembollerini kaldırma

Uygulamanız geliştirme aşamasındaysa ve hata ayıklama gerektiriyorsa hata simgelerini 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, yayın derlemenizi oluşturabilirsiniz.

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

Uygulamanızın yayın 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şareti devre dışı bırakmak, yükleme sırasında PackageManager uygulamasının .so dosyalarını APK'dan dosya sistemine kopyalamasını engeller. Bu yöntem, uygulamanızın güncellemelerini daha küçük hale getirir.

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ğu başına kaynaklar) içerebilir. Kullanıcılarınızın minimum indirme yapmasını sağlamak için uygulamanızı Android App Bundle 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şturup sunar. Böylece kullanıcılar, 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. Kullanıcılar ise daha küçük ve daha optimize edilmiş indirmeler elde eder.

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 bölebilirsiniz.

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

Daha fazla bilgi için Birden fazla APK oluşturma ve Birden fazla APK desteği başlıklı makaleleri inceleyin.