Android derlemelerindeki Java sürümleri

Kaynak kodunuz Java, Kotlin veya her ikisinde de yazılmış olsa derlemeniz için JDK ya da Java dilinin bir sürümünü seçmeniz gereken birkaç yer vardır.

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

Sözlük

Java Development Kit (JDK)
Java Development Kit (JDK) içeriği:
  • 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'ler 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'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'dır. 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 nasıl JDK seçebilirim?

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, Android Studio'nun optimum kullanımı için 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) bulunur. Önerilir.
  4. JDK_HOME ortam değişkeni
  5. JAVA_HOME ortam değişkeni
  6. java ortam değişkeninde yürütülebilirPATH

Gradle derlemelerimi hangi JDK'nın ç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 belirlenen JDK kullanılır. Gradle'ı bir terminalde (Android Studio'nun içinde veya dışında) çalıştırırsanız JAVA_HOME ortam değişkeni (ayarlanmışsa) Gradle komut dosyalarını hangi JDK'nın çalıştıracağını belirler. JAVA_HOME ayarlanmamışsa PATH ortam değişkeninizde 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ırmanızı aynı JDK'ya ayarladığınızdan emin olun.

Gradle, derlemenizi çalıştırırken gerçek derlemeyi gerçekleştirmek için daemon adı verilen bir işlem oluşturur. Bu işlem, derlemeler aynı JDK ve Gradle sürümünü kullandığı sürece yeniden kullanılabilir. Bir daemon'un yeniden kullanılması, yeni bir JVM'nin başlatılması ve derleme sisteminin başlatılması için gereken süreyi kısaltır.

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

gradle-wrapper.properties dosyasında aynı Gradle sürümünü belirtin.

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

Mevcut projenin Gradle JDK yapılandırmasını değiştirmek için File (Dosya) (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
  • vendor-version biçiminde jbr-17 gibi Android yapılandırma dosyalarında depolanan 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ındaki gradleJvm seçeneğinde depolanır ve Android Studio üzerinden başlatıldığında Gradle'ı çalıştırmak için JDK yolu çözümü kullanılır.

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

Makrolar, dinamik proje JDK yolu seçimine olanak tanır:

  • 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ılabileceğini daha da kısıtlayacaktır.

Gradle derlemenizde kullandığınız eklentiler tarafından kullanılan JDK sürümlerinden daha yüksek veya onlara 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. Bunu kullanan bir Gradle derlemesini JDK'nın daha eski bir sürümüyle çalıştırmaya çalışırsanız şu gibi bir mesaj bildirilir:

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?

Bir Android uygulaması, JDK'da tanımlanan API'lerin bir kısmını kullanabilir ancak tamamını kullanamaz. Android SDK, birçok Java kitaplığı 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
}

Groovy

android {
    ...
    compileSdk 33
}

Android'in her sürümü, JDK'nin belirli bir sürümünü ve kullanılabilir Java API'lerinin bir alt kümesini destekler. Belirtilen minSdk'de bulunmayan bir compileSdk içinde kullanılabilen bir Java API'si kullanıyorsanız desugaring olarak bilinen bir işlemle API'yi Android'in önceki sürümünde kullanabilirsiniz. Desteklenen API'ler için Java 11+ API'leri (desugaring ile kullanılabilir) başlıklı makaleyi inceleyin.

Hangi Android API'nin hangi Java sürümünü desteklediğini ve hangi Java API'lerinin kullanılabildiğiyle ilgili ayrıntıları nerede bulabileceğinizi belirlemek 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 daha düşük 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 testlerini de çalıştırır.

Araç zinciri, Gradle'ı çalıştırmak için kullanılan JDK'yı varsayılan olarak kullanır. Varsayılanı kullanıyorsanız ve farklı makinelerde (örneğin, yerel makineniz ve ayrı bir sürekli entegrasyon sunucusu) derleme çalıştırıyorsanı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. Bunu belirtmek:

  • Derlemenin çalıştığı sistemde uyumlu bir JDK'yı bulur.
    • Uyumlu bir JDK yoksa (ve bir araç zinciri çözümleyici tanımlanmışsa) JDK indirilir.
  • Kaynak kodundan yapılan çağrılar için araç zinciri Java API'lerini kullanıma sunar.
  • Java kaynaklarını Java dilinin kendi 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'nın yüklendiğinden emin olmanızı ya da derlemenize bir araç zinciri çözümleyici eklemenizi öneririz.

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

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

Kotlin

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

Groovy

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

Bu özellik, kaynağınız Kotlin, Java veya her ikisinin karışımıysa çalışır.

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 sourceCompatibility dosyasında build.gradle(.kts) öğesini 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 toolchain 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 (örneğin, Java 8 veya daha yeni bir sürüm) kullanılır.

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

targetCompatibility ve jvmTarget özellikleri, derlenmiş Java ve Kotlin kaynakları için sırasıyla bytecode 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 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. Daha sonraki jvmTarget seviyelerinde Kotlin derleyici, 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 ve jvmTarget değerlerini artırarak ek Java özelliklerinden yararlanabilirsiniz ancak bu, özelliği kullanabilmek için minimum Android SDK sürümünüzü de artırmanızı gerektirebilir.

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

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

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 Java toolchain kullanmanızı öneririz.