Es ist zwar besser, nach Möglichkeit ein einzelnes APK zu erstellen, das alle Zielgeräte unterstützt, aber das kann aufgrund von Dateien, die mehrere Binärschnittstellen (Application Binary Interfaces, ABIs) unterstützen, zu einem sehr großen APK führen. Eine Möglichkeit, die Größe deines APKs zu reduzieren, besteht darin, mehrere APKs zu erstellen, die Dateien für bestimmte ABIs enthalten.
Gradle kann separate APKs erstellen, die nur Code und Ressourcen enthalten, die für die jeweilige ABI spezifisch sind. Auf dieser Seite wird beschrieben, wie Sie Ihren Build so konfigurieren, dass mehrere APKs generiert werden. Wenn Sie verschiedene Versionen Ihrer App erstellen müssen, die nicht auf ABI basieren, verwenden Sie stattdessen Build-Varianten.
Build für mehrere APKs konfigurieren
Wenn Sie Ihren Build für mehrere APKs konfigurieren möchten, fügen Sie der Datei build.gradle auf Modulebene einen splits-Block hinzu. Geben Sie im Block splits einen Block abi an, der festlegt, wie Gradle APKs pro ABI generieren soll.
Mehrere APKs für ABIs konfigurieren
Wenn Sie separate APKs für verschiedene ABIs erstellen möchten, fügen Sie einen abi-Block in den splits-Block ein. Geben Sie im Block abi eine Liste der ausgewählten ABIs an.
Die folgenden Gradle-DSL-Optionen werden verwendet, um mehrere APKs pro ABI zu konfigurieren:
enablefür Groovy oderisEnablefür Kotlin-Skript- Wenn Sie dieses Element auf
truesetzen, generiert Gradle mehrere APKs basierend auf den von Ihnen definierten ABIs. Der Standardwert istfalse. exclude- Gibt eine durch Kommas getrennte Liste von ABIs an, für die Gradle keine separaten APKs generieren soll. Verwenden Sie
exclude, wenn Sie APKs für die meisten ABIs generieren möchten, aber einige ABIs ausschließen müssen, die von Ihrer App nicht unterstützt werden. reset()Löscht die Standardliste der ABIs. Verwenden Sie dieses Element nur in Kombination mit dem Element
include, um die ABIs anzugeben, die Sie hinzufügen möchten.Im folgenden Snippet wird die Liste der ABIs auf
x86undx86_64festgelegt. Dazu wirdreset()aufgerufen, um die Liste zu löschen, und dannincludeverwendet: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.includeGibt eine durch Kommas getrennte Liste von ABIs an, für die Gradle APKs generieren soll. Nur in Kombination mit
reset()verwenden, um eine genaue Liste von ABIs anzugeben.universalApkfür Groovy oderisUniversalApkfür Kotlin-SkriptWenn
true, generiert Gradle zusätzlich zu den ABI-spezifischen APKs ein universelles APK. Ein universelles APK enthält Code und Ressourcen für alle ABIs in einem einzigen APK. Der Standardwert istfalse.
Im folgenden Beispiel wird für jede ABI ein separates APK generiert: x86 und x86_64.
Dazu wird reset() verwendet, um mit einer leeren Liste von ABIs zu beginnen, gefolgt von include mit einer Liste von ABIs, die jeweils ein APK erhalten.
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 } } }
Eine Liste der unterstützten ABIs finden Sie unter Unterstützte ABIs.
Projekte ohne nativen/C++-Code
Bei Projekten ohne nativen/C++-Code hat der Bereich Build-Varianten zwei Spalten: Modul und Aktive Build-Variante, wie in Abbildung 1 dargestellt.
Der Wert Aktive Build-Variante für das Modul bestimmt die Build-Variante, die bereitgestellt wird und im Editor sichtbar ist. Wenn du zwischen Varianten wechseln möchtest, klicke für ein Modul auf die Zelle Aktive Build-Variante und wähle die gewünschte Variante aus dem Listenfeld aus.
Projekte mit nativem/C++-Code
Bei Projekten mit nativem/C++-Code hat der Bereich Build-Varianten drei Spalten: Modul, Aktive Build-Variante und Aktive ABI, wie in Abbildung 2 dargestellt.

