Android derlemelerindeki Java sürümleri

Kaynak kodunuz ister Java, ister Kotlin veya her ikisi dilinde yazılmış olsun, derlemeniz için bir JDK veya Java dili sürümü seçmeniz gereken birkaç yer vardır.

Gradle derlemesinde JDK ilişkilerine genel bakış

Sözlük

Java Geliştirme Kiti (JDK)
Java Geliştirme Kiti (JDK) şunları içerir:
  • Derleyici, profil oluşturucu ve arşiv oluşturucu gibi araçlar. Bunlar, derlemeniz sırasında uygulamanızı oluşturmak için arka planda kullanılır.
  • Kotlin veya Java kaynak kodunuzdan çağırabileceğiniz API'leri içeren kitaplıklar. Android'de tüm işlevlerin kullanılamadığını unutmayın.
  • Java uygulamalarını yürüten bir yorumlayıcı olan Java Sanal Makinesi (JVM). Android Studio IDE'yi ve Gradle derleme aracını çalıştırmak için JVM kullanırsınız. JVM, Android cihazlarda veya emülatörlerde kullanılmaz.
JetBrains Çalışma Zamanı (JBR)
JetBrains Runtime (JBR) , Android Studio ile dağıtılan geliştirilmiş bir JDK'dir. Studio ve ilgili JetBrains ürünlerinde kullanım için çeşitli optimizasyonlar içerir ancak diğer Java uygulamalarını çalıştırmak için de kullanılabilir.

Android Studio'yu çalıştıracak bir JDK'yı nasıl seçebilirim?

Android Studio'yu çalıştırmak için JBR'yi kullanmanızı öneririz. Android Studio ile birlikte dağıtılır ve test etmek için kullanılır ve Android Studio'nun optimum kullanımı için geliştirmeler içerir. Bunun için STUDIO_JDK ortam değişkenini ayarlamayın.

Android Studio için başlangıç komut dosyaları JVM'yi aşağıdaki sırayla arar:

  1. STUDIO_JDK ortam değişkeni
  2. studio.jdk dizini (Android Studio dağıtımında)
  3. jbr dizinini (JetBrains Runtime) ekler. Önerilen.
  4. JDK_HOME ortam değişkeni
  5. JAVA_HOME ortam değişkeni
  6. PATH ortam değişkeninde yürütülebilir java dosyası var

Gradle derlemelerimi hangi JDK'nin çalıştıracağını nasıl seçebilirim?

Gradle'ı Android Studio'daki düğmeleri kullanarak çalıştırırsanız Gradle'ı çalıştırmak için Android Studio ayarlarında ayarlanan JDK kullanılır. Gradle'ı Android Studio'nun içinde veya dışında bir terminalde çalıştırırsanız JAVA_HOME ortam değişkeni (ayarlanmışsa) hangi JDK'nın Gradle komut dosyalarını çalıştıracağını belirler. JAVA_HOME ayarlanmazsa PATH ortam değişkeninizde java komutunu kullanır.

En tutarlı sonuçlar için JAVA_HOME ortam değişkeninizi ve Android Studio'da Graadle JDK yapılandırmasını aynı JDK'ya ayarladığınızdan emin olun.

Gradle, derlemenizi çalıştırırken gerçek derlemeyi gerçekleştirmek için arka plan programı adı verilen bir işlem oluşturur. Derlemeler aynı JDK ve Gradle sürümünü kullandığı sürece bu işlem yeniden kullanılabilir. Arka plan programının yeniden kullanılması, yeni JVM başlatma ve derleme sistemini başlatma süresini kısaltır.

Derlemelere farklı JDK'lar veya Gradle sürümleriyle başlarsanız ek arka plan programları oluşturulur ve daha fazla CPU ve bellek tüketilir.

Android Studio'da Gradle JDK yapılandırması

