Dikkat: Ağustos 2021'den itibaren tüm yeni uygulamalar App Bundle olarak yayınlanmalıdır. Uygulamanızı Google Play'de yayınlıyorsanız Android App Bundle oluşturup yükleyin. Bu durumda Google Play, her kullanıcının cihaz yapılandırması için optimize edilmiş APK'ları otomatik olarak oluşturup sunar. Böylece kullanıcılar, uygulamanızı çalıştırmak için gereken kod ve kaynakları indirir. AAB biçimini desteklemeyen bir mağazada yayın yapıyorsanız birden fazla APK yayınlamak faydalı olur. Bu durumda her APK'yı kendiniz oluşturmanız, imzalamanız ve yönetmeniz gerekir.
Mümkün olduğunda hedef cihazlarınızın tümünü desteklemek için tek bir APK oluşturmak daha iyi olsa da bu, birden fazla Uygulama İkili Arabirimi'ni (ABI) destekleyen dosyalar nedeniyle çok büyük bir APK ile sonuçlanabilir. APK'nızın boyutunu küçültmenin bir yolu, belirli ABI'ler için dosyalar içeren birden fazla APK oluşturmaktır.
Gradle, yalnızca her ABI'ye özgü kod ve kaynakları içeren ayrı APK'lar oluşturabilir. Bu sayfada, derlemenizi birden fazla APK oluşturacak şekilde nasıl yapılandıracağınız açıklanmaktadır. Uygulamanızın ABI'ye dayanmayan farklı sürümlerini oluşturmanız gerekiyorsa bunun yerine derleme varyantlarını kullanın.
Derlemenizi birden fazla APK için yapılandırma
Derlemenizi birden fazla APK için yapılandırmak üzere modül düzeyindeki
splits dosyasına bir build.gradle bloğu ekleyin. splits bloğunda, Gradle'ın ABI başına APK'ları nasıl oluşturmasını istediğinizi belirten bir abi bloğu sağlayın.
ABI'ler için birden fazla APK yapılandırma
Farklı ABI'ler için ayrı APK'lar oluşturmak üzere abi bloğunuzun içine bir splits bloğu ekleyin. abi bloğunuzda, istediğiniz ABI'lerin listesini sağlayın.
ABI başına birden fazla APK yapılandırmak için aşağıdaki Gradle DSL seçenekleri kullanılır:
-
Groovy için
enableveya Kotlin komut dosyası içinisEnable - Bu öğeyi
trueolarak ayarlarsanız Gradle, tanımladığınız ABI'lere göre birden fazla APK oluşturur. Varsayılan değerfalse'dır. -
exclude -
Gradle'ın ayrı APK'lar oluşturmasını istemediğiniz ABI'lerin virgülle ayrılmış listesini belirtir. Çoğu ABI için APK oluşturmak istiyorsanız ancak uygulamanızın desteklemediği birkaç ABI'yi hariç tutmanız gerekiyorsa
excludeseçeneğini kullanın. -
reset() -
Varsayılan ABI listesini temizler. Yalnızca eklemek istediğiniz ABI'leri belirtmek için
includeöğesiyle birlikte kullanın.Aşağıdaki snippet, listeyi temizlemek için
reset()çağrılarak ve ardındanincludekullanılarak ABI listesini yalnızcax86vex86_64olarak ayarlar: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. Yalnızca
reset()ile birlikte kullanılarak ABI'lerin tam listesi belirtilir. -
Groovy için
universalApkveya Kotlin komut dosyası içinisUniversalApk -
trueise Gradle, ABI'ye göre APK'lara ek olarak evrensel bir APK oluşturur. Evrensel APK, tek bir APK'da tüm ABI'ler için kod ve kaynaklar içerir. Varsayılan değerfalse'dır.
Aşağıdaki örnek, her ABI için ayrı bir APK oluşturur: x86
ve x86_64. Bu işlem, ABI'lerin boş bir listesiyle başlamak için reset(), ardından her biri bir APK alan ABI'lerin listesiyle include kullanılarak yapılır.
Groovy
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 Desteklenen ABI'ler başlıklı makaleyi inceleyin.
Yerel/C++ kodu içermeyen projeler
Yerel/C++ kodu olmayan projelerde Build Variants (Derleme Varyantları) panelinde Şekil 1'de gösterildiği gibi iki sütun bulunur: Module (Modül) ve Active Build Variant (Etkin Derleme Varyantı).

