Build konfigurieren

Das Android-Build-System kompiliert App-Ressourcen und Quellcode und verpackt sie in APKs oder Android App Bundles, die Sie testen, bereitstellen, signieren und verteilen können.

In den Artikeln Gradle-Build – Übersicht und Android-Build-Struktur haben wir die Build-Konzepte und die Struktur einer Android-App besprochen. Jetzt ist es an der Zeit, den Build zu konfigurieren.

Glossar zu Android-Builds

Mit Gradle und dem Android Gradle-Plug-in können Sie die folgenden Aspekte Ihres Builds konfigurieren:

Build-Typen

Buildtypen definieren bestimmte Eigenschaften, die Gradle beim Erstellen und Verpacken Ihrer App verwendet. Buildtypen werden in der Regel für verschiedene Phasen des Entwicklungszyklus konfiguriert.

Beispielsweise werden beim Debug-Build-Typ Debug-Optionen aktiviert und die App mit dem Debug-Schlüssel signiert. Beim Release-Build-Typ kann die App für den Vertrieb verkleinert, verschleiert und mit einem Release-Schlüssel signiert werden.

Sie müssen mindestens einen Build-Typ definieren, um Ihre App zu erstellen. In Android Studio werden standardmäßig die Build-Typen „Debug“ und „Release“ erstellt. Wenn Sie die Verpackungseinstellungen für Ihre App anpassen möchten, erfahren Sie hier, wie Sie Buildtypen konfigurieren.

Produktvarianten
Produktvarianten stellen verschiedene Versionen Ihrer App dar, die Sie Nutzern anbieten können, z. B. kostenlose und kostenpflichtige Versionen. Sie können Produktvarianten anpassen, um anderen Code und andere Ressourcen zu verwenden, während Sie die Teile, die für alle Versionen Ihrer App gemeinsam sind, teilen und wiederverwenden. Produktvarianten sind optional und müssen manuell erstellt werden. Wenn Sie verschiedene Versionen Ihrer App erstellen möchten, können Sie hier erfahren, wie Sie Produktvarianten konfigurieren.
Build-Varianten
Eine Buildvariante ist ein produktübergreifender Buildtyp und eine Produktvariante und ist die Konfiguration, die Gradle zum Erstellen Ihrer App verwendet. Mit Buildvarianten können Sie während der Entwicklung die Debugversion Ihrer Produktvarianten und signierte Releaseversionen Ihrer Produktvarianten für den Vertrieb erstellen. Sie konfigurieren Build-Varianten zwar nicht direkt, aber die Build-Typen und Produktvarianten, aus denen sie bestehen. Wenn Sie zusätzliche Buildtypen oder Produktvarianten erstellen, werden auch zusätzliche Buildvarianten erstellt. Informationen zum Erstellen und Verwalten von Buildvarianten finden Sie in der Übersicht Buildvarianten konfigurieren.
Manifesteinträge
Sie können Werte für einige Eigenschaften der Manifestdatei in der Buildvariantenkonfiguration angeben. Diese Build-Werte überschreiben die vorhandenen Werte in der Manifestdatei. Das ist hilfreich, wenn Sie mehrere Varianten Ihrer App mit einem anderen Anwendungsnamen, einer anderen Mindest-SDK-Version oder einer anderen SDK-Zielversion generieren möchten. Wenn mehrere Manifeste vorhanden sind, werden die Manifesteinstellungen mit dem Tool zum Zusammenführen von Manifesten zusammengeführt.
Abhängigkeiten
Das Build-System verwaltet Projektabhängigkeiten aus Ihrem lokalen Dateisystem und aus Remote-Repositories. Sie müssen also nicht manuell nach Binärpaketen Ihrer Abhängigkeiten suchen, sie herunterladen und in Ihr Projektverzeichnis kopieren. Weitere Informationen finden Sie unter Build-Abhängigkeiten hinzufügen.
Unterzeichnung
Mit dem Build-System können Sie Signatureinstellungen in der Build-Konfiguration angeben. Außerdem kann Ihre App während des Build-Prozesses automatisch signiert werden. Das Build-System signiert die Debugversion mit einem Standardschlüssel und einem Zertifikat mit bekannten Anmeldedaten, um eine Passwortaufforderung beim Build zu vermeiden. Das Build-System signiert die Release-Version nur, wenn Sie explizit eine Signaturkonfiguration für diesen Build definieren. Wenn Sie keinen Release-Schlüssel haben, können Sie einen generieren, wie unter App signieren beschrieben. Signierte Release-Builds sind für den Vertrieb von Apps über die meisten App-Shops erforderlich.
Code- und Ressourcenkomprimierung
Mit dem Build-System können Sie für jede Build-Variante eine andere ProGuard-Regelndatei angeben. Beim Erstellen Ihrer App wendet das Build-System die entsprechenden Regeln an, um mithilfe der integrierten Komprimierungstools wie R8 Ihren Code und Ihre Ressourcen zu komprimieren. Wenn Sie Ihren Code und Ihre Ressourcen verkleinern, können Sie die Größe Ihres APK oder AAB verringern.
Unterstützung für mehrere APKs
Mit dem Build-System können Sie automatisch verschiedene APKs erstellen, die jeweils nur den Code und die Ressourcen enthalten, die für eine bestimmte Bildschirmdichte oder Application Binary Interface (ABI) erforderlich sind. Weitere Informationen finden Sie unter Mehrere APKs erstellen. Wir empfehlen jedoch, ein einzelnes AAB zu veröffentlichen, da es neben der Bildschirmdichte und dem ABI auch eine Aufteilung nach Sprache bietet und Sie nicht mehrere Artefakte bei Google Play hochladen müssen. Alle neuen Apps, die nach August 2021 eingereicht werden, müssen AABs verwenden.

