Java-Versionen in Android-Builds

Unabhängig davon, ob Ihr Quellcode in Java, Kotlin oder beidem geschrieben ist, Es gibt mehrere Stellen, an denen Sie die Sprache JDK oder Java auswählen müssen Version für Ihren Build.

Übersicht über JDK-Beziehungen in einem Gradle-Build

Glossar

Java Development Kit (JDK)
Das Java Development Kit (JDK) enthält: <ph type="x-smartling-placeholder">
    </ph>
  • Tools wie Compiler, Profiler und Archiversteller. Sie werden im Hintergrund während des Builds eingesetzt, erstellen Sie Ihre Anwendung.
  • Bibliotheken mit APIs, die Sie über Ihr Kotlin- oder Java-Quellcode. Beachten Sie, dass nicht alle Funktionen für Android verfügbar.
  • Die Java Virtual Machine (JVM), ein Interpreter, der Java-Anwendungen. Sie verwenden die JVM, um die Android Studio IDE auszuführen. und das Build-Tool Gradle. Die JVM wird unter Android nicht verwendet. Geräten oder Emulatoren.
JetBrains-Laufzeit (JBR)
Die JetBrains-Laufzeit (JBR) ist ein optimiertes JDK, das mit Android Studio bereitgestellt wird. Es enthält mehrere Optimierungen für die Verwendung in Studio und verwandten JetBrains. -Produkte, kann aber auch zum Ausführen anderer Java-Anwendungen verwendet werden.

Wie wähle ich ein JDK für die Ausführung von Android Studio aus?

Wir empfehlen die Verwendung von JBR, um Android Studio auszuführen. Es ist bereitgestellt und zum Testen von Android Studio verwendet. Außerdem enthält es Verbesserungen für optimale Nutzung von Android Studio Legen Sie zu diesem Zweck STUDIO_JDK nicht fest Umgebungsvariable ein.

Die Startskripts für Android Studio suchen wie folgt nach einer JVM: Auftrag:

  1. Umgebungsvariable STUDIO_JDK
  2. Verzeichnis studio.jdk (in der Android Studio-Distribution)
  3. Verzeichnis jbr (JetBrains-Laufzeit) in Android Studio Verteilung. Empfohlen.
  4. Umgebungsvariable JDK_HOME
  5. Umgebungsvariable JAVA_HOME
  6. java in der Umgebungsvariable PATH ausführbar

Wie wähle ich aus, mit welchem JDK meine Gradle-Builds ausgeführt werden?

Wenn Sie Gradle über die Schaltflächen in Android Studio ausführen, wird das JDK im Zum Ausführen von Gradle werden die Android Studio-Einstellungen verwendet. Wenn Sie Gradle in einem Terminal ausführen, entweder innerhalb oder außerhalb von Android Studio, die Umgebungsvariable JAVA_HOME (falls festgelegt) bestimmt, welches JDK die Gradle-Skripts ausführt. Wenn JAVA_HOME nicht festgelegt ist, wird der Befehl java in Ihrer PATH-Umgebung verwendet. .

Die besten Ergebnisse erzielst du, wenn du JAVA_HOME festlegst Umgebungsvariable und Gradle JDK-Konfiguration in Android Studio JDK.

Beim Ausführen Ihres Builds erstellt Gradle einen Prozess, der als Daemon bezeichnet wird. um den eigentlichen Build auszuführen. Dieser Prozess kann wiederverwendet werden, Voraussetzung ist, dass die Builds dieselbe JDK- und Gradle-Version verwenden. Wiederverwenden ein Daemon reduziert die Zeit für den Start einer neuen JVM und die Initialisierung des Build-Systems.

Wenn Sie Builds mit verschiedenen JDKs oder Gradle-Versionen starten, werden zusätzliche Daemons erstellt werden und mehr CPU und Arbeitsspeicher verbrauchen.

Gradle-JDK-Konfiguration in Android Studio

Wenn Sie die Gradle-JDK-Konfiguration des vorhandenen Projekts ändern möchten, öffnen Sie die Gradle- unter Datei (oder Android Studio unter macOS) > Einstellungen > Build, Ausführung, Bereitstellung > Build-Tools > Gradle Das Gradle JDK die folgenden Optionen zur Auswahl:

  • Makros wie JAVA_HOME und GRADLE_LOCAL_JAVA_HOME
  • JDK-Tabelleneinträge im vendor-version-Format wie jbr-17, die gespeichert werden in den Android-Konfigurationsdateien
  • JDK herunterladen
  • Bestimmtes JDK hinzufügen
  • Lokal erkannte JDKs aus der Standard-JDK-Installation des Betriebssystems Verzeichnis

