Android बिल्ड में Java वर्शन

चाहे आपका सोर्स कोड Java, Kotlin या दोनों में लिखा गया हो, आपको अपने बिल्ड के लिए JDK या Java भाषा का वर्शन चुनने के लिए कई जगहें मिलेंगी.

Gradle बिल्ड में जेडीके के रिलेशनशिप की खास जानकारी
पहली इमेज. किसी बिल्ड में जेडीके के संबंध

शब्दावली

Java Development Kit (JDK)
Java Development Kit (JDK) में ये शामिल हैं:
  • कंपाइलर, प्रोफ़ाइलर, और संग्रह बनाने वाले टूल. इनका इस्तेमाल, ऐप्लिकेशन बनाने के दौरान बैकग्राउंड में किया जाता है.
  • ऐसी लाइब्रेरी जिनमें एपीआई मौजूद होते हैं. इन्हें Kotlin या Java सोर्स कोड से कॉल किया जा सकता है. ध्यान दें कि Android पर सभी फ़ंक्शन उपलब्ध नहीं हैं.
  • Java वर्चुअल मशीन (JVM), एक इंटरप्रेटर है जो Java ऐप्लिकेशन को एक्ज़ीक्यूट करता है. Android Studio IDE और Gradle बिल्ड टूल को चलाने के लिए, जेवीएम का इस्तेमाल किया जाता है. Android डिवाइसों या एम्युलेटर पर जेवीएम का इस्तेमाल नहीं किया जाता.
JetBrains Runtime (JBR)
JetBrains Runtime (JBR) एक बेहतर JDK है, जिसे Android Studio के साथ उपलब्ध कराया जाता है. इसमें Studio और JetBrains के अन्य प्रॉडक्ट में इस्तेमाल करने के लिए, कई ऑप्टिमाइज़ेशन शामिल हैं. हालांकि, इसका इस्तेमाल अन्य Java ऐप्लिकेशन चलाने के लिए भी किया जा सकता है.

Android Studio को चलाने के लिए, जेडीके कैसे चुना जाता है?

हमारा सुझाव है कि आप Android Studio को चलाने के लिए, JBR का इस्तेमाल करें. इसे Android Studio के साथ डिप्लॉय किया जाता है और इसका इस्तेमाल Android Studio को टेस्ट करने के लिए किया जाता है. इसमें Android Studio के बेहतर इस्तेमाल के लिए, कई सुधार शामिल हैं. यह पक्का करने के लिए, STUDIO_JDK एनवायरमेंट वैरिएबल सेट न करें.

Android Studio के लिए स्टार्टअप स्क्रिप्ट, इस क्रम में जेवीएम को ढूंढती हैं:

  1. STUDIO_JDK एनवायरमेंट वैरिएबल
  2. studio.jdk डायरेक्ट्री (Android Studio डिस्ट्रिब्यूशन में)
  3. Android Studio डिस्ट्रिब्यूशन में jbr डायरेक्ट्री (JetBrains Runtime). सुझाई गई.
  4. JDK_HOME एनवायरमेंट वैरिएबल
  5. JAVA_HOME एनवायरमेंट वैरिएबल
  6. PATH एनवायरमेंट वैरिएबल में java एक्ज़ीक्यूटेबल

मैं यह कैसे चुनूं कि मेरे Gradle बिल्ड को कौनसा जेडीके चलाए?

अगर Android Studio में मौजूद बटन का इस्तेमाल करके Gradle को चलाया जाता है, तो Gradle को चलाने के लिए, Android Studio की सेटिंग में सेट किए गए JDK का इस्तेमाल किया जाता है. अगर Android Studio के अंदर या बाहर किसी टर्मिनल में Gradle को चलाया जाता है, तो JAVA_HOME एनवायरमेंट वैरिएबल (अगर सेट है) यह तय करता है कि Gradle स्क्रिप्ट को कौनसा जेडीके चलाएगा. अगर JAVA_HOME सेट नहीं है, तो यह आपके PATH एनवायरमेंट वैरिएबल पर java कमांड का इस्तेमाल करता है.

सबसे सटीक नतीजे पाने के लिए, पक्का करें कि आपने JAVA_HOME एनवायरमेंट वैरिएबल और Android Studio में Gradle JDK कॉन्फ़िगरेशन को उसी जेडीके पर सेट किया हो.