Java-Versionen in Android-Builds

Unabhängig davon, ob Ihr Quellcode in Java, Kotlin oder in beiden Sprachen geschrieben ist, müssen Sie an mehreren Stellen eine JDK- oder Java-Sprachversion für Ihren Build auswählen. Weitere Informationen finden Sie unter Java-Versionen in Android-Builds.

Build-Konfigurationsdateien

Wenn Sie benutzerdefinierte Build-Konfigurationen erstellen möchten, müssen Sie Änderungen an einer oder mehreren Build-Konfigurationsdateien vornehmen. In diesen Textdateien wird mit einer domänenspezifischen Sprache (DSL) die Buildlogik mit Kotlin-Script beschrieben und manipuliert. Kotlin-Script ist eine Variante der Kotlin-Programmiersprache. Sie können Ihre Builds auch mit Groovy konfigurieren, einer dynamischen Sprache für die Java Virtual Machine (JVM).

Sie müssen kein Kotlin-Script oder Groovy beherrschen, um mit der Konfiguration Ihres Builds zu beginnen, da das Android Gradle-Plug-in die meisten benötigten DSL-Elemente enthält. Weitere Informationen zur Android Gradle Plugin DSL finden Sie in der DSL-Referenzdokumentation. Kotlin-Scripts basieren auch auf der zugrunde liegenden Gradle Kotlin DSL.

Wenn Sie ein neues Projekt starten, erstellt Android Studio automatisch einige dieser Dateien für Sie und füllt sie mit sinnvollen Standardwerten aus. Eine Übersicht über die erstellten Dateien finden Sie unter Android-Build-Struktur.

Die Gradle-Wrapper-Datei

Der Gradle-Wrapper (gradlew) ist eine kleine Anwendung, die im Quellcode enthalten ist und Gradle selbst herunterlädt und startet. Dadurch wird die Build-Ausführung einheitlicher. Entwickler laden die Anwendungsquelle herunter und führen gradlew aus. Dadurch wird die erforderliche Gradle-Distribution heruntergeladen und Gradle gestartet, um Ihre Anwendung zu erstellen.

Die Datei gradle/wrapper/gradle-wrapper.properties enthält die Property distributionUrl, die beschreibt, welche Gradle-Version zum Ausführen des Builds verwendet wird.

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

Die Gradle-Einstellungendatei

