Achtung:Seit August 2021 müssen alle neuen Apps als App-Bundles veröffentlicht werden. Wenn Sie Ihre App bei Google Play veröffentlichen, müssen Sie ein Android App Bundle erstellen und hochladen. In diesem Fall generiert und stellt Google Play automatisch optimierte APKs für die Gerätekonfigurationen der einzelnen Nutzer bereit, sodass diese nur den Code und die Ressourcen herunterladen, die sie zum Ausführen Ihrer App benötigen. Das Veröffentlichen mehrerer APKs ist nützlich, wenn Sie in einem Store veröffentlichen, der das AAB-Format nicht unterstützt. In diesem Fall müssen Sie jedes APK selbst erstellen, signieren und verwalten.
Es ist zwar besser, wenn Sie nach Möglichkeit ein einzelnes APK erstellen, um alle Zielgeräte zu unterstützen. Dies kann jedoch zu einem sehr großen APK führen, da Dateien mehrere Application Binary Interfaces (ABIs) unterstützen. Eine Möglichkeit, die Größe Ihres APKs zu reduzieren, besteht darin, mehrere APKs zu erstellen, die Dateien für bestimmte ABIs enthalten.
Mit Gradle können separate APKs erstellt werden, die nur Code und Ressourcen enthalten, die für die einzelnen ABIs 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 splits-Block einen abi-Block 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 Ihren splits-Block ein. Geben Sie im abi-Block eine Liste der gewünschten 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. Nur in Kombination mit dem
include-Element verwenden, 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.
-
include -
Gibt 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-Skript -
Wenn
true, generiert Gradle zusätzlich zu den APKs pro ABI 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 zuerst reset() verwendet, um mit einer leeren Liste von ABIs zu beginnen, gefolgt von include mit einer Liste von ABIs, für die jeweils ein APK erstellt wird.
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 enthält der Bereich Build-Varianten zwei Spalten: Modul und Aktive Build-Variante (siehe Abbildung 1).

Abbildung 1. Der Bereich Build-Varianten enthält zwei Spalten für Projekte ohne nativen/C++-Code.
Der Wert Active Build Variant (Aktive Build-Variante) für das Modul bestimmt die Build-Variante, die bereitgestellt und im Editor sichtbar ist. Wenn Sie zwischen Varianten wechseln möchten, klicken Sie für ein Modul auf die Zelle Aktive Build-Variante und wählen Sie die gewünschte Variante aus dem Listenfeld aus.
Projekte mit nativem/C++-Code
Bei Projekten mit nativem/C++-Code enthält der Bereich Build-Varianten drei Spalten: Modul, Aktive Build-Variante und Aktive ABI (siehe Abbildung 2).
Abbildung 2. Im Bereich Build-Varianten wird die Spalte Aktive ABI für Projekte mit nativem Code/C++-Code hinzugefügt.
Der Wert Active Build Variant (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 Active ABI die ABI, die vom Editor verwendet wird. Er hat jedoch keine Auswirkungen auf die Bereitstellung.
So ändern Sie den Build-Typ oder die ABI:
- Klicken Sie auf die Zelle für die Spalte Aktive Build-Variante oder Aktive ABI.
- Wählen Sie die gewünschte Variante oder ABI aus dem Listenfeld aus. Eine neue Synchronisierung wird automatisch ausgeführt.
Wenn Sie eine der Spalten für ein App- oder Bibliotheksmodul ändern, wird die Änderung auf alle abhängigen Zeilen angewendet.
Versionierung konfigurieren
Wenn Gradle mehrere APKs generiert, haben standardmäßig alle APKs dieselben Versionsinformationen, die in der build.gradle- oder build.gradle.kts-Datei auf Modulebene angegeben sind. Da im Google Play Store nicht mehrere APKs für dieselbe App mit denselben Versionsinformationen zulässig sind, muss jedes APK eine eindeutige
versionCode haben, bevor Sie es in den Play Store hochladen.
Sie können die Datei build.gradle auf Modulebene so konfigurieren, dass 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 Ausgabeversionscode mit einem Wert überschreiben, der den im defaultConfig- oder productFlavors-Block definierten Versionscode mit dem der ABI zugewiesenen numerischen Wert kombiniert.
Im folgenden Beispiel erhält das APK für die x86-ABI die versionCode 2004 und die x86_64-ABI die versionCode 3004.
Wenn Sie Versionscodes in großen Schritten zuweisen, z. B. 1.000, können Sie später eindeutige Versionscodes zuweisen, falls Sie Ihre App aktualisieren müssen. Wenn defaultConfig.versionCode bei einem späteren Update beispielsweise auf 5 inkrementiert wird, weist Gradle dem x86-APK den versionCode-Wert 2.005 und dem x86_64-APK den Wert 3.005 zu.
Tipp:Wenn Ihr Build ein universelles APK enthält, weisen Sie ihm einen versionCode zu, der niedriger ist als der aller anderen APKs.
Da im Google Play Store die Version Ihrer App installiert wird, die sowohl mit dem Zielgerät kompatibel ist als auch die höchste versionCode hat, wird durch Zuweisen einer niedrigeren versionCode zum universellen APK dafür gesorgt, dass im Google Play Store versucht wird, eines Ihrer APKs zu installieren, bevor auf das universelle APK zurückgegriffen wird. Im folgenden Beispielcode wird dies berücksichtigt, indem die Standard-versionCode eines universellen APKs nicht überschrieben wird.
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 finden Sie unter Versionscodes zuweisen.
Mehrere APKs erstellen
Nachdem Sie die build.gradle- oder build.gradle.kts-Datei 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 für jede ABI, für die Sie mehrere APKs konfigurieren, ein APK.
Mit dem folgenden build.gradle-Snippet können beispielsweise mehrere APKs für die ABIs x86 und x86_64 erstellt werden:
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 diex86-ABI.app-X86_64-release.apk: Enthält Code und Ressourcen für diex86_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 der Datei build.gradle (für Groovy) oder isUniversalApk = true im Block splits.abi in der Datei build.gradle.kts (für Kotlin-Skript) 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 die APK angegeben, z. B.
x86. -
buildvariant -
Gibt die Build-Variante an, die erstellt wird, z. B.
debug.