Android derlemelerindeki Java sürümleri

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

Gradle yapısında 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'ler içeren kitaplıklar. Android'de tüm işlevlerin kullanılamadığını unutmayın.
  • Java uygulamalarını yürüten bir yorumcu olan Java Sanal Makinesi (JVM). Android Studio IDE ve Gradle derleme aracını çalıştırmak için JVM'yi 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'dır. Studio ve ilgili JetBrains ürünlerinde kullanılmak üzere çeşitli optimizasyonlar içerir ancak diğer Java uygulamalarını çalıştırmak için de kullanılabilir.

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

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

Android Studio için başlangıç komut dosyaları, bir 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 dizini (JetBrains Runtime) içerir. Önerilir.
  4. JDK_HOME ortam değişkeni
  5. JAVA_HOME ortam değişkeni
  6. PATH ortam değişkeninde java yürütülebilir dosya

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ırdığı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'daki Gradle 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 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 bir JVM başlatma ve derleme sistemini başlatma süresini kısaltır.

Derlemeleri farklı JDK veya Gradle sürümleriyle başlatırsanız ek arka plan programları oluşturulur. Bu da daha fazla CPU ve bellek tüketir.

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

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

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

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

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

Makrolar, dinamik proje JDK yolu 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ı'na ayarlı java.home özelliğini kullanır.

Seçilen JDK, Gradle derlemenizi çalıştırmak ve derleme komut dosyalarınız ile kaynak kodunuzu düzenlerken JDK API referanslarını çözmek için kullanılır. Belirtilen compileSdk öğesinin, kaynak kodunuzu düzenlerken ve oluştururken hangi Java simgelerinin kullanılabileceğini daha da kısıtlayacağını unutmayın.

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

Örneğin, Android Gradle Eklentisi sürüm 8.x için JDK 17 gerekir. JDK'nın önceki sürümleriyle birlikte kullanan bir Gradle derlemesi çalıştırmaya çalışırsanız aşağıdaki gibi bir mesaj görüntülenir:

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?

Bir Android uygulaması, JDK'da tanımlanan API'lerin bazılarını kullanabilir ancak hepsini kullanamaz. Android SDK, mevcut API'lerinin bir parçası olarak birçok Java kitaplık işlevinin uygulamalarını 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
}

Eski

android {
    ...
    compileSdk 33
}

Android'in her sürümü, JDK'nın belirli bir sürümünü ve mevcut Java API'lerinin bir alt kümesini destekler. Belirtilen minSdk içinde bulunmayan bir compileSdk içinde bulunan bir Java API'si kullanırsanız API'yi Android'in önceki sürümünde desugaring olarak bilinen bir işlemle kullanabilirsiniz. Desteklenen API'ler için Desugaring yoluyla kullanılabilen Java 11+ API'leri sayfasına göz atın.

Her Android API'nin hangi Java sürümünü desteklediğini belirlemek ve hangi Java API'lerinin kullanılabilir olduğunu öğ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 derleyiciyi içerir. Bu JDK, ayrıca derleme sırasında javadoc ve birim testlerini çalıştırır.

Araç zinciri, Gradle'ı çalıştırmak için kullanılan JDK'yi varsayılan olarak kullanır. 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. Bunu belirtmek gerekirse:

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

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

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

Java araç zinciri sürümünü şu şekilde belirtin:

Kotlin

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

Eski

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

Kaynağınız Kotlin, Java veya her ikisinin bir karışımıysa bu yöntem işe yarar.

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

Java kaynak kodumda hangi Java dili kaynak özelliklerini kullanabilirim?

sourceCompatibility özelliği, Java kaynağının derlenmesi 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 olur. 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
    }
}

Eski

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_17
    }
}

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

targetCompatibility ve jvmTarget belirtildiğinde, derlenmiş Java ve Kotlin kaynağı için bayt kodu oluşturulurken kullanılan Java sınıfı biçim sürümünü belirler.

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

targetCompatibility, varsayılan olarak sourceCompatibility ile aynı değere sahiptir 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üne ayarlanır.

Android'in farklı sürümleri farklı Java sürümlerini destekler. targetCompatibility ve jvmTarget sayısını artırarak ek Java özelliklerinden yararlanabilirsiniz. Ancak bu durum, özelliğin kullanılabilmesi için minimum Android SDK sürümünüzü artırmanızı da zorunlu kılabilir.

Kotlin

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

Eski

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