Mevcut projenin Gradle JDK yapılandırmasını değiştirmek için Dosya (veya macOS'te Android Studio) > Ayarlar > Derleme, Yürütme, Dağıtım > Derleme Araçları > Gradle seçeneğinden Gradle ayarlarını açın. Gradle JDK açılır menüsü, aşağıdaki seçenekleri içerir:

  • JAVA_HOME ve GRADLE_LOCAL_JAVA_HOME gibi makrolar
  • Android yapılandırma dosyalarında depolanan jbr-17 gibi vendor-version biçimindeki JDK tablosu girişleri
  • JDK indirme
  • Belirli bir JDK ekleme
  • İşletim sisteminin varsayılan JDK yükleme dizininden yerel olarak algılanan JDK'lar

Belirlenen seçenek, projenin .idea/gradle.xml dosyasındaki gradleJvm seçeneğinde depolanır ve JDK yol çözünürlüğü, Android Studio ile başlatıldığında Gradle'ı çalıştırmak için kullanılır.

Şekil 1. Android Studio'daki Gradle JDK ayarları.

Makrolar, dinamik proje JDK yol seçimini etkinleştirir:

  • JAVA_HOME: Aynı ada sahip ortam değişkenini kullanır
  • GRADLE_LOCAL_JAVA_HOME: .gradle/config.properties dosyasında varsayılan olarak JetBrains Çalışma Zamanı olan java.home özelliğini kullanır.

Seçilen JDK, derleme komut dosyalarınızı ve kaynak kodunuzu düzenlerken Gradle derlemenizi çalıştırmak ve JDK API referanslarınızı çözümlemek için kullanılır. Belirtilen compileSdk, kaynak kodunuzu düzenlerken ve oluştururken hangi Java sembollerinin kullanılacağını daha da kısıtlayacaktır.

Gradle derlemenizde kullandığınız eklentiler tarafından kullanılan JDK sürümlerinden daha yüksek veya bu sürümlere eşit olan bir JDK sürümü seçtiğinizden emin olun. Android Gradle Eklentisi (AGP) için gereken minimum JDK sürümünü belirlemek için sürüm notlarındaki uyumluluk tablosuna bakın.

Örneğin, Android Gradle Plugin 8.x için JDK 17 gerekir. JDK'nın önceki bir sürümüyle kullanan bir Gradle derlemesi çalıştırmayı denerseniz şöyle bir mesaj bildirir:

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

Java veya Kotlin kaynak kodumda hangi Java API'lerini kullanabilirim?

Android uygulamaları, JDK'da tanımlanan bazı API'leri kullanabilir, ancak hepsini kullanamaz. Android SDK, birçok Java kitaplık işlevinin uygulamalarını mevcut API'lerinin bir parçası olarak tanımlar. compileSdk özelliği, Kotlin veya Java kaynak kodunuzu derlerken hangi Android SDK sürümünün kullanılacağını belirtir.

Kotlin

android {
    ...
    compileSdk = 33
}

Modern

android {
    ...
    compileSdk 33
}

Android'in her sürümü, belirli bir JDK sürümünü ve mevcut Java API'lerinin bir alt kümesini destekler. Belirtilen minSdk içinde bulunmayan bir compileSdk içinde mevcut olan bir Java API kullanıyorsanız API'yi Android'in önceki sürümünde desugaring olarak bilinen bir işlemle kullanabilirsiniz. Desteklenen API'ler için Sugaring yoluyla kullanılabilen Java 11+ API'leri konusuna bakın.

Her Android API'sinin hangi Java sürümünü desteklediğini ve hangi Java API'lerinin mevcut olduğuna dair ayrıntıları nerede bulacağınızı öğrenmek için bu tabloyu kullanın.

Android Java Desteklenen API ve dil özellikleri
14 (API 34) 17 Temel kitaplıklar
13 (API 33) 11 Temel kitaplıklar
12 (API 32) 11 Java API'si
11 ve altı Android sürümleri

Java kaynak kodumu hangi JDK derler?

Java araç zinciri JDK, herhangi bir Java kaynak kodunu derlemek için kullanılan Java derleyicisini içerir. Bu JDK, derleme sırasında javadoc ve birim testleri de çalıştırır.

Araç zinciri, Gradle'ı çalıştırmak için kullanılan JDK'yı varsayılan olarak ayarlar. Varsayılanı kullanır ve bir derlemeyi farklı makinelerde (örneğin, yerel makineniz ve ayrı bir Sürekli Entegrasyon sunucusu) çalıştırırsanız farklı JDK sürümleri kullanıldığında derlemenizin sonuçları farklılık gösterebilir.

Daha tutarlı bir derleme oluşturmak için açıkça bir Java araç zinciri sürümü belirtebilirsiniz. Bu belirtiliyor:

  • Derlemeyi çalıştıran sistemde uyumlu bir JDK bulur.
    • Uyumlu bir JDK yoksa (ve bir araç zinciri çözümleyici tanımlanmışsa) bir tane indirir.
  • Araç zinciri Java API'lerini kaynak kodundan gelen çağrılar için kullanıma sunar.
  • Java kaynağını Java dili sürümünü kullanarak derler.
  • sourceCompatibility ve targetCompatibility için malzemeler varsayılanları.

Her zaman Java araç zincirini belirtmenizi ve belirtilen JDK'nın yüklü olduğundan emin olmanızı veya derlemenize bir araç zinciri çözümleyici eklemenizi öneririz.

Kaynak kodunuzun Java, Kotlin veya her ikisinde birden yazılmış olup olmadığını araç zincirini belirtebilirsiniz. Araç zincirini, modülünüzün build.gradle(.kts) dosyasının üst düzeyinde belirtin.

Kaynak kodunuz yalnızca Java'da yazılmışsa Java araç zinciri sürümünü şu şekilde belirtin:

Kotlin

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

Modern

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

Kaynağınız yalnızca Kotlin veya Kotlin ile Java'nın karışımıysa Java araç zinciri sürümünü aşağıdaki şekilde belirtin:

Kotlin

kotlin {
    jvmToolchain(17)
}

Modern

kotlin {
    jvmToolchain 17
}

Araç zinciri JDK sürümü, Gradle'ı çalıştırmak için kullanılan JDK ile aynı olabilir. Ancak farklı amaçlara hizmet ettiğini unutmayın.

Java kaynak kodumda hangi Java dili kaynak özelliklerini kullanabilirim?

sourceCompatibility özelliği, Java kaynağının derlemesi sırasında hangi Java dili özelliklerinin kullanılabileceğini belirler. Kotlin kaynağını etkilemez.

Belirtilmezse varsayılan olarak Gradle'ı çalıştırmak için kullanılan Java araç zinciri veya JDK kullanılır. Her zaman açıkça bir araç zinciri (tercih edilen) veya sourceCompatibility belirtmenizi öneririz.

Modülünüzün build.gradle(.kts) dosyasında sourceCompatibility öğesini belirtin.

Kotlin

android {
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_17
    }
}

