Dikkat: Ağustos 2021'den bu yana yalnızca yeni uygulamalar App Bundle olarak yayınlanmalıdır. Uygulamanızı Google Play'de yayınlarsanız Android App Bundle oluşturup yükleyin. Zaman Google Play aşağıdakiler için optimize edilmiş APK'ları otomatik olarak oluşturur ve sunar: her kullanıcının cihaz yapılandırmasına izin verir, böylece sadece kod ve kaynakları indirirler. en iyi uygulamaları paylaştık. Birden fazla APK yayınlamak istiyorsanız AAB biçimini desteklemeyen bir mağazada yayınlama Böyle bir durumda, her APK'yı kendiniz oluşturmanız, imzalamanız ve yönetmeniz gerekir.
Hedef cihazlarınızın tümünü destekleyecek tek bir APK oluşturmak daha iyi olsa da her mümkün olduğunda, bu işlem, dosyalar nedeniyle çok büyük bir APK birden çok destekleniyor ekran yoğunlukları veya Uygulama İkili Programı Arayüzler (ABI'ler). APK'nızın boyutunu küçültmenin bir yolu da birden fazla APK'ya sahip belirli ekran yoğunluklarına veya ABI'lere ilişkin dosyalar içermelidir.
Gradle yalnızca belirli kod ve kaynakları içeren ayrı APK'lar oluşturabilir ABI'ye otomatik olarak eklenmesini sağlar. Bu sayfada, derlemenizi birden fazla APK oluşturabilirsiniz. Uygulamanızın farklı sürümlerini oluşturmanız gerekiyorsa bunun yerine derleme varyantları kullanın.
Derlemenizi birden fazla APK için yapılandırma
Derlemenizi birden fazla APK için yapılandırmak üzere
  
  Modül düzeyinize splits blok
  build.gradle dosyası. Şuranın içinde:
  splits blok, sağla
  Gradle'ın nasıl oluşturmasını istediğinizi belirten bir density bloğu
  yoğunluk bazında APK'lar veya Gradle'ı nasıl istediğinizi belirten bir abi bloğu
  oluşturmak için kullanabilirsiniz. Hem yoğunluk hem de ABI blokları sağlayabilirsiniz.
  derleme sistemi her yoğunluk ve ABI kombinasyonu için bir APK oluşturur.
Ekran yoğunlukları için birden fazla APK yapılandırma
Farklı ekran yoğunluklarına yönelik ayrı APK'lar oluşturmak için
  density blok içinde
  splits blok. density blokunuzda bir
  ve uyumlu ekran boyutlarının
listesini inceleyin. Yalnızca
  uyumlu ekran boyutlarına ihtiyacınız varsa
  
  Her bir APK'nın manifest dosyasındaki <compatible-screens> öğeleri.
Aşağıdaki Gradle DSL seçenekleri, ekran yoğunlukları:
- 
    Groovy için enable, Kotlin metni içinisEnable
- .
    Bu öğeyi trueolarak ayarlarsanız Gradle birden fazla APK oluşturur bu ayarları değiştirebilirsiniz. Varsayılan değer:false
- 
    exclude
- .
    Gradle'ı istemediğiniz yoğunlukların virgülle ayrılmış listesini belirtir
    ayrı APK'lar oluşturabilirsiniz. Şu durumlarda excludekullanın: Çoğu yoğunluk için APK oluşturmak istiyorsunuz ancak birkaç tane hariç tutmalısınız uygulamanızın desteklemediği yoğunluklara gidin.
- 
    reset()
- 
    Varsayılan ekran yoğunlukları listesini temizler. Yalnızca İstediğiniz yoğunlukları belirten includeöğesi ekle.Aşağıdaki snippet, yoğunluk listesini yalnızca reset()numaralı telefonu arayarakldpivexxhdpituşuna basarak listeyi temizleyin veincludekomutunu kullanın:reset() // Clears the default list from all densities // to no densities. include "ldpi", "xxhdpi" // Specifies the two densities to generate APKs // for.
- 
    include
- .
    Gradle'ın oluşturmasını istediğiniz yoğunlukların virgülle ayrılmış listesini belirtir
    APK'lar. Yalnızca reset()ile birlikte kullanarak tam yoğunluk listesi.
- 
    compatibleScreens
- 
    Uyumlu ekran boyutlarının virgülle ayrılmış listesini belirtir. Bu eşleşen bir için manifest dosyasındaki <compatible-screens>düğümünü inceleyin her APK'yı kullanın.Bu ayar, her iki ekranı da kolayca yönetmenizi sağlar. yoğunlukları ve ekran boyutları gibi öğeleri aynı build.gradlebölümünde bulabilirsiniz. Ancak,<compatible-screens>, cihaz türlerini sınırlandırabilir en iyi uygulamaları paylaşacağız. Farklı destek yöntemlerini daha fazla bilgi için ekran uyumluluğuna genel bakış başlıklı makaleyi inceleyin.
Çünkü ekran yoğunluğuna dayalı her APK
  Belirli kısıtlamalara sahip <compatible-screens> etiketi
  APK'nın hangi ekran türlerini desteklediğiyle ilgili (birkaç tane ekran görüntüsü yayınlasanız bile)
  APK'lar: Bazı yeni cihazlar birden fazla APK filtrenizle eşleşmez. Dolayısıyla,
  Gradle her zaman öğe içeren ek bir evrensel APK oluşturur
  tüm ekran yoğunlukları için uygundur ve
  <compatible-screens> etiketi. Bunu yayınla
  farklı yoğunluklardaki APK'larınızla birlikte evrensel APK'yı
  APK'ları
  <compatible-screens> etiketi.
Aşağıdaki örnek, her bir kullanıcı için ayrı bir APK
  ekran
    yoğunluk (ldpi, xxhdpi ve hariç)
    xxxhdpi. Bu işlem, içeriği kaldırmak için exclude kullanılarak yapılır
    bu üç yoğunluğu, varsayılan tüm yoğunluk listesinden çıkarır.
Eski
android { ... splits { // Configures multiple APKs based on screen density. density { // Configures multiple APKs based on screen density. enable true // Specifies a list of screen densities you don't want Gradle to create multiple APKs for. exclude "ldpi", "xxhdpi", "xxxhdpi" // Specifies a list of compatible screen size settings for the manifest. compatibleScreens 'small', 'normal', 'large', 'xlarge' } } }
Kotlin
android { ... splits { // Configures multiple APKs based on screen density. density { // Configures multiple APKs based on screen density. isEnable = true // Specifies a list of screen densities you don't want Gradle to create multiple APKs for. exclude("ldpi", "xxhdpi", "xxxhdpi") // Specifies a list of compatible screen size settings for the manifest. compatibleScreens("small", "normal", "large", "xlarge") } } }
Farklı derlemeleri özelleştirme hakkında daha fazla bilgi uygulamanızın belirli ekran türlerine ve cihazlara yönelik sürümlerini, Kısıtlanmış olarak bildir ekran desteğine başvurun.
ABI'ler için birden fazla APK yapılandırın
Farklı ABI'ler için ayrı APK'lar oluşturmak üzere bir abi bloğu ekleyin
  
  splits blok. abi blokunuzda şunları içeren bir liste sağlayın:
  tıklayın.
Aşağıdaki Gradle DSL seçenekleri, ABI:
- 
    Groovy için enableveya Kotlin komut dosyası içinisEnable
- Bu öğeyi trueolarak ayarlarsanız Gradle birden fazla öğe oluşturur Tanımladığınız ABI'lere dayalı APK'lar. Varsayılan değerfalsedeğeridir.
- 
    exclude
- .
    Gradle'ın yapmasını istemediğiniz ABI'lerin virgülle ayrılmış listesini belirtir
    ayrı APK'lar oluşturabilirsiniz. Oluşturmak istiyorsanız excludekullanın Çoğu ABI için APK'lar; ancak uygulamanızın sunmadığı birkaç ABI'yi hariç tutması gerekir destek.
- 
    reset()
- 
    Varsayılan ABI listesini temizler. Yalnızca Eklemek istediğiniz ABI'leri belirtmek için includeöğesi.Aşağıdaki snippet, ABI'lerin listesini yalnızca x86ve Listeyi temizlemek içinreset()numaralı telefonu arayarakx86_64veincludekullanarak:reset() // Clears the default list from all ABIs to no ABIs. include "x86", "x86_64" // Specifies the two ABIs we want to generate APKs for. 
- 
    include
- .
    Gradle'ın APK oluşturmasını istediğiniz ABI'lerin virgülle ayrılmış listesini belirtir
    . Kesin bir değer belirtmek için yalnızca reset()ile birlikte kullanın ABI listesidir.
- 
    Groovy için universalApkveya Groovy içinisUniversalApkKotlin alfabesi
- 
    truedurumunda Gradle, ABI APK'larına özeldir. Evrensel APK, bir tek APK. Varsayılan değerfalsedeğeridir.Bu seçeneğin yalnızca splits.abiblokunda mevcut. Birden fazla APK oluştururken Gradle her zaman şunları içeren evrensel bir APK üretir: tüm ekran yoğunluklarına yönelik kod ve kaynakları içerir.
Aşağıdaki örnek her ABI için ayrı bir APK oluşturur: x86
  ve x86_64. Bu işlem, reset() kullanılarak yapılır
  boş bir ABI listesiyle başlayın, ardından bir ABI'nin bulunduğu include
  Her biri bir APK alan ABI'lerin listesi.
Eski
android { ... splits { // Configures multiple APKs based on ABI. abi { // Enables building multiple APKs per ABI. enable true // By default all ABIs are included, so use reset() and include to specify that you only // want APKs for x86 and x86_64. // Resets the list of ABIs for Gradle to create APKs for to none. reset() // Specifies a list of ABIs for Gradle to create APKs for. include "x86", "x86_64" // Specifies that you don't want to also generate a universal APK that includes all ABIs. universalApk false } } }
Kotlin
android { ... splits { // Configures multiple APKs based on ABI. abi { // Enables building multiple APKs per ABI. isEnable = true // By default all ABIs are included, so use reset() and include to specify that you only // want APKs for x86 and x86_64. // Resets the list of ABIs for Gradle to create APKs for to none. reset() // Specifies a list of ABIs for Gradle to create APKs for. include("x86", "x86_64") // Specifies that you don't want to also generate a universal APK that includes all ABIs. isUniversalApk = false } } }
Desteklenen ABI'lerin listesi için bkz. Destekleniyor ABI'ler.
Yerel/C++ kodu olmayan projeler
Yerel/C++ kodu olmayan projeler için Varyant Oluşturma panelinde iki öğe bulunur. sütunlar: Modül ve Etkin Derleme Varyant, Şekil 1'de gösterildiği gibidir.
  Şekil 1. Varyant Oluştur panelinde, aşağıdaki gibi olmayan projeler için iki sütun bulunur:
yerel/C++ kodu.
Şekil 1. Varyant Oluştur panelinde, aşağıdaki gibi olmayan projeler için iki sütun bulunur:
yerel/C++ kodu.
Şu öğe için Etkin Derleme Varyantı değeri: modülü, dağıtılan ve düzenleyicide görünen derleme varyantını belirler. Varyantlar arasında geçiş yapmak için bir modülün Etkin Derleme Varyantı hücresini tıklayın ve liste alanından istediğiniz varyantı seçin.
Yerel/C++ kodu içeren projeler
Yerel/C++ kodu içeren projeler için Varyant Oluşturma panelinde üç öğe bulunur. sütunlar: Modül, Etkin Derleme Varyant ve Etkin ABI (Şekil 2'de gösterildiği gibi).
 .
Şekil 2. Varyant Derleme paneli, dönüşüm izleme için Etkin ABI sütununu ekler.
yerel/C++ kodu içeren projeler için geçerlidir.
.
Şekil 2. Varyant Derleme paneli, dönüşüm izleme için Etkin ABI sütununu ekler.
yerel/C++ kodu içeren projeler için geçerlidir.
Modülün Aktif Derleme Varyantı değeri Dağıtılan ve düzenleyicide görünen derleme varyantını belirler. Yerel modüllerde Active ABI değeri, düzenleyicinin ancak dağıtımları etkilemez.
Derleme türünü veya ABI'yı değiştirmek için:
- Etkin Derleme Varyantı hücresini tıklayın veya Etkin ABI sütununu seçin.
- Listeden istediğiniz varyantı veya ABI'yi seçin girin. Otomatik olarak yeni bir senkronizasyon çalıştırılır.
Bir uygulama veya kitaplık modülü için iki sütundan birinin değiştirilmesi, değişikliği tüm bağımlı satırlar.
Sürüm oluşturmayı yapılandırma
  Gradle birden fazla APK oluşturduğunda varsayılan olarak her APK
  modül düzeyinde belirtilen sürüm bilgileri
  build.gradle veya build.gradle.kts dosyası. Çünkü
  Google Play Store, aynı uygulama için tümünde birden fazla APK'ya sahip olan birden fazla APK'ya izin
  aynı sürüm bilgilerine sahipse her APK'nın benzersiz bir sürüm
  
  versionCode önce Play Store'a yükleyin.
  Modül düzeyindeki build.gradle dosyanızı şu şekilde yapılandırabilirsiniz:
  Her bir APK için versionCode değerini geçersiz kılın. Eşleme oluşturarak
  her ABI ve yapılandırdığınız yoğunluk için benzersiz bir sayısal değer atar
  için birden fazla APK kullanıyorsanız çıkış sürüm kodunu
  defaultConfig veya
  sayısal değerin atanmış olduğu productFlavors bloğu
  ABI'yı seçin.
  Aşağıdaki örnekte, x86 ABI için APK
  2004'ün versionCode ve x86_64 ABI'sını alır
  3004 üzerinden versionCode alıyor.
Sürüm kodlarını 1000 gibi büyük artışlarla atamak,
  uygulamanızı güncellemeniz gerekirse benzersiz sürüm kodları atamanıza olanak tanır. Örneğin,
  Örneğin, defaultConfig.versionCode
  Gradle bir versionCode 2005
  x86 APK'sını ve 3005'i x86_64 APK'sına.
  İpucu: Derlemeniz evrensel APK içeriyorsa buna
  versionCode daha düşük bir fiyat sunuyor.
  Çünkü Google Play Store, uygulamanızın hem kendi
  hedef cihazla uyumludur ve en büyük
  versionCode;versionCode
  evrensel APK, Google Play Store'un
  APK'lara öncelik vermeyi unutmayın. Aşağıdaki örnek kod
  bunu evrensel APK'nın
  Varsayılan versionCode.
Eski
android { ... defaultConfig { ... versionCode 4 } splits { ... } } // Map for the version code that gives each ABI a value. ext.abiCodes = ['armeabi-v7a':1, x86:2, x86_64:3] // For per-density APKs, create a similar map: // ext.densityCodes = ['mdpi': 1, 'hdpi': 2, 'xhdpi': 3] import com.android.build.OutputFile // For each APK output variant, override versionCode with a combination of // ext.abiCodes * 1000 + variant.versionCode. In this example, variant.versionCode // is equal to defaultConfig.versionCode. If you configure product flavors that // define their own versionCode, variant.versionCode uses that value instead. android.applicationVariants.all { variant -> // Assigns a different version code for each output APK // other than the universal APK. variant.outputs.each { output -> // Stores the value of ext.abiCodes that is associated with the ABI for this variant. def baseAbiVersionCode = // Determines the ABI for this variant and returns the mapped value. project.ext.abiCodes.get(output.getFilter(OutputFile.ABI)) // Because abiCodes.get() returns null for ABIs that are not mapped by ext.abiCodes, // the following code doesn't override the version code for universal APKs. // However, because you want universal APKs to have the lowest version code, // this outcome is desirable. if (baseAbiVersionCode != null) { // Assigns the new version code to versionCodeOverride, which changes the // version code for only the output APK, not for the variant itself. Skipping // this step causes Gradle to use the value of variant.versionCode for the APK. output.versionCodeOverride = baseAbiVersionCode * 1000 + variant.versionCode } } }
Kotlin
android { ... defaultConfig { ... versionCode = 4 } splits { ... } } // Map for the version code that gives each ABI a value. val abiCodes = mapOf("armeabi-v7a" to 1, "x86" to 2, "x86_64" to 3) // For per-density APKs, create a similar map: // val densityCodes = mapOf("mdpi" to 1, "hdpi" to 2, "xhdpi" to 3) import com.android.build.api.variant.FilterConfiguration.FilterType.* // For each APK output variant, override versionCode with a combination of // abiCodes * 1000 + variant.versionCode. In this example, variant.versionCode // is equal to defaultConfig.versionCode. If you configure product flavors that // define their own versionCode, variant.versionCode uses that value instead. androidComponents { onVariants { variant -> // Assigns a different version code for each output APK // other than the universal APK. variant.outputs.forEach { output -> val name = output.filters.find { it.filterType == ABI }?.identifier // Stores the value of abiCodes that is associated with the ABI for this variant. val baseAbiCode = abiCodes[name] // Because abiCodes.get() returns null for ABIs that are not mapped by ext.abiCodes, // the following code doesn't override the version code for universal APKs. // However, because you want universal APKs to have the lowest version code, // this outcome is desirable. if (baseAbiCode != null) { // Assigns the new version code to output.versionCode, which changes the version code // for only the output APK, not for the variant itself. output.versionCode.set(baseAbiCode * 1000 + (output.versionCode.get() ?: 0)) } } } }
Alternatif sürüm kodu şemalarıyla ilgili daha fazla örnek için Sürüm kodları atama
Birden fazla APK oluşturma
Modül düzeyindeki build.gradle öğenizi yapılandırdıktan sonra veya
  Birden fazla APK oluşturmak için build.gradle.kts dosyasını tıklayın,
  Oluştur > Şu anki tüm APK'ları derlemek için APK'yı oluşturun
  Proje bölmesindeki seçili modülü seçin. Gradle, APK'ları oluşturur
  projenin build/outputs/apk/ içinde her yoğunluk veya ABI için
  dizin.
Gradle, birden fazla APK yapılandırdığınız her yoğunluk veya ABI için bir APK oluşturur. Hem yoğunluklar hem de ABI'ler için birden fazla APK etkinleştirirseniz Gradle bir APK oluşturur her yoğunluk ve ABI kombinasyonunda gösterilir.
Örneğin,
  build.gradle snippet'i, mdpi ve
  hdpi yoğunluk ve ayrıca x86 ve x86_64 ABI'leri:
Eski
... splits { density { enable true reset() include "mdpi", "hdpi" } abi { enable true reset() include "x86", "x86_64" } }
Kotlin
... splits { density { isEnable = true reset() include("mdpi", "hdpi") } abi { isEnable = true reset() include("x86", "x86_64") } }
Örnek yapılandırmadaki çıkış aşağıdaki 4 APK'yı içerir:
- app-hdpiX86-release.apk: Şunun için kod ve kaynakları içerir:- hdpiyoğunluk ve- x86ABI.
- app-hdpiX86_64-release.apk: Şunun için kod ve kaynakları içerir:- hdpiyoğunluk ve- x86_64ABI.
- app-mdpiX86-release.apk: Şunun için kod ve kaynakları içerir:- mdpiyoğunluk ve- x86ABI.
- app-mdpiX86_64-release.apk: Şunun için kod ve kaynakları içerir:- mdpiyoğunluk ve- x86_64ABI.
Ekran yoğunluğuna göre birden fazla APK oluştururken Gradle her zaman tüm yoğunluklara yönelik kod ve kaynakları içeren evrensel bir APK oluşturur, ek olarak yoğunluğa göre APK'ları da içerir.
Temelinde birden fazla APK oluştururken
  Gradle, yalnızca tüm uygulamalar için kod ve kaynak içeren bir APK
  ABI'ler, universalApk true öğesini
  build.gradle dosyanızda splits.abi blok
  (Groovy için) veya isUniversalApk = true
  build.gradle.kts dosyanızda splits.abi blok
  (Kotlin komut dosyası için).
APK dosya adı biçimi
Gradle, birden fazla APK oluştururken APK dosya adlarını aşağıdakileri kullanarak oluşturur: şema:
modulename-screendensityABI-buildvariant.apk
Şema bileşenleri şunlardır:
- 
    modulename
- . Derlenmekte olan modül adını belirtir.
- 
    screendensity
- .
    Ekran yoğunluğu için birden fazla APK etkinse ekranı belirtir
    yoğunluğu (örneğin, mdpi).
- 
    ABI
- 
    ABI için birden fazla APK etkinleştirilirse APK için ABI'yi belirtir. Örneğin, x86olarak.Hem ekran yoğunluğu hem de ABI için birden fazla APK etkinleştirilirse Gradle, yoğunluk adını ABI adıyla birleştirir. Örneğin, mdpiX86universalApk, ABI için etkinleştirildiyse APK'lar, Gradle, evrensel APK'nın ABI kısmı olarakuniversaldeğerini kullanır dosya adı.
- 
    buildvariant
- .
    Derlenmekte olan derleme varyantını (ör. debug) belirtir.
  Örneğin, mdpi
  myApp hata ayıklama sürümünde, APK dosya adı
  myApp-mdpi-debug.apk. Lansman
  hem Android hem de iOS için birden fazla APK oluşturacak şekilde
  mdpi ekran yoğunluğu ve x86 ABI'nın APK dosya adı şu şekildedir:
  myApp-mdpiX86-release.apk.