बिल्ड को चलाते समय, Gradle असल बिल्ड को पूरा करने के लिए डेमन नाम की प्रोसेस बनाता है. इस प्रोसेस को फिर से इस्तेमाल किया जा सकता है. हालांकि, इसके लिए ज़रूरी है कि बिल्ड में एक ही JDK और Gradle वर्शन का इस्तेमाल किया जा रहा हो. डेमन का फिर से इस्तेमाल करने से, नया जेवीएम शुरू करने और बिल्ड सिस्टम को शुरू करने में लगने वाला समय कम हो जाता है.

अगर अलग-अलग JDK या Gradle वर्शन के साथ बिल्ड शुरू किए जाते हैं, तो अतिरिक्त डीमन बन जाते हैं. इससे ज़्यादा सीपीयू और मेमोरी खर्च होती है.

Android Studio में Gradle JDK कॉन्फ़िगरेशन

मौजूदा प्रोजेक्ट के Gradle JDK कॉन्फ़िगरेशन में बदलाव करने के लिए, Gradle सेटिंग खोलें. इसके लिए, File (या macOS पर Android Studio) > Settings > Build, Execution, Deployment > Build Tools > Gradle पर जाएं. Gradle JDK ड्रॉप-डाउन में, चुनने के लिए ये विकल्प मौजूद होते हैं:

  • JAVA_HOME और GRADLE_LOCAL_JAVA_HOME जैसे मैक्रो
  • vendor-version फ़ॉर्मैट में जेडीके टेबल की एंट्री, जैसे कि jbr-17. इन्हें Android कॉन्फ़िगरेशन फ़ाइलों में सेव किया जाता है
  • जेडीके डाउनलोड करना
  • कोई JDK जोड़ना
  • ऑपरेटिंग सिस्टम की डिफ़ॉल्ट जेडीके इंस्टॉलेशन डायरेक्ट्री से, स्थानीय तौर पर पहचाने गए जेडीके

चुना गया विकल्प, प्रोजेक्ट की .idea/gradle.xml फ़ाइल में gradleJvm विकल्प में सेव किया जाता है. साथ ही, Android Studio से Gradle को शुरू करने पर, इसके जेडीके पाथ रिज़ॉल्यूशन का इस्तेमाल किया जाता है.

दूसरी इमेज. Android Studio में Gradle JDK की सेटिंग.

मैक्रो की मदद से, डाइनैमिक प्रोजेक्ट जेडीके पाथ को चुना जा सकता है:

  • JAVA_HOME: इसी नाम वाले एनवायरमेंट वैरिएबल का इस्तेमाल करता है
  • GRADLE_LOCAL_JAVA_HOME: .gradle/config.properties फ़ाइल में java.home प्रॉपर्टी का इस्तेमाल करता है. यह प्रॉपर्टी, JetBrains रनटाइम पर डिफ़ॉल्ट रूप से सेट होती है.

चुने गए JDK का इस्तेमाल, Gradle बिल्ड को चलाने और बिल्ड स्क्रिप्ट और सोर्स कोड में बदलाव करते समय, JDK एपीआई के रेफ़रंस को ठीक करने के लिए किया जाता है. ध्यान दें कि तय किया गया compileSdk, आपके सोर्स कोड में बदलाव करने और उसे बनाने के दौरान उपलब्ध Java सिंबल को और सीमित कर देगा.

पक्का करें कि आपने जेडीके का ऐसा वर्शन चुना हो जो आपके Gradle बिल्ड में इस्तेमाल किए गए प्लगिन के जेडीके वर्शन से ज़्यादा या उसके बराबर हो. Android Gradle प्लगिन (एजीपी) के लिए, जेडीके के ज़रूरी वर्शन के बारे में जानने के लिए, रिलीज़ नोट में दी गई टेबल देखें. इसमें बताया गया है कि कौनसा जेडीके वर्शन, एजीपी के किस वर्शन के साथ काम करता है.

उदाहरण के लिए, Android Gradle प्लगिन के वर्शन 8.x के लिए, JDK 17 ज़रूरी है. अगर JDK के पुराने वर्शन के साथ Gradle बिल्ड को चलाने की कोशिश की जाती है, तो आपको इस तरह का मैसेज दिखेगा:

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 या Kotlin सोर्स कोड में किन Java एपीआई का इस्तेमाल कर सकता/सकती हूं?

