Wersje Javy w kompilacjach Androida

Niezależnie od tego, czy kod źródłowy jest napisany w języku Java, Kotlin czy w obu tych językach, jest kilka miejsc, w których musisz wybrać język JDK lub Java dla swojej kompilacji.

Omówienie relacji JDK w kompilacji Gradle

Słowniczek

Pakiet Java Development Kit (JDK)
Pakiet Java Development Kit (JDK) zawiera:
    .
  • narzędzia, takie jak kompilator, profiler i twórca archiwów; Są one wykorzystywane w tle podczas tworzenia utworzyć aplikację.
  • Biblioteki zawierające interfejsy API, które można wywoływać z poziomu Kod źródłowy Kotlin lub Java. Pamiętaj, że nie wszystkie funkcje są na Androida.
  • czyli Java Virtual Machine (JVM, Java Virtual Machine), czyli interpretatorze wykonywania operacji Aplikacje w Javie. Do uruchamiania środowiska Android Studio IDE używasz maszyny JVM. oraz narzędzia do kompilacji Gradle. JVM nie jest używany na Androidzie z urządzeniami lub emulatorami.
Środowisko wykonawcze JetBrains (JBR)
Środowisko wykonawcze JetBrains (JBR) to ulepszony pakiet JDK rozpowszechniany w Android Studio. Zawiera kilka optymalizacji do wykorzystania w Studio i powiązanych JetBrains z usług Google, ale możesz też używać ich do uruchamiania innych aplikacji w Javie.

Jak wybrać pakiet JDK do uruchamiania Android Studio?

Do uruchamiania Android Studio zalecamy używanie JBR. Wdrożono oraz używane do testowania środowiska Android Studio. Zawiera również usprawnienia pozwalające uzyskać optymalny efekt wykorzystanie Android Studio. Aby mieć pewność, że tak jest, nie ustawiaj STUDIO_JDK zmiennej środowiskowej.

Skrypty startowe Android Studio szukają JVM w: zamówienie:

  1. STUDIO_JDK zmienna środowiskowa
  2. Katalog studio.jdk (w dystrybucji Android Studio)
  3. Katalog jbr (środowisko wykonawcze JetBrains) w Android Studio dystrybucji danych. Zalecane.
  4. JDK_HOME zmienna środowiskowa
  5. JAVA_HOME zmienna środowiskowa
  6. Plik wykonywalny java w zmiennej środowiskowej PATH

Jak wybrać pakiet JDK uruchamiający moje kompilacje Gradle?

Jeśli uruchomisz Gradle za pomocą przycisków w Android Studio, pakiet JDK ustawiony w Do uruchamiania Gradle służą ustawienia Android Studio. Jeśli uruchomisz Gradle w terminalu, w Android Studio lub poza nim, zmienna środowiskowa JAVA_HOME (jeśli jest ustawiony) określa, który pakiet JDK uruchamia skrypty Gradle. Jeśli JAVA_HOME nie jest ustawiona, używa polecenia java w środowisku PATH .

Aby uzyskać najdokładniejsze wyniki, skonfiguruj JAVA_HOME zmienną środowiskową oraz Konfiguracja Gradle JDK w Android Studio JDK.

Podczas uruchamiania kompilacji Gradle tworzy proces nazywany demonem, i wykonaj rzeczywistą kompilację. Można go użyć ponownie, pod warunkiem, że kompilacje używają tej samej wersji pakietu JDK i Gradle. Ponowne wykorzystywanie demon skraca czas uruchamiania nowej maszyny JVM i inicjowania systemu kompilacji.

Jeśli rozpoczniesz kompilacje z różnymi wersjami pakietu JDK lub Gradle, demony, co zużywają więcej CPU i pamięci.

Konfiguracja Gradle JDK w Android Studio

Aby zmodyfikować konfigurację pakietu Gradle JDK w istniejącym projekcie, otwórz narzędzie Gradle ustawienia w menu Plik (lub w aplikacji Android Studio w systemie macOS) > Ustawienia > Kompilacja, wykonanie, wdrożenie > Narzędzia do tworzenia > Gradle. JDK Gradle menu zawiera następujące opcje do wyboru:

  • Makra, np. JAVA_HOME i GRADLE_LOCAL_JAVA_HOME
  • Wpisy w tabeli JDK w formacie vendor-version, np. jbr-17, które są przechowywane w plikach konfiguracji Androida,
  • Pobieranie pakietu JDK
  • Dodawanie określonego pakietu JDK
  • Pliki JDK wykryte lokalnie w domyślnej instalacji pakietu JDK systemu operacyjnego katalog

Wybrana opcja jest przechowywana w opcji gradleJvm w: .idea/gradle.xml projektu, a rozdzielczość ścieżki JDK jest używana do uruchamiania Gradle w przypadku uruchamiania przez Android Studio.

Rysunek 1. Ustawienia Gradle JDK w Android Studio.

Te makra umożliwiają wybór ścieżki JDK w projekcie dynamicznym:

  • JAVA_HOME: używa zmiennej środowiskowej o tej samej nazwie
  • GRADLE_LOCAL_JAVA_HOME: używa właściwości java.home w .gradle/config.properties, które domyślnie jest środowiskiem wykonawczym JetBrains.

Wybrany pakiet JDK jest używany do uruchamiania kompilacji Gradle i rozwiązywania problemów interfejsu API JDK podczas edytowania skryptów kompilacji i kodu źródłowego. Pamiętaj, że parametr compileSdk spowoduje dalsze ograniczenie liczby symboli Java, które będą dostępne podczas edytowania i tworzenia kodu źródłowego.

Wybierz wersję pakietu JDK wyższą lub równą tej wersji pakietu wersji używanych przez wtyczki używane w kompilacji Gradle. Aby określić minimalnej wymaganej wersji JDK dla wtyczki Androida do obsługi Gradle (AGP), zapoznaj się z tabeli zgodności w informacjach o wersji.

Na przykład wtyczka Androida do obsługi Gradle w wersji 8.x wymaga pakietu JDK 17. Jeśli spróbujesz uruchomić kompilację Gradle, która z niej korzysta, z wcześniejszą wersją pakiet JDK zgłasza komunikat podobny do tego:

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`.

Których interfejsów API w Javie mogę używać w kodzie źródłowym Java lub Kotlin?

Aplikacja na Androida może używać niektórych interfejsów API zdefiniowanych w JDK, ale nie wszystkich z nich. Pakiet Android SDK definiuje implementacje wielu funkcji biblioteki Java w ramach dostępnych interfejsów API. Właściwość compileSdk określa, które Wersja pakietu SDK na Androida, która ma być używana podczas kompilowania kodu źródłowego Kotlin lub Java.

Kotlin

android {
    ...
    compileSdk = 33
}

Odlotowe

android {
    ...
    compileSdk 33
}

Każda wersja Androida obsługuje konkretną wersję pakietu JDK oraz podzbiór dostępnych interfejsów API Java. Jeśli używasz interfejsu API Java, który jest dostępny element compileSdk niedostępny w określonym minSdk, możesz mieć możliwość skorzystania z interfejsu API we wcześniejszej wersji Androida za pomocą procesu znanego jako desugaring. Informacje o obsługiwanych znajdziesz w artykule o interfejsach API Java 11+ dostępnych w ramach desugaringu. API.

Z tej tabeli dowiesz się, która wersja Javy jest obsługiwana przez poszczególnych interfejsów API Androida oraz gdzie znaleźć szczegółowe informacje na temat dostępnych interfejsów API Java.

Android Java Obsługiwane funkcje interfejsu API i języków
14 (API 34) 17 Biblioteki podstawowe
13 (API 33) 11 Biblioteki podstawowe
12 (API 32) 11 Interfejs Java API
11 i mniej Wersje Androida

Który pakiet JDK kompiluje mój kod źródłowy w Javie?

Plik JDK łańcucha narzędzi Java zawiera kompilator Java używany do kodu źródłowego. Ten pakiet JDK uruchamia także testy javadoc i testy jednostkowe podczas kompilacji.

Domyślnym łańcuchem narzędzi jest pakiet JDK użyty do uruchomienia Gradle. Jeśli używasz domyślnej i uruchomisz kompilację na różnych komputerach (np. na komputerze lokalnym osobnego serwera ciągłej integracji), wyniki kompilacji może różnić się w zależności od wersji pakietu JDK.

Aby utworzyć bardziej spójną kompilację, możesz bezpośrednio określić Wersja łańcucha narzędzi Java. Określenie:

  • Lokalizuje zgodny pakiet JDK w systemie, w którym uruchamiana jest kompilacja.
    • Jeśli nie istnieje zgodny plik JDK (i został zdefiniowany resolver łańcucha narzędzi), pobiera jedną.
  • Udostępnia interfejsy API w Javie dla łańcucha narzędzi dla wywołań kodu źródłowego.
  • Kompiluje źródło w Javie z użyciem jej wersji językowej.
  • Domyślne ustawienia zasobów reklamowych dla sourceCompatibility i targetCompatibility

Zalecamy zawsze określać łańcuch narzędzi Java i upewnić się, że zainstalowany jest określony pakiet JDK lub dodaj narzędzie do rozpoznawania łańcucha narzędzi w Twoją budowę.

Możesz określić łańcuch narzędzi, jeśli Twój kod źródłowy jest napisany w Javie, Kotlin, albo jedno i drugie. Określ łańcuch narzędzi na najwyższym poziomie modułu build.gradle(.kts).

Określ wersję łańcucha narzędzi Java w ten sposób:

Kotlin

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

Odlotowe

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

Sprawdza się to, jeśli źródłem jest Kotlin lub Java albo ich kombinacja.

Wersja łańcucha narzędzi dla pakietu JDK może być taka sama jak wersja pakietu JDK używanego do uruchamiania Gradle, ale pamiętaj, że służą one różnym celom.

Których funkcji źródłowych języka Java mogę używać w moim kodzie źródłowym Java?

Właściwość sourceCompatibility określa, które funkcje języka Java są dostępne podczas kompilacji źródła w języku Java. Nie ma wpływu na źródło Kotlin.

Jeśli nie podasz żadnej wartości, domyślnie zostanie użyty łańcuch narzędzi Java lub Pakiet JDK był używany do uruchamiania Gradle. Zalecamy, aby zawsze jednoznacznie określać łańcuch narzędzi (preferowane) lub sourceCompatibility.

Określ sourceCompatibility w pliku build.gradle(.kts) modułu.

Kotlin

android {
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_17
    }
}

Odlotowe

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_17
    }
}

Jakich funkcji binarnych w Javie można używać podczas skompilowania kodu źródłowego w języku Kotlin lub Javy?

Określenie targetCompatibility i jvmTarget określa środowisko Java wersja formatu klasy używana do generowania kodu bajtowego na potrzeby skompilowanego języka Java i Kotlin źródła.

Niektóre funkcje Kotlin istniały przed dodaniem równoważnych funkcji w Javie. Wcześni kompilatory Kotlin musiały opracować własny sposób, aby przedstawić funkcje zabezpieczeń. Niektóre z tych funkcji zostały później dodane do Javy. W przypadku późniejszych poziomów jvmTarget kompilator Kotlin może bezpośrednio używać na Javie, co może poprawić wydajność.

targetCompatibility przyjmuje domyślnie taką samą wartość jak sourceCompatibility, ale jeśli została określona, musi być większa lub równa sourceCompatibility.

jvmTarget domyślnie używa wersji toolchain.

Różne wersje Androida obsługują różne wersje języka Java. Dostępne opcje korzystać z dodatkowych funkcji języka Java dzięki zwiększeniu targetCompatibility i jvmTarget, ale może to Cię wymagać także zwiększ minimalną wersję pakietu SDK na Androida, gdy ta funkcja jest dostępna.

Kotlin

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

Odlotowe

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