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

Kullanıcılar genellikle çok büyük görünen uygulamaları indirmekten kaçınır. Özellikle de cihazların düzensiz 2G ve 3G ağlarına bağlandığı veya veri sınırı olan planlar üzerinde çalıştığı gelişmekte olan pazarlarda, bu tür uygulamaları indirmekten kaçınırsınız. Bu sayfada, daha fazla kullanıcının uygulamanızı indirebilmesi 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ş kodlarını ve kaynaklarını içeren ancak APK oluşturmayı ve Google Play'de oturum açmayı erteleyen bir yükleme biçimidir.

Google Play'in uygulama sunma modeli daha sonra uygulama paketinizi kullanarak her kullanıcının cihaz yapılandırmasına göre optimize edilmiş APK'lar oluşturur ve sunar. Böylece kullanıcılar yalnızca 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ış bir indirme boyutu kısıtlaması uygular. Play Feature Delivery ve Play Asset Delivery kullanıldığında daha büyük boyutlar kullanılabilir ancak uygulamanızın boyutunu büyütmek, 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 kuralları uygulamanızı öneririz.

APK yapısını anlama

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

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

Bir APK 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 barındırı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, doğrudan resources.arsc dosyasına dahil edilmeyen içerik yolları (ö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 azaltın

APK'nızın boyutu, uygulamanızın ne kadar hızlı yüklendiğini, kullandığı bellek miktarını ve ne kadar güç tükettiğini etkiler. APK'nızın iç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 görüntü 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ı azaltmanın diğer yolları açıklanmaktadır.

Kullanılmayan kaynakları kaldırın

Android Studio'da bulunan statik bir kod analiz aracı olan lint aracı, res/ klasörünüzdeki kodunuzun başvuruda bulunmadığı kaynakları algılar. lint aracı, projenizde kullanılmayan bir kaynak bulduğunda aşağıdaki örnektekine 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 sizin adınıza kaynakları otomatik olarak kaldırabilir.

Kotlin

android {
    // Other settings.

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

Eski

android {
    // Other settings.

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

shrinkResources özelliğini kullanmak için kod daraltmayı 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üçülttüğü diğer yöntemler hakkında daha fazla bilgi için Uygulamanızı küçültme, kodunu karartma ve optimize etme bölümüne bakın.

Android Gradle Plugin 7.0 ve sonraki sürümlerde, uygulamanızın desteklediği yapılandırmaları beyan edebilirsiniz. Gradle, resourceConfigurations türünü 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 edinmek için Kullanılmayan alternatif kaynakları kaldırma bölümüne bakın.

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

Bir 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, önceki cihazlarda kullanıcı deneyimini iyileştirmek için AndroidX'e başvurabilir veya uygulamanızdaki metinlerin otomatik çevirilerini almak için Google Play Hizmetleri'ni kullanabilirsiniz.

Kitaplık bir sunucu veya masaüstü için tasarlandıysa uygulamanızın ihtiyaç duymadığı birçok nesne ve yöntem içerebilir. Kitaplığın yalnızca uygulamanızın ihtiyaç duyduğu bölümleri eklemek 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 kodu çö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 çözmek için genişletilir.

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

ImageDecoder API hakkında daha fazla bilgi için API reference adresine ve GitHub'daki örneğe göz atın.

Yalnızca belirli yoğunlukları destekleyin

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 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 cihazları olduğunu biliyorsanız bu yoğunlukları uygulamanıza eklemeniz gerekip gerekmediğini değerlendirin. Belirli bir ekran yoğunluğu için kaynakları eklemezseniz Android orijinal olarak diğer ekran yoğunlukları için tasarlanmış mevcut kaynakları otomatik olarak ölçeklendirir.

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

Ekran yoğunlukları hakkında daha fazla bilgi için Ekran boyutları ve yoğunlukları bölümüne bakın.

Çekilebilir nesnelerden yararlanın

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

Kaynakları yeniden kullanma

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

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

Başka bir kaynağın yalnızca döndürülmüş eşdeğeri olan kaynakları da hariç tutabilirsiniz. Aşağıdaki kod snippet'i, resmin ortasından çıkıp 180 derece döndürerek "beğenme"yi "beğenme"ye dönüştürmeye ilişkin bir örnek sunar:

<?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ürlere göre oluşturarak APK boyutunu küçültebilirsiniz. Prosedürel oluşturma, APK'nızda artık resim dosyası depolamadığınız için yer açar.

PNG dosyalarında çığır açın

aapt aracı, derleme işlemi sırasında kayıpsız sıkıştırmayla res/drawable/ içine yerleştirilen görüntü kaynaklarını optimize edebilir. Örneğin, aapt aracı, 256'dan fazla renk gerektirmeyen gerçek renkli bir PNG'yi, renk paletli 8 bit PNG'ye dönüştürebilir. Bu işlem, görüntünün eşit kalitede olmasını ve daha küçük bir bellek alanı kaplamasını sağlar.

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 en fazla 256 renk kullanması gerekir.
  • aapt aracı, önceden sıkıştırılmış PNG dosyalarını büyütebilir. Bunu önlemek için isCrunchPngs işaretini kullanarak PNG dosyalarında bu işlemi devre dışı bırakabilirsiniz:
  • Kotlin

        buildTypes.all { isCrunchPngs = false }
        

    Eski

        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 görüntü kalitesini korurken PNG dosya boyutunu küçültebilir.

pngcrush aracı özellikle etkilidir. Bu araç, resmi sıkıştırmak için her filtre ve parametre kombinasyonunu kullanarak PNG filtreleri ve zlib (Deflate) parametrelerinde yineleme yapar. Daha sonra, en küçük sıkıştırılmış çıktıyı 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

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. Ayrıca, JPEG veya PNG'ye göre 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 bölümüne bakın.

Vektör grafikleri kullanma

Çözünürlükten bağımsız simgeler ve diğer ölçeklenebilir medyaları oluşturmak için vektör grafikleri kullanabilirsiniz. APK'nızın ayak izini büyük ölçüde azaltmak için bu grafikleri kullanabilirsiniz. Vektör resimleri Android'de VectorDrawable nesneleri olarak temsil edilir. 100 baytlık bir dosya, VectorDrawable nesnesiyle ekran boyutunda net bir görüntü oluşturabilir.

Bununla birlikte, sistemin her bir VectorDrawable nesnesini 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 resimleri görüntülerken kullanmayı düşünün.

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

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

Kare kare animasyonlar oluşturmak için AnimationDrawable kullanmayın. Bunu yapmak için animasyonun her karesi için ayrı bir bit eşlem dosyası eklemeniz gerekir. Bu da APK'nızın boyutunu önemli ölçüde artırır.

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

Yerel ve Java kodunu azaltın

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

Gereksiz oluşturulmuş kodu kaldırın

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

Numaralandırmalardan kaçınma

Tek bir sıralama, 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ızlıca biriktirilebilir. Mümkünse numaralandırmaları çıkarıp tamsayılara dönüştürmek için @IntDef ek açıklamasını ve kod küçültme yöntemini kullanabilirsiniz. Bu tür bir dönüşüm, numaralandırmaların tüm tür güvenlik avantajlarını korur.

Yerel ikili programların boyutunu azaltma

Uygulamanız yerel kod ve Android NDK'yı kullanıyorsa kodunuzu optimize ederek uygulamanızın sürüm sürümünü de azaltabilirsiniz. Hata ayıklama simgelerini kaldırmak ve yerel kitaplıkları çıkartmamak, iki yararlı tekniktir.

Hata ayıklama sembollerini kaldır

Uygulamanız geliştirme aşamasındaysa ve hâlâ hata ayıklama gerektiriyorsa hata ayıklama sembolleri kullanmak mantıklıdır. Yerel kitaplıklardaki 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ı çıkarmaktan kaçınma

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 APK'daki sıkıştırılmamış .so dosyalarını paketleyin. Bu işaretin devre dışı bırakılması, PackageManager ürünü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, kullanıcıların indirdiği ancak hiçbir zaman kullanmadığı içerikler (ör. ek dil veya ekran yoğunluğuna göre kaynaklar) barındırıyor olabilir. Kullanıcılarınızın indirme işlemini minimum düzeyde almasına yardımcı olmak için uygulamanızı Android App Bundle'ları kullanarak Google Play'e yükleyin. Uygulama paketi yüklemek, Google Play'in her kullanıcının cihaz yapılandırması için optimize edilmiş APK'lar oluşturmasına ve yayınlamasına olanak tanır. Böylece kullanıcılar yalnızca uygulamanızı çalıştırmak için ihtiyaç duydukları kod ve kaynakları indirirler. 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.

Uygulamanızı Google Play'de yayınlamıyorsanız ekran boyutu veya GPU doku desteği gibi faktörlere göre ayrılmış çeşitli APK'lara göre segmentlere ayırabilirsiniz.

Bir kullanıcı uygulamanızı indirdiğinde, cihaz özelliklerine ve ayarlarına göre doğru APK'yı alır. Böylece cihazlar, cihazlarda bulunmayan özelliklerin öğelerini almaz. Örneğin, hdpi cihaz kullanan bir kullanıcının, yüksek yoğunluklu ekranlara sahip cihazlar için ekleyebileceğiniz xxxhdpi kaynaklarına ihtiyacı yoktur.

Daha fazla bilgi için Birden fazla APK oluşturma ve Birden fazla APK desteği bölümlerine göz atın.