Der Wert Aktive Build-Variante für das Modul bestimmt die Build-Variante, die bereitgestellt wird und im Editor sichtbar ist. Bei nativen Modulen bestimmt der Wert Aktive ABI die ABI, die der Editor verwendet, hat aber keine Auswirkungen auf die Bereitstellung.
So ändern Sie den Build-Typ oder das ABI:
- Klicken Sie auf die Zelle für die Spalte Aktive Build-Variante oder Aktive ABI.
- Wähle die gewünschte Variante oder ABI aus dem Listenfeld aus. Eine neue Synchronisierung wird automatisch ausgeführt.
Wenn Sie eine der beiden Spalten für ein App- oder Bibliotheksmodul ändern, wird die Änderung auf alle abhängigen Zeilen angewendet.
Versionsverwaltung konfigurieren
Wenn Gradle mehrere APKs generiert, haben diese standardmäßig dieselben Versionsinformationen, wie in der Datei build.gradle oder build.gradle.kts auf Modulebene angegeben. Da im Google Play Store nicht mehrere APKs für dieselbe App mit denselben Versionsinformationen zulässig sind, müssen Sie dafür sorgen, dass jede APK einen eindeutigen versionCode hat, bevor Sie sie in den Play Store hochladen.
Sie können die Datei build.gradle auf Modulebene so konfigurieren, dass die versionCode für jedes APK überschrieben wird. Wenn Sie eine Zuordnung erstellen, die jeder ABI, für die Sie mehrere APKs konfigurieren, einen eindeutigen numerischen Wert zuweist, können Sie den Versionscode der Ausgabe mit einem Wert überschreiben, der den im Block defaultConfig oder productFlavors definierten Versionscode mit dem der ABI zugewiesenen numerischen Wert kombiniert.
Im folgenden Beispiel erhält das APK für das ABI x86 den versionCode 2004 und das ABI x86_64 den versionCode 3004.
Wenn du Versionscodes in großen Schritten wie 1.000 zuweist, kannst du später eindeutige Versionscodes zuweisen, wenn du deine App aktualisieren musst. Wenn beispielsweise defaultConfig.versionCode in einem nachfolgenden Update auf 5 erhöht wird, weist Gradle dem x86-APK einen versionCode von 2005 und dem x86_64-APK einen versionCode von 3005 zu.
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)) } } } }
Weitere Beispiele für alternative Versionscodeschemas findest du unter Versionscodes zuweisen.
Mehrere APKs erstellen
Nachdem Sie die Datei build.gradle oder build.gradle.kts auf Modulebene für die Erstellung mehrerer APKs konfiguriert haben, klicken Sie auf Build > Build APK, um alle APKs für das aktuell ausgewählte Modul im Bereich Project zu erstellen. Gradle erstellt die APKs für jede ABI im Verzeichnis build/outputs/apk/ des Projekts.
Gradle erstellt ein APK für jede ABI, für die Sie mehrere APKs konfigurieren.
Mit dem folgenden build.gradle-Snippet können Sie beispielsweise mehrere APKs für die ABIs x86 und x86_64 erstellen:
Groovy
... splits { abi { enable true reset() include "x86", "x86_64" } }
Kotlin
... splits { abi { isEnable = true reset() include("x86", "x86_64") } }
Die Ausgabe der Beispielkonfiguration enthält die folgenden vier APKs:
app-X86-release.apk: Enthält Code und Ressourcen für dasx86-ABI.app-X86_64-release.apk: Enthält Code und Ressourcen für dasx86_64-ABI.
Wenn Sie mehrere APKs basierend auf der ABI erstellen, generiert Gradle nur dann ein APK, das Code und Ressourcen für alle ABIs enthält, wenn Sie universalApk true im Block splits.abi in Ihrer build.gradle-Datei (für Groovy) oder isUniversalApk = true im Block splits.abi in Ihrer build.gradle.kts-Datei (für Kotlin-Script) angeben.
Format des APK-Dateinamens
Wenn Sie mehrere APKs erstellen, generiert Gradle APK-Dateinamen nach dem folgenden Schema:
modulename-ABI-buildvariant.apk
Die Komponenten des Schemas sind:
modulename- Gibt den Namen des Moduls an, das erstellt wird.
ABI- Wenn mehrere APKs für ABI aktiviert sind, wird das ABI für das APK angegeben, z. B.
x86. buildvariant- Gibt die Build-Variante an, die erstellt wird, z. B.
debug.