कोई Android ऐप्लिकेशन, JDK में तय किए गए कुछ एपीआई का इस्तेमाल कर सकता है, लेकिन सभी एपीआई का नहीं. Android SDK टूल, अपने उपलब्ध एपीआई के हिस्से के तौर पर, कई Java लाइब्रेरी फ़ंक्शन के लागू होने के तरीके तय करता है. compileSdk प्रॉपर्टी से यह तय होता है कि Kotlin या Java सोर्स कोड को कंपाइल करते समय, Android SDK टूल के किस वर्शन का इस्तेमाल करना है.

Kotlin

android {
    ...
    compileSdk = 36
}

Groovy

android {
    ...
    compileSdk 36
}

Android का हर वर्शन, JDK के किसी खास वर्शन और उसके उपलब्ध Java एपीआई के सबसेट के साथ काम करता है. अगर किसी ऐसे compileSdk में उपलब्ध Java API का इस्तेमाल किया जाता है जो बताए गए minSdk में उपलब्ध नहीं है, तो हो सकता है कि आप डिशुगरिंग नाम की प्रोसेस के ज़रिए, Android के पुराने वर्शन में एपीआई का इस्तेमाल कर पाएं. इस्तेमाल किए जा सकने वाले एपीआई के बारे में जानने के लिए, डिशुगरिंग की मदद से उपलब्ध Java 11+ एपीआई देखें.

इस टेबल का इस्तेमाल करके, यह पता लगाएं कि हर Android API के साथ Java का कौनसा वर्शन काम करता है. साथ ही, यह भी जानें कि कौनसे Java API उपलब्ध हैं.

Android Java एपीआई और भाषा से जुड़ी सुविधाएं
14 (एपीआई 34) 17 मुख्य लाइब्रेरी
13 (एपीआई 33) 11 मुख्य लाइब्रेरी
12 (एपीआई 32) 11 Java API
11 और इससे पहले के वर्शन Android के वर्शन

मेरे Java सोर्स कोड को कौनसा जेडीके कंपाइल करता है?

Java टूलचेन JDK में Java कंपाइलर होता है. इसका इस्तेमाल, किसी भी Java सोर्स कोड को कंपाइल करने के लिए किया जाता है. यह JDK, बिल्ड के दौरान javadoc और यूनिट टेस्ट भी चलाता है.

टूलचेन, Gradle को चलाने के लिए इस्तेमाल किए जाने वाले JDK पर डिफ़ॉल्ट रूप से सेट होता है. अगर डिफ़ॉल्ट वर्शन का इस्तेमाल किया जाता है और अलग-अलग मशीनों (उदाहरण के लिए, आपकी लोकल मशीन और एक अलग कंटीन्यूअस इंटिग्रेशन सर्वर) पर बिल्ड चलाया जाता है, तो जेडीके के अलग-अलग वर्शन इस्तेमाल करने पर, आपके बिल्ड के नतीजे अलग-अलग हो सकते हैं.

ज़्यादा बेहतर बिल्ड बनाने के लिए, Java टूलचेन का कोई वर्शन साफ़ तौर पर बताया जा सकता है. यह तय करने पर:

  • यह बिल्ड को चलाने वाले सिस्टम पर, काम करने वाले JDK का पता लगाता है.
    • अगर कोई कंपैटिबल जेडीके मौजूद नहीं है (और टूल चेन रिज़ॉल्वर तय किया गया है), तो एक डाउनलोड करें.
  • सोर्स कोड से कॉल के लिए, टूलचेन Java एपीआई को एक्सपोज़ करता है.
  • Java सोर्स को Java लैंग्वेज के वर्शन का इस्तेमाल करके कंपाइल करता है.
  • sourceCompatibility और targetCompatibility के लिए डिफ़ॉल्ट वैल्यू उपलब्ध कराता है.

हमारा सुझाव है कि आप हमेशा Java टूलचेन की जानकारी दें. साथ ही, यह पक्का करें कि बताया गया JDK इंस्टॉल हो या अपने बिल्ड में टूलचेन रिज़ॉल्वर जोड़ें.

टूलचेन की मदद से यह तय किया जा सकता है कि आपका सोर्स कोड Java, Kotlin या दोनों में लिखा गया है. अपने मॉड्यूल की build.gradle(.kts) फ़ाइल के टॉप लेवल पर टूलचेन की जानकारी दें.

Java टूलचेन का वर्शन इस तरह से बताएं:

Kotlin

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

Groovy

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

