Android derlemelerindeki Java sürümleri

Kaynak kodunuz Java, Kotlin veya her ikisiyle yazılmışsa derlemeniz için JDK veya Java dili sürümünü seçmeniz gereken birkaç yer vardır.

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

Sözlük

Java Development Kit (JDK)
Java Development Kit (JDK) şunları içerir:
  • Derleyici, profil oluşturucu ve arşiv oluşturucu gibi araçlar. Bunlar, uygulamanızı oluşturmak için derleme sırasında 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ı çalıştıran 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 birlikte dağıtılan gelişmiş bir JDK'dir. Studio'da 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 JDK'yi nasıl seçerim?

Android Studio'yu çalıştırmak için JBR'yi kullanmanızı öneririz. Android Studio ile birlikte dağıtılır ve Android Studio'yu test etmek için kullanılır. Ayrıca, optimum Android Studio kullanımı için geliştirmeler içerir. Bunun 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. Android Studio dağıtımındaki jbr dizini (JetBrains Çalışma Zamanı). Önerilir.
  4. JDK_HOME ortam değişkeni
  5. JAVA_HOME ortam değişkeni
  6. java ortam değişkeninde PATH yürütülebilir dosyası

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

Gradle'ı Android Studio'daki düğmeleri kullanarak çalıştırırsanız Gradle'ı çalıştırmak için Android Studio ayarlarında belirlenen 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) 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 için JAVA_HOME ortam değişkeninizi ve Android Studio'daki Gradle JDK yapılandırmanızı aynı JDK'ye ayarladığınızdan emin olun.

Gradle, derlemenizi çalıştırırken asıl 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. Bir arka plan programını yeniden kullanmak, yeni bir JVM başlatma ve derleme sistemini ilk kullanıma hazırlama süresini azaltır.

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

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

Mevcut projenin Gradle JDK yapılandırmasını değiştirmek için File (veya macOS'te Android Studio) > Settings > Build, Execution, Deployment > Build Tools > Gradle'dan Gradle ayarlarını açın. Gradle JDK açılır listesinde aşağıdaki seçenekler bulunur:

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

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

Şekil 2. 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ındaki java.home özelliğini kullanır. Bu özellik varsayılan olarak JetBrains Runtime'ı 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 oluştururken hangi Java sembollerinin kullanılabilir olacağını 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. JDK'nin daha eski bir sürümüyle Gradle derlemesi çalıştırmayı denerseniz aşağıdaki gibi bir mesaj alırsınız:

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 bir kısmını kullanabilir ancak hepsini kullanamaz. Android SDK'sı, kullanılabilir API'lerinin bir parçası olarak birçok Java kitaplığı 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 = 36
}

Modern

android {
    ...
    compileSdk 36
}

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'de bulunmayan bir compileSdk'de bulunan Java API'sini kullanıyorsanız desugaring olarak bilinen bir işlem aracılığıyla API'yi Android'in önceki sürümünde kullanabilirsiniz. Desteklenen API'ler için Desugaring aracılığıyla kullanılabilen Java 11 ve sonraki sürümlerin API'leri başlıklı makaleyi inceleyin.

Her Android API'nin hangi Java sürümünü desteklediğini ve hangi Java API'lerinin kullanılabileceğiyle ilgili ayrıntıları nerede bulabileceğinizi öğ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
11 ve daha düşük Android sürümleri

Java kaynak kodumu hangi JDK derler?

Java araç zinciri JDK'si, 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'ı çalıştırmak için kullanılan JDK'yi kullanır. Varsayılanı 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ıldığında derlemenizin sonuçları farklı olabilir.

Daha tutarlı bir derleme oluşturmak için Java araç zinciri sürümünü açıkça belirtebilirsiniz. Bu seçeneği belirlediğinizde:

  • Derlemeyi çalıştıran sistemde uyumlu bir JDK bulur.
    • Uyumlu bir JDK yoksa (ve bir araç zinciri çözümleyici 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 dili sürümünü kullanarak derler.
  • sourceCompatibility ve targetCompatibility için varsayılan değerleri sağlar.

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

Kaynak kodunuz Java, Kotlin veya her ikisiyle yazılmışsa araç zincirini belirtebilirsiniz. Modülünüzün build.gradle(.kts) dosyasının üst düzeyinde araç zincirini belirtin.

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

Kotlin

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

Modern

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

Bu özellik, kaynağınız Kotlin, Java veya her ikisinin karışımıysa kullanılabilir.

Araç zinciri JDK sürümü, Gradle'ı çalıştırmak için kullanılan JDK ile aynı olabilir ancak farklı amaçlara hizmet ettiklerini 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.

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
    }
}

Modern

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_17
    }
}

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

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

targetCompatibility özelliği, derlenmiş Java ve Kotlin kaynakları için bayt kodu oluşturulurken kullanılan Java sınıf biçimi sürümünü belirler.

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

Android'in farklı sürümleri, Java'nın farklı sürümlerini destekler. targetCompatibility değerini artırarak ek Java özelliklerinden yararlanabilirsiniz ancak bu durumda, özelliğin kullanılabilir olmasını sağlamak için minimum Android SDK sürümünüzü de artırmanız gerekebilir.

targetCompatibility, sourceCompatibility değerinden büyük veya bu değere eşit olmalıdır. Uygulamada, sourceCompatibility ve targetCompatibility genellikle aynı değeri kullanmalıdır. Bunları aşağıdaki gibi ayarlayabilirsiniz:

Kotlin

android {
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_17
        targetCompatibility = JavaVersion.VERSION_17
    }
}

Modern

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_17
        targetCompatibility JavaVersion.VERSION_17
    }
}

Kotlin'in 2.2'den eski bir sürümünü kullanıyorsanız kotlinOptions değerini de ayarlamanız gerekir:

Kotlin

android {
    kotlinOptions {
        jvmTarget = "17"
    }
}

Modern

android {
    kotlinOptions {
        jvmTarget = "17"
    }
}

Belirtilmezse bu özellikler varsayılan olarak Java araç zinciri sürümüne ayarlanır. Java araç zinciri 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.