Die ausgewählte Option wird in der Option gradleJvm gespeichert in .idea/gradle.xml des Projekts erstellt und seine JDK-Pfadauflösung über Android Studio gestartet.

<ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder">
</ph> Abbildung 1: Gradle JDK-Einstellungen in Android Studio

Die Makros ermöglichen die Auswahl des dynamischen JDK-Projekts für das Projekt:

  • JAVA_HOME: verwendet die gleichnamige Umgebungsvariable
  • GRADLE_LOCAL_JAVA_HOME: verwendet das Attribut java.home in Die Datei .gradle/config.properties, die standardmäßig die JetBrains-Laufzeit verwendet.

Das ausgewählte JDK wird verwendet, um Ihren Gradle-Build auszuführen und die JDK API aufzulösen wenn Sie Ihre Build-Skripts und Ihren Quellcode bearbeiten. Das Feld compileSdk definiert, wird weiter eingeschränkt, welche Java-Symbole wenn Sie Ihren Quellcode bearbeiten und erstellen.

Wählen Sie eine JDK-Version aus, die höher als das JDK ist oder diesem entspricht Versionen von Plug-ins, die Sie in Ihrem Gradle-Build verwenden. Um die mindestens erforderliche JDK-Version für das Android-Gradle-Plug-in (AGP), siehe die in den Versionshinweisen.

Für das Android-Gradle-Plug-in Version 8.x ist beispielsweise JDK 17 erforderlich. Wenn Sie versuchen, einen Gradle-Build auszuführen, der ihn mit einer früheren Version von wird eine Meldung wie die folgende gemeldet:

An exception occurred applying plugin request [id: 'com.android.application']
> Failed to apply plugin 'com.android.internal.application'.
   > Android Gradle plugin requires Java 17 to run. You are currently using Java 11.
      Your current JDK is located in /usr/local/buildtools/java/jdk11
      You can try some of the following options:
       - changing the IDE settings.
       - changing the JAVA_HOME environment variable.
       - changing `org.gradle.java.home` in `gradle.properties`.

Welche Java APIs kann ich in meinem Java- oder Kotlin-Quellcode verwenden?

Eine Android-App kann einige der in einem JDK definierten APIs verwenden, aber nicht alle von ihnen. Das Android SDK definiert Implementierungen vieler Java-Bibliotheksfunktionen. als Teil der verfügbaren APIs. Mit der Eigenschaft compileSdk wird angegeben, Android SDK-Version, die beim Kompilieren des Kotlin- oder Java-Quellcodes verwendet werden soll.

Kotlin

android {
    ...
    compileSdk = 33
}

Cool

android {
    ...
    compileSdk 33
}

Jede Version von Android unterstützt eine bestimmte Version des JDK und einen Teil der ihre verfügbaren Java-APIs. Wenn Sie ein Java-API verwenden, das in einen compileSdk, der im angegebenen Feld nicht verfügbar ist minSdk, können Sie möglicherweise die API verwenden. in der früheren Android-Version durch einen Prozess, der Entzuckerung. Unterstützte APIs für Java 11 und höher, die über die Entugarierung verfügbar sind, finden Sie hier. APIs

Ermitteln Sie anhand dieser Tabelle, welche Java-Version von jeder Android-API und wo Sie Details zu den verfügbaren Java-APIs finden können.

Android Java Unterstützte API- und Sprachfunktionen
14 (API 34) 17 Kernbibliotheken
13 (API 33) 11 Kernbibliotheken
12 (API 32) 11 Java API
11 und niedriger Android-Versionen

Welches JDK kompiliert meinen Java-Quellcode?

Das JDK für die Java-Toolchain enthält den Java-Compiler, der zum Kompilieren von Java verwendet wird. Quellcode verfügbar. Dieses JDK führt während des Builds auch javadoc und Unittests aus.

Die Toolchain verwendet standardmäßig das JDK, das zum Ausführen von Gradle verwendet wird. Wenn Sie die Standardeinstellung und führen Sie einen Build auf verschiedenen Rechnern aus (zum Beispiel auf Ihrem lokalen Computer und separater Continuous Integration-Server), werden die Ergebnisse Ihres Builds können abweichen, wenn verschiedene JDK-Versionen verwendet werden.

Wenn Sie einen einheitlicheren Build erstellen möchten, können Sie explizit einen Version der Java-Toolchain. Angabe:

  • Ermittelt ein kompatibles JDK auf dem System, auf dem der Build ausgeführt wird.
    • Wenn kein kompatibles JDK vorhanden und ein Toolchain-Resolver definiert ist, lädt eines herunter.
  • Stellt die Java-APIs der Toolchain für Aufrufe aus dem Quellcode bereit.
  • Kompiliert die Java-Quelle mit ihrer Java-Sprachversion.
  • Enthält Standardeinstellungen für sourceCompatibility und targetCompatibility

Wir empfehlen, immer die Java-Toolchain anzugeben und entweder das angegebene JDK installiert ist, oder ein Toolchain-Resolver zu Ihrem Build hinzufügen.

Sie können die Toolchain angeben, unabhängig davon, ob Ihr Quellcode in Java, Kotlin oder beides enthält. Geben Sie die Toolchain auf der obersten Ebene des Moduls an build.gradle(.kts)-Datei.

Geben Sie die Version der Java-Toolchain so an:

Kotlin

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(17)
    }
}

Cool

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(17)
    }
}

Das funktioniert, wenn Sie Kotlin, Java oder eine Kombination aus beidem verwenden.

Die JDK-Version der Toolchain kann mit dem JDK identisch sein, das zum Ausführen von Gradle verwendet wird, aber denken Sie daran, dass sie unterschiedlichen Zwecken dienen.

Welche Quellfunktionen für die Java-Sprache kann ich in meinem Java-Quellcode verwenden?

Das Attribut sourceCompatibility bestimmt, welche Java-Sprachfunktionen während der Kompilierung der Java-Quelle verfügbar sind. Dies hat keine Auswirkungen auf die Kotlin-Quelle.

Wenn keine Angabe erfolgt, wird standardmäßig die Java-Toolchain verwendet oder JDK, mit dem Gradle ausgeführt wurde. Wir empfehlen, dass Sie immer explizit eine Toolchain (bevorzugt) oder sourceCompatibility.

Geben Sie sourceCompatibility in der Datei build.gradle(.kts) Ihres Moduls an.

Kotlin

android {
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_17
    }
}

Cool

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_17
    }
}

Welche Binärfunktionen von Java können verwendet werden, wenn ich meinen Kotlin- oder Java-Quellcode kompiliere?

Durch Angabe von targetCompatibility und jvmTarget wird die Java- Klassenformatversion, die beim Generieren von Bytecode für kompiliertes Java und Kotlin verwendet wird Quelle bzw. Quelle.

Einige Kotlin-Funktionen existierten bereits, bevor entsprechende Java-Funktionen hinzugefügt wurden. Frühe Kotlin-Compiler mussten eine eigene Methode entwickeln, um diese Kotlin-Inhalte darzustellen. Funktionen. Einige dieser Funktionen wurden später zu Java hinzugefügt. Mit späteren jvmTarget-Levels kann der Kotlin-Compiler die Java-Funktion verwenden, was zu einer besseren Leistung führen kann.

targetCompatibility hat standardmäßig denselben Wert wie sourceCompatibility, muss aber größer oder gleich sourceCompatibility sein, falls angegeben.

jvmTarget verwendet standardmäßig die Version der Toolchain.

Verschiedene Versionen von Android unterstützen verschiedene Java-Versionen. Sie können zusätzliche Java-Funktionen nutzen, indem Sie targetCompatibility und jvmTarget. Möglicherweise müssen Sie aber auch erhöhen Sie Ihre Mindestversion des Android SDK, um sicherzugehen, die Funktion verfügbar ist.

Kotlin

android {
    compileOptions {
        targetCompatibility = JavaVersion.VERSION_17
    }
    kotlinOptions {
        jvmTarget = "17"
    }
}

Cool

android {
    compileOptions {
        targetCompatibility JavaVersion.VERSION_17
    }
    kotlinOptions {
        jvmTarget '17'
    }
}