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

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

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

शब्दावली

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

मैं Android Studio चलाने के लिए JDK कैसे चुनूं?

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

Android Studio की स्टार्टअप स्क्रिप्ट इस क्रम में JVM ढूंढती हैं:

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

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

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

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

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

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

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

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

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

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

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

मैक्रो, प्रोजेक्ट के लिए डाइनैमिक JDK पाथ चुनने की सुविधा चालू करते हैं:

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

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

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

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

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

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

Kotlin

android {
    ...
    compileSdk = 33
}

Groovy

android {
    ...
    compileSdk 33
}

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

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

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

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

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

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

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

  • बिल्ड चलाने वाले सिस्टम पर, काम करने वाला JDK ढूंढता है.
    • अगर इसके साथ काम करने वाला कोई JDK मौजूद नहीं है और टूलचेन रिज़ॉल्वर तय किया गया है, तो एक को डाउनलोड करता है.
  • सोर्स कोड से कॉल करने के लिए, टूलचेन Java API को एक्सपोज़ करता है.
  • 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 को चलाने के लिए इस्तेमाल किए जाने वाले JDK का वर्शन एक जैसा हो सकता है. हालांकि, इस बात का ध्यान रखें कि ये अलग-अलग कामों के लिए इस्तेमाल किए जाते हैं.

मैं अपने 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 और jvmTarget प्रॉपर्टी, कंपाइल किए गए Java और Kotlin सोर्स के लिए बाइट कोड जनरेट करते समय, Java क्लास फ़ॉर्मैट के उस वर्शन को तय करती हैं जिसका इस्तेमाल किया जाता है.

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

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

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

Kotlin

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

ग्रूवी

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

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