Die Datei settings.gradle.kts (für die Kotlin-DSL) oder settings.gradle (für die Groovy-DSL) befindet sich im Stammverzeichnis des Projekts. In dieser Datei werden Repository-Einstellungen auf Projektebene definiert und Gradle wird mitgeteilt, welche Module beim Erstellen Ihrer App eingeschlossen werden sollen. Bei Projekten mit mehreren Modulen muss jedes Modul angegeben werden, das in den endgültigen Build aufgenommen werden soll.

Bei den meisten Projekten sieht die Datei standardmäßig so aus:

Kotlin

pluginManagement {

    /**
      * The pluginManagement.repositories block configures the
      * repositories Gradle uses to search or download the Gradle plugins and
      * their transitive dependencies. Gradle pre-configures support for remote
      * repositories such as JCenter, Maven Central, and Ivy. You can also use
      * local repositories or define your own remote repositories. Here we
      * define the Gradle Plugin Portal, Google's Maven repository,
      * and the Maven Central Repository as the repositories Gradle should use to look for its
      * dependencies.
      */

    repositories {
        gradlePluginPortal()
        google()
        mavenCentral()
    }
}
dependencyResolutionManagement {

    /**
      * The dependencyResolutionManagement.repositories
      * block is where you configure the repositories and dependencies used by
      * all modules in your project, such as libraries that you are using to
      * create your application. However, you should configure module-specific
      * dependencies in each module-level build.gradle file. For new projects,
      * Android Studio includes Google's Maven repository and the Maven Central
      * Repository by default, but it does not configure any dependencies (unless
      * you select a template that requires some).
      */

  repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
  repositories {
      google()
      mavenCentral()
  }
}
rootProject.name = "My Application"
include(":app")

Groovy

pluginManagement {

    /**
      * The pluginManagement.repositories block configures the
      * repositories Gradle uses to search or download the Gradle plugins and
      * their transitive dependencies. Gradle pre-configures support for remote
      * repositories such as JCenter, Maven Central, and Ivy. You can also use
      * local repositories or define your own remote repositories. Here we
      * define the Gradle Plugin Portal, Google's Maven repository,
      * and the Maven Central Repository as the repositories Gradle should use to look for its
      * dependencies.
      */

    repositories {
        gradlePluginPortal()
        google()
        mavenCentral()
    }
}
dependencyResolutionManagement {

    /**
      * The dependencyResolutionManagement.repositories
      * block is where you configure the repositories and dependencies used by
      * all modules in your project, such as libraries that you are using to
      * create your application. However, you should configure module-specific
      * dependencies in each module-level build.gradle file. For new projects,
      * Android Studio includes Google's Maven repository and the Maven Central
      * Repository by default, but it does not configure any dependencies (unless
      * you select a template that requires some).
      */

    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
    }
}
rootProject.name = "My Application"
include ':app'

Die Build-Datei auf oberster Ebene

Die Datei build.gradle.kts (für die Kotlin-DSL) oder build.gradle (für die Groovy-DSL) der obersten Ebene befindet sich im Stammverzeichnis des Projekts. Normalerweise werden hier die gängigen Versionen von Plug-ins definiert, die von den Modulen in Ihrem Projekt verwendet werden.

Im folgenden Codebeispiel werden die Standardeinstellungen und DSL-Elemente im übergeordneten Build-Script nach dem Erstellen eines neuen Projekts beschrieben:

Kotlin

plugins {

    /**
     * Use `apply false` in the top-level build.gradle file to add a Gradle
     * plugin as a build dependency but not apply it to the current (root)
     * project. Don't use `apply false` in sub-projects. For more information,
     * see Applying external plugins with same version to subprojects.
     */

    id("com.android.application") version "8.7.0" apply false
    id("com.android.library") version "8.7.0" apply false
    id("org.jetbrains.kotlin.android") version "2.0.20" apply false
}

Groovy

plugins {

    /**
     * Use `apply false` in the top-level build.gradle file to add a Gradle
     * plugin as a build dependency but not apply it to the current (root)
     * project. Don't use `apply false` in sub-projects. For more information,
     * see Applying external plugins with same version to subprojects.
     */

    id 'com.android.application' version '8.7.0' apply false
    id 'com.android.library' version '8.7.0' apply false
    id 'org.jetbrains.kotlin.android' version '2.0.20' apply false
}