Şekil 1. Build Variants (Derleme Varyantları) panelinde, yerel/C++ kodu içermeyen projeler için iki sütun bulunur.
Modülün Active Build Variant değeri, dağıtılan ve düzenleyicide görünür olan 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 projelerde Build Variants (Derleme Varyantları) panelinde Şekil 2'de gösterildiği gibi üç sütun bulunur: Module (Modül), Active Build Variant (Etkin Derleme Varyantı) ve Active ABI (Etkin ABI).
Şekil 2. Build Variants (Derleme Varyantları) paneli, yerel/C++ kodu içeren projeler için Active ABI (Etkin ABI) sütununu ekler.
Modülün Active Build Variant değeri, dağıtılan ve düzenleyicide görünen derleme varyantını belirler. Yerel modüller için Active ABI değeri, düzenleyicinin kullandığı ABI'yi belirler ancak dağıtılanları etkilemez.
Derleme türünü veya ABI'yi değiştirmek için:
- Etkin Yapı Varyantı veya Etkin ABI sütununun hücresini tıklayın.
- Listeden istediğiniz varyantı veya ABI'yi seçin. Yeni bir senkronizasyon işlemi otomatik olarak gerçekleştirilir.
Bir uygulama veya kitaplık modülünün sütunlarından birini değiştirmek, değişikliği tüm bağımlı satırlara uygular.
Sürüm oluşturmayı yapılandırma
Gradle varsayılan olarak birden fazla APK oluşturduğunda her APK, modül düzeyindeki build.gradle veya build.gradle.kts dosyasında belirtildiği gibi aynı sürüm bilgilerine sahiptir. Google Play Store, aynı uygulama için aynı sürüm bilgilerine sahip birden fazla APK'ya izin vermediğinden Play Store'a yüklemeden önce her APK'nın benzersiz bir
versionCode olduğundan emin olmanız gerekir.
Modül düzeyindeki build.gradle dosyanızı, her APK için versionCode değerini geçersiz kılacak şekilde yapılandırabilirsiniz. Birden fazla APK yapılandırdığınız her ABI için benzersiz bir sayısal değer atayan bir eşleme oluşturarak çıkış sürüm kodunu, defaultConfig veya productFlavors bloğunda tanımlanan sürüm kodu ile ABI'ye atanan sayısal değeri birleştiren bir değerle geçersiz kılabilirsiniz.
Aşağıdaki örnekte, x86 ABI'si için APK'nın versionCode değeri 2004, x86_64 ABI'si için ise 3004'tür.versionCode
Sürüm kodlarını 1000 gibi büyük artışlarla atamak, uygulamanızı güncellemeniz gerektiğinde daha sonra benzersiz sürüm kodları atamanıza olanak tanır. Örneğin, sonraki bir güncellemede defaultConfig.versionCode 5'e yükselirse Gradle, x86 APK'sına 2005, x86_64 APK'sına ise 3005 sürüm kodunu atar.versionCode
İpucu: Derlemeniz evrensel bir APK içeriyorsa bu APK'ya diğer APK'larınızınkinden daha düşük bir versionCode atayın.
Google Play Store, uygulamanızın hem hedef cihazla uyumlu olan hem de en yüksek versionCode değerine sahip sürümünü yüklediğinden, evrensel APK'ya daha düşük bir versionCode değeri atamak, Google Play Store'un evrensel APK'ya geri dönmeden önce APK'larınızdan birini yüklemeyi denemesini sağlar. Aşağıdaki örnek kod, evrensel bir APK'nın varsayılan versionCode değerini geçersiz kılmayarak bu durumu ele alır.
Groovy
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] 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) 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 başlıklı makaleyi inceleyin.
Birden fazla APK oluşturma
Modül düzeyindeki build.gradle veya build.gradle.kts dosyanızı birden fazla APK oluşturacak şekilde yapılandırdıktan sonra Build > Build APK'yı (Derle > APK Derle) tıklayarak Project (Proje) bölmesinde şu anda seçili olan modül için tüm APK'ları oluşturun. Gradle, projenin build/outputs/apk/
dizininde her ABI için APK'lar oluşturur.
Gradle, birden fazla APK yapılandırdığınız her ABI için bir APK oluşturur.
Örneğin, aşağıdaki build.gradle snippet'i, x86 ve x86_64 ABI'leri için birden fazla APK oluşturulmasını sağlar:
Groovy
... splits { abi { enable true reset() include "x86", "x86_64" } }
Kotlin
... splits { abi { isEnable = true reset() include("x86", "x86_64") } }
Örnek yapılandırmanın çıkışı aşağıdaki 4 APK'yı içerir:
app-X86-release.apk:x86ABI'si için kod ve kaynaklar içerir.app-X86_64-release.apk:x86_64ABI'si için kod ve kaynaklar içerir.
ABI'ye dayalı birden fazla APK oluştururken Gradle, build.gradle dosyanızdaki splits.abi bloğunda universalApk true (Groovy için) veya build.gradle.kts dosyanızdaki splits.abi bloğunda isUniversalApk = true (Kotlin betiği için) belirtirseniz yalnızca tüm ABI'ler için kod ve kaynak içeren bir APK oluşturur.
APK dosya adı biçimi
Gradle, birden fazla APK oluştururken aşağıdaki şemayı kullanarak APK dosya adları oluşturur:
modulename-ABI-buildvariant.apk
Şema bileşenleri şunlardır:
-
modulename - Oluşturulan modülün adını belirtir.
-
ABI -
ABI için birden fazla APK etkinleştirilmişse APK'nın ABI'sini (ör.
x86) belirtir. -
buildvariant -
debuggibi oluşturulan derleme çeşidini belirtir.