Android derlemelerindeki Java sürümleri

Kaynak kodunuz Java, Kotlin veya her ikisi ile yazılmış olsun, derleme işleminiz için bir JDK veya Java dil sürümü seçmeniz gereken birkaç yer vardır.

Gradle derlemesindeki JDK ilişkilerine genel bakış
Şekil 1. Derlemedeki JDK ilişkileri

Sözlük

Java Geliştirme Kiti (JDK)
Java Geliştirme Kiti (JDK) şunu içerir:
  • Derleyici, profilleyici ve arşiv oluşturucu gibi araçlar. Bunlar, derleme 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 Tüm işlevlerin Android'de 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'yi kullanırsınız. JVM, Android cihazlarda veya emülatörlerde kullanılmaz.
JetBrains Runtime (JBR)
JetBrains Runtime (JBR) , Android Studio ile dağıtılan gelişmiş bir JDK'dir. 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 nasıl bir JDK seçerim?

Android Studio'yu çalıştırmak için JBR kullanmanızı öneririz. Android Studio ile birlikte dağıtılır ve Android Studio'yu test etmek için kullanılır. Ayrıca, Android Studio'nun optimum şekilde kullanılmasına yönelik geliştirmeler içerir. Bunu sağlamak için STUDIO_JDK ortam değişkenini ayarlamayın.

Android Studio'nun 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 dizininde (JetBrains Runtime) bulunan Android Studio dağıtımında Ö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 derlememde hangi JDK'nin çalışacağını nasıl seçebilirim?

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

En tutarlı sonuçları elde etmek için JAVA_HOMEortam 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 daemon adlı bir işlem oluşturur. Derlemelerde aynı JDK ve Gradle sürümü kullanıldığı sürece bu işlem yeniden kullanılabilir. Bir daemon'u yeniden kullanmak, yeni bir JVM'yi başlatma ve derleme sistemini başlatma süresini azaltır.

Derlemeleri farklı JDK'lar veya Gradle sürümleriyle başlatırsanız daha fazla CPU ve bellek tüketen ek daemon'lar oluşturulur.

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 bölümünden Gradle ayarlarını açın. Gradle JDK açılır menüsünde aşağıdaki seçenekler yer alır:

  • 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'lar

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

Şekil 2. Android Studio'daki 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ı olan java.home mülkünü kullanır.

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

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 8.x sürümü için JDK 17 gerekir. Bu sınıfı JDK'nin daha eski bir sürümüyle kullanan bir Gradle derlemesi çalıştırmaya çalışırsanız aşağıdaki gibi bir mesaj gösterilir:

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/jdk
      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'de tanımlanan API'lerin bazılarını kullanabilir ancak bunların tamamını kullanamaz. Android SDK'sı, mevcut API'lerinin bir parçası olarak birçok Java kitaplık işlevinin uygulamalarını tanımlar. compileSdk mülkü, Kotlin veya Java kaynak kodunuz derlenirken hangi Android SDK sürümünün kullanılacağını belirtir.

Kotlin

android {
    ...
    compileSdk = 33
}

Groovy

android {
    ...
    compileSdk 33
}

Android'in her sürümü, JDK'nin belirli bir sürümünü ve mevcut Java API'lerinin bir alt kümesini destekler. Belirtilen minSdk sürümünde bulunmayan bir compileSdk sürümünde kullanılabilen bir Java API'si kullanıyorsanız şekerleme kaldırma olarak bilinen bir işlemle API'yi Android'in önceki sürümünde kullanabilirsiniz. Desteklenen API'ler için şekerleme kaldırma yoluyla kullanılabilen Java 11 ve sonraki sürüm API'leri başlıklı makaleyi inceleyin.

Her Android API'sinin desteklediği Java sürümünü ve hangi Java API'lerinin kullanılabildiğiyle ilgili ayrıntıları öğrenmek için bu tablodan yararlanabilirsiniz.

Yapay Zeka 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
11 ve önceki sürümler Android sürümleri

Java kaynak kodumu hangi JDK derliyor?

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

Araç zinciri, varsayılan olarak Gradle'i çalıştırmak için kullanılan JDK'yi kullanır. Varsayılan ayarı kullanır ve farklı makinelerde (ör. yerel makineniz ve ayrı bir sürekli entegrasyon sunucusu) derleme çalıştırırsanız farklı JDK sürümleri kullanılıyorsa derlemenizin sonuçları farklı olabilir.

Daha tutarlı bir derleme oluşturmak için Java araç zinciri sürümünü açıkça belirtebilirsiniz. Şunu belirtirseniz:

  • Derlemeyi çalıştıran sistemde uyumlu bir JDK bulur.
    • Uyumlu bir JDK yoksa (ve bir araç zinciri çözümleyicisi tanımlanmışsa) bir JDK indirir.
  • Kaynak kodundan yapılan çağrılar için araç zinciri Java API'lerini gösterir.
  • Java kaynak kodunu, Java dil sürümünü kullanarak derleyin.
  • sourceCompatibility ve targetCompatibility için varsayılan olarak tedarik edilir.

Java araç setini her zaman belirtmenizi ve belirtilen JDK'nin yüklü olduğundan emin olmanızı ya da derlemenize bir araç seti çözümleyici eklemenizi öneririz.

Kaynak kodunuz Java, Kotlin veya her ikisinde de yazılmış olabilir. Bu durumda, araç setini belirtebilirsiniz. Modülünüzün build.gradle(.kts) dosyasının üst düzeyinde araç setini belirtin.

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

Kotlin

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

Groovy

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

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

Araç zinciri JDK sürümü, Gradle'i ç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 mülkü, Java kaynağının derlenmesi sırasında hangi Java dili özelliklerinin kullanılabileceğini belirler. Kotlin kaynağını etkilemez.

Modülünüzün build.gradle(.kts) dosyasında sourceCompatibility değerini aşağıdaki gibi belirtin:

Kotlin

android {
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_17
    }
}

Groovy

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_17
    }
}

Belirtilmezse bu özellik varsayılan olarak Java araç seti sürümüne ayarlanır. Java araç seti kullanmıyorsanız varsayılan olarak Android Gradle eklentisi tarafından seçilen bir sürüm (ör. Java 8 veya sonraki sürümler) kullanılır.

Kotlin veya Java kaynak kodumu derlediğimde hangi Java ikili özellikleri kullanılabilir?

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

Bazı Kotlin özellikleri, eşdeğer Java özellikleri eklenmeden önce mevcuttu. İlk Kotlin derleyicilerinin bu Kotlin özelliklerini temsil etmek için kendi yöntemlerini oluşturması gerekiyordu. Bu özelliklerin bazıları daha sonra Java'ya eklenmiştir. Daha sonraki jvmTarget seviyelerinde Kotlin derleyicisi doğrudan Java özelliğini kullanabilir. Bu da daha iyi performansla sonuçlanabilir.

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

targetCompatibility değerinin sourceCompatibility değerinden büyük veya ona eşit olması gerektiğini unutmayın. Uygulamada sourceCompatibility, targetCompatibility ve jvmTarget genellikle aynı değeri kullanmalıdır. Bu ayarları aşağıdaki şekilde ayarlayabilirsiniz:

Kotlin

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

Groovy

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

Bu özellikler belirtilmezse varsayılan olarak Java araç seti sürümü kullanılır. Java araç seti kullanmıyorsanız varsayılan değerler farklı olabilir ve derleme sorunlarına neden olabilir. Bu nedenle, bu değerleri her zaman açıkça belirtmenizi veya bir Java araç zinciri kullanmanızı öneririz.