यह तब काम करता है, जब आपका सोर्स Kotlin, Java या दोनों का मिक्स हो.

टूलचेन जेडीके का वर्शन, Gradle को चलाने के लिए इस्तेमाल किए गए जेडीके के वर्शन जैसा हो सकता है. हालांकि, ध्यान रखें कि दोनों का मकसद अलग-अलग होता है.

मैं अपने Java सोर्स कोड में, Java भाषा के सोर्स की कौनसी सुविधाएं इस्तेमाल कर सकता/सकती हूं?

sourceCompatibility प्रॉपर्टी से यह तय होता है कि Java सोर्स के कंपाइलेशन के दौरान, Java भाषा की कौनसी सुविधाएं उपलब्ध होंगी. इससे Kotlin सोर्स पर कोई असर नहीं पड़ता.

अपने मॉड्यूल की build.gradle(.kts) फ़ाइल में, sourceCompatibility को इस तरह से तय करें:

Kotlin

android {
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_17
    }
}

Groovy

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_17
    }
}

अगर इस प्रॉपर्टी की वैल्यू नहीं दी जाती है, तो यह डिफ़ॉल्ट रूप से Java टूलचेन के वर्शन पर सेट हो जाती है. अगर Java टूलचेन का इस्तेमाल नहीं किया जा रहा है, तो यह डिफ़ॉल्ट रूप से Android Gradle प्लगिन के चुने गए वर्शन पर सेट हो जाता है. उदाहरण के लिए, Java 8 या इसके बाद का वर्शन.

Kotlin या Java सोर्स को कंपाइल करते समय, Java बाइनरी की कौनसी सुविधाएं इस्तेमाल की जा सकती हैं?

targetCompatibility प्रॉपर्टी से, Java क्लास-फ़ॉर्मैट के उस वर्शन का पता चलता है जिसका इस्तेमाल, कंपाइल किए गए Java और Kotlin सोर्स के लिए बाइटकोड जनरेट करते समय किया जाता है.

Kotlin की कुछ सुविधाएं, Java की मिलती-जुलती सुविधाओं के जोड़े जाने से पहले से मौजूद थीं. Kotlin के शुरुआती कंपाइलर को Kotlin की उन सुविधाओं को दिखाने के लिए, अपना तरीका बनाना पड़ा. इनमें से कुछ सुविधाओं को बाद में Java में जोड़ा गया. targetCompatibility के बाद के लेवल के साथ, Kotlin कंपाइलर सीधे तौर पर Java की सुविधा का इस्तेमाल कर सकता है. इससे परफ़ॉर्मेंस बेहतर हो सकती है.

Android के अलग-अलग वर्शन, Java के अलग-अलग वर्शन के साथ काम करते हैं. targetCompatibility को बढ़ाकर, Java की अतिरिक्त सुविधाओं का फ़ायदा लिया जा सकता है. हालांकि, ऐसा करने पर आपको Android SDK टूल का कम से कम वर्शन भी बढ़ाना पड़ सकता है, ताकि यह पक्का किया जा सके कि सुविधा उपलब्ध है.

ध्यान दें कि targetCompatibility, sourceCompatibility से ज़्यादा या इसके बराबर होना चाहिए. आम तौर पर, sourceCompatibility और targetCompatibility के लिए एक ही वैल्यू का इस्तेमाल किया जाना चाहिए. इन्हें इस तरह सेट किया जा सकता है:

Kotlin

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

Groovy

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

अगर Kotlin के 2.2 से पहले के वर्शन का इस्तेमाल किया जा रहा है, तो आपको kotlinOptions भी सेट करना होगा:

Kotlin

android {
    kotlinOptions {
        jvmTarget = "17"
    }
}

Groovy

android {
    kotlinOptions {
        jvmTarget = "17"
    }
}

अगर कोई वैल्यू नहीं दी जाती है, तो ये प्रॉपर्टी डिफ़ॉल्ट रूप से Java टूलचेन वर्शन पर सेट हो जाती हैं. अगर Java टूलचेन का इस्तेमाल नहीं किया जा रहा है, तो हो सकता है कि डिफ़ॉल्ट वैल्यू अलग हों और बिल्ड से जुड़ी समस्याएं आएं. इसलिए, हमारा सुझाव है कि आप हमेशा इन वैल्यू को साफ़ तौर पर बताएं या Java टूलचेन का इस्तेमाल करें.