Perhatian: Sejak Agustus 2021, semua aplikasi baru harus dipublikasikan sebagai App Bundle. Jika Anda memublikasikan aplikasi ke Google Play, bangun dan upload Android App Bundle. Setelah Anda melakukannya, Google Play akan otomatis membuat dan menayangkan APK yang dioptimalkan untuk setiap konfigurasi perangkat pengguna, sehingga pengguna hanya mendownload kode dan resource yang mereka perlukan untuk menjalankan aplikasi Anda. Memublikasikan beberapa APK berguna jika Anda memublikasikan ke toko yang tidak mendukung format AAB. Dalam hal ini, Anda harus membuat, menandatangani, dan mengelola sendiri setiap APK.
Meskipun sebaiknya buat satu APK untuk mendukung semua perangkat target jika memungkinkan, hal tersebut dapat menghasilkan APK yang sangat besar karena adanya file yang mendukung beberapa Antarmuka Biner Aplikasi (ABI). Salah satu cara untuk mengurangi ukuran APK adalah dengan membuat multi-APK yang berisi file untuk ABI tertentu.
Gradle dapat membuat APK terpisah yang hanya berisi kode dan resource khusus untuk setiap ABI. Halaman ini menjelaskan cara mengonfigurasi build Anda untuk membuat multi-APK. Jika perlu membuat beberapa versi lain aplikasi Anda yang tidak berdasarkan ABI, gunakan varian build.
Mengonfigurasi build untuk multi-APK
Guna mengonfigurasi build Anda untuk multi-APK, tambahkan blok splits ke file build.gradle tingkat modul Anda. Dalam blok
splits, sediakan
blok abi yang menentukan cara Anda ingin Gradle
menghasilkan APK untuk setiap ABI.
Mengonfigurasi multi-APK untuk ABI
Guna membuat APK terpisah untuk ABI berbeda, tambahkan blok abi di dalam blok splits Anda. Dalam blok abi Anda, cantumkan daftar ABI yang diinginkan.
Opsi Gradle DSL berikut digunakan untuk mengonfigurasi multi-APK per ABI:
-
enableuntuk Groovy, atauisEnableuntuk skrip Kotlin - Jika Anda menetapkan elemen ini ke
true, Gradle akan menghasilkan beberapa APK berdasarkan ABI yang Anda tentukan. Nilai defaultnya adalahfalse. -
exclude -
Menentukan daftar yang dipisahkan koma untuk ABI yang APK terpisahnya tidak ingin Anda hasilkan oleh Gradle. Gunakan
excludejika Anda ingin membuat APK untuk sebagian besar ABI, tetapi Anda perlu mengecualikan beberapa ABI yang tidak didukung oleh aplikasi Anda. -
reset() -
Mengosongkan daftar default ABI. Gunakan opsi ini hanya jika dikombinasikan dengan elemen
includeuntuk menentukan ABI yang ingin Anda tambahkan.Cuplikan berikut menetapkan daftar ABI untuk
x86danx86_64saja dengan memanggilreset()untuk mengosongkan daftar, lalu menggunakaninclude: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 -
Menentukan daftar ABI yang dipisahkan koma yang APK-nya ingin Anda hasilkan dengan Gradle. Gunakan opsi ini hanya jika dikombinasikan dengan
reset()untuk menentukan daftar pasti ABI. -
universalApkuntuk Groovy, atauisUniversalApkuntuk skrip Kotlin -
Jika
true, Gradle akan menghasilkan APK universal selain APK per ABI. APK universal berisi kode dan resource untuk semua ABI dalam satu APK. Nilai defaultnya adalahfalse.
Contoh berikut akan menghasilkan APK terpisah untuk setiap ABI: x86 dan x86_64. Hal ini dilakukan dengan menggunakan reset()
untuk memulai dengan daftar ABI kosong, diikuti oleh include dengan
daftar ABI yang masing-masing akan mendapatkan APK.
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 } } }
Untuk daftar ABI yang didukung, lihat ABI yang Didukung.
Project tanpa kode native/C++
Untuk project tanpa kode native/C++, panel Build Variants memiliki dua kolom: Module dan Active Build Variant, seperti yang ditunjukkan pada gambar 1.

Gambar 1. Panel Build Variants memiliki dua kolom untuk project tanpa kode native/C++.
Nilai Active Build Variant untuk modul menentukan varian build yang di-deploy dan terlihat di editor. Untuk beralih antarvarian, klik sel Active Build Variant untuk modul dan pilih varian yang diinginkan dari kolom daftar.
Project dengan kode native/C++
Untuk project dengan kode native/C++, panel Build Variants memiliki tiga kolom: Module, Active Build Variant, dan Active ABI, seperti yang ditunjukkan pada gambar 2.
Gambar 2. Panel Build Variants menambahkan kolom Active ABI untuk
project dengan kode native/C++.
Nilai Active Build Variant untuk modul menentukan varian build yang di-deploy dan terlihat di editor. Untuk modul native, nilai Active ABI menentukan ABI yang digunakan editor, tetapi tidak memengaruhi apa yang di-deploy.
Untuk mengubah jenis build atau ABI:
- Klik sel untuk kolom Active Build Variant atau Active ABI.
- Pilih varian atau ABI yang diinginkan dari kolom daftar. Sinkronisasi baru akan otomatis berjalan.
Mengubah kolom untuk aplikasi maupun modul library akan menerapkan perubahan untuk semua baris dependen.
Mengonfigurasi pembuatan versi
Secara default, saat Gradle menghasilkan multi-APK, setiap APK memiliki informasi versi yang sama, seperti yang ditentukan dalam file build.gradle atau build.gradle.kts tingkat modul. Karena Google Play Store tidak mengizinkan multi-APK untuk satu aplikasi jika semuanya memiliki informasi versi yang sama, Anda harus memastikan setiap APK memiliki
versionCode yang unik sebelum menguploadnya ke Play Store.
Anda dapat mengonfigurasi file build.gradle tingkat modul untuk mengganti versionCode untuk setiap APK. Dengan membuat pemetaan yang menetapkan nilai numerik unik untuk setiap ABI yang Anda konfigurasi untuk multi-APK, Anda dapat mengganti kode versi output dengan nilai yang menggabungkan kode versi yang ditentukan dalam blok defaultConfig atau productFlavors dengan nilai numerik yang ditetapkan ke ABI.
Dalam contoh berikut, APK untuk ABI x86
mendapatkan versionCode 2004 dan ABI x86_64
mendapatkan versionCode 3004.
Menetapkan kode versi dalam penambahan besar, seperti 1000, memungkinkan Anda untuk menetapkan kode versi unik nantinya jika Anda perlu mengupdate aplikasi Anda. Misalnya, jika defaultConfig.versionCode melakukan iterasi ke 5 pada update berikutnya, Gradle akan menetapkan versionCode 2005 ke APK x86 dan 3005 ke APK x86_64.
Tips: Jika build Anda menyertakan APK universal, tetapkan versionCode yang lebih rendah daripada APK lain mana pun ke build.
Karena Google Play Store menginstal versi aplikasi Anda yang kompatibel dengan perangkat target dan yang memiliki versionCode tertinggi, menetapkan versionCode yang lebih rendah ke APK universal akan memastikan bahwa Google Play Store mencoba menginstal salah satu APK Anda sebelum menggantinya ke APK universal. Contoh kode berikut menangani hal ini dengan tidak mengganti versionCode default APK universal.
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)) } } } }
Untuk contoh skema kode versi alternatif lainnya, lihat Menetapkan kode versi.
Membuat beberapa APK
Setelah Anda mengonfigurasi file build.gradle atau
build.gradle.kts tingkat modul untuk membuat beberapa APK, klik
Build > Build APK untuk membuat semua APK bagi modul
yang saat ini dipilih di panel Project. Gradle membuat APK untuk setiap ABI di direktori build/outputs/apk/ project.
Gradle akan membuat APK untuk setiap ABI yang multi-APK-nya Anda konfigurasi.
Misalnya, cuplikan build.gradle berikut memungkinkan pembuatan multi-APK untuk ABI x86 dan x86_64:
Groovy
... splits { abi { enable true reset() include "x86", "x86_64" } }
Kotlin
... splits { abi { isEnable = true reset() include("x86", "x86_64") } }
Output dari contoh konfigurasi ini mencakup 4 APK berikut:
app-X86-release.apk: Berisi kode dan resource untuk ABIx86.app-X86_64-release.apk: Berisi kode dan resource untuk ABIx86_64.
Saat membuat multi-APK berdasarkan ABI, Gradle hanya akan menghasilkan APK yang mencakup kode dan resource untuk semua ABI jika Anda menentukan universalApk true dalam blok splits.abi pada file build.gradle Anda (untuk Groovy) atau isUniversalApk = true dalam blok splits.abi pada file build.gradle.kts Anda (untuk skrip Kotlin).
Format nama file APK
Saat membuat multi-APK, Gradle menghasilkan nama file APK menggunakan skema berikut:
modulename-ABI-buildvariant.apk
Komponen skemanya adalah:
-
modulename - Menentukan nama modul yang dibuat.
-
ABI -
Menentukan ABI untuk APK, misalnya
x86, jika multi-APK untuk ABI diaktifkan. -
buildvariant -
Menentukan varian build yang sedang dibuat, misalnya
debug.