Modern

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_17
    }
}

Kotlin veya Java kaynağımı derlerken hangi Java ikili özellikleri kullanılabilir?

targetCompatibility ve jvmTarget değerlerinin belirtilmesi, derlenmiş Java ve Kotlin kaynağı için bayt kodu oluştururken kullanılan Java sınıf biçimi sürümünü belirler.

Eşdeğer Java özellikleri eklenmeden önce bazı Kotlin özellikleri vardı. İlk Kotlin derleyicileri, bu Kotlin özelliklerini temsil etmek için kendi yöntemlerini oluşturmak zorundaydı. Bu özelliklerden bazıları daha sonra Java'ya eklendi. Sonraki jvmTarget seviyeleriyle Kotlin derleyicisi doğrudan Java özelliğini kullanabilir ve bu da daha iyi performans sağlayabilir.

targetCompatibility varsayılan olarak sourceCompatibility ile aynı değere ayarlanır, ancak belirtilirse sourceCompatibility değerinden büyük veya bu değere eşit olmalıdır.

jvmTarget varsayılan olarak araç zinciri sürümünü kullanır.

Android'in farklı sürümleri farklı Java sürümlerini destekler. targetCompatibility ve jvmTarget değerlerini yükselterek ek Java özelliklerinden yararlanabilirsiniz. Ancak bu, özelliğin kullanılabilir olmasını sağlamak için sizi minimum Android SDK sürümünüzü de yükseltmeye zorlayabilir.

Kotlin

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

Modern

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