भले ही, आपका सोर्स कोड Java, Kotlin या दोनों में लिखा गया हो, फिर भी आपको अपने बिल्ड के लिए JDK या Java भाषा का वर्शन चुनना होगा.
शब्दावली
- Java डेवलपमेंट किट (जेडीके)
-
Java डेवलपमेंट किट (JDK) में ये चीज़ें शामिल होती हैं:
- टूल, जैसे कि कंपाइलर, प्रोफ़ाइलर, और संग्रह बनाने वाला टूल. इनका इस्तेमाल, ऐप्लिकेशन बनाने के लिए, बिल्ड के दौरान किया जाता है.
- ऐसी लाइब्रेरी जिनमें एपीआई होते हैं और जिन्हें अपने Kotlin या Java सोर्स कोड से कॉल किया जा सकता है. ध्यान दें कि सभी फ़ंक्शन, Android पर उपलब्ध नहीं हैं.
- Java वर्चुअल मशीन (JVM), एक इंटरप्रेटर है जो Java ऐप्लिकेशन को चलाता है. Android Studio IDE और Gradle बिल्ड टूल को चलाने के लिए, JVM का इस्तेमाल किया जाता है. JVM का इस्तेमाल, Android डिवाइसों या एमुलेटर पर नहीं किया जाता.
- JetBrains रनटाइम (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 को इस क्रम में खोजती हैं:
STUDIO_JDK
एनवायरमेंट वैरिएबलstudio.jdk
डायरेक्ट्री (Android Studio डिस्ट्रिब्यूशन में)jbr
डायरेक्ट्री (JetBrains Runtime) में मौजूद है. सुझाई गई.JDK_HOME
एनवायरमेंट वैरिएबलJAVA_HOME
एनवायरमेंट वैरिएबल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 पाथ रिज़ॉल्यूशन का इस्तेमाल किया जाता है.

मैक्रो, प्रोजेक्ट के लिए डाइनैमिक JDK पाथ चुनने की सुविधा चालू करते हैं:
JAVA_HOME
: एक ही नाम वाले एनवायरमेंट वैरिएबल का इस्तेमाल करता हैGRADLE_LOCAL_JAVA_HOME
:.gradle/config.properties
फ़ाइल मेंjava.home
प्रॉपर्टी का इस्तेमाल करता है. यह प्रॉपर्टी डिफ़ॉल्ट रूप से JetBrains Runtime पर सेट होती है.
चुने गए JDK का इस्तेमाल, Gradle बिल्ड को चलाने और बिल्ड स्क्रिप्ट और सोर्स कोड में बदलाव करते समय, JDK API के रेफ़रंस को हल करने के लिए किया जाता है. ध्यान दें कि तय किए गए compileSdk
से, सोर्स कोड में बदलाव करने और उसे बनाने के दौरान, उपलब्ध Java सिंबल पर और पाबंदी लगेगी.
पक्का करें कि आपने Gradle बिल्ड में इस्तेमाल किए जाने वाले प्लगिन के लिए इस्तेमाल किए गए JDK वर्शन की तुलना में ही 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/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 API इस्तेमाल कर सकता/सकती हूं?
Android ऐप्लिकेशन, JDK में बताए गए कुछ एपीआई का इस्तेमाल कर सकता है, लेकिन सभी का नहीं. Android SDK टूल, अपने उपलब्ध एपीआई के हिस्से के तौर पर, कई Java लाइब्रेरी फ़ंक्शन के लागू होने की जानकारी देता है. compileSdk
प्रॉपर्टी से यह तय होता है कि Kotlin या Java सोर्स कोड को कंपाइल करते समय, Android SDK टूल के किस वर्शन का इस्तेमाल करना है.
Kotlin
android {
...
compileSdk = 33
}
Groovy
android {
...
compileSdk 33
}
Android का हर वर्शन, JDK के खास वर्शन और इसके उपलब्ध Java API के सबसेट के साथ काम करता है. अगर ऐसे Java एपीआई का इस्तेमाल किया जाता है जो compileSdk
में उपलब्ध है और बताए गए minSdk
में उपलब्ध नहीं है, तो हो सकता है कि आप Android के पुराने वर्शन में इस एपीआई का इस्तेमाल डिसयूगरिंग प्रोसेस के ज़रिए कर पाएं.
इसके साथ काम करने वाले एपीआई के लिए, डिस्गरिंग के ज़रिए उपलब्ध Java 11+ एपीआई देखें.
इस टेबल का इस्तेमाल करके पता लगाएं कि हर Android एपीआई के साथ कौनसा Java वर्शन काम करता है. साथ ही, यह भी जानें कि कौनसे Java एपीआई उपलब्ध हैं.
Android | Java | एपीआई और भाषा से जुड़ी सुविधाएं |
---|---|---|
14 (एपीआई 34) | 17 | मुख्य लाइब्रेरी |
13 (एपीआई 33) | 11 | मुख्य लाइब्रेरी |
12 (एपीआई 32) | 11 | Java API |
11 और उससे पहले के वर्शन | Android वर्शन |
कौनसा JDK मेरे Java सोर्स कोड को कंपाइल करता है?
Java टूलचैन JDK में Java कंपाइलर होता है. इसका इस्तेमाल, किसी भी Java सोर्स कोड को कंपाइल करने के लिए किया जाता है. यह JDK, बिल्ड के दौरान javadoc और यूनिट टेस्ट भी चलाता है.
टूलचेन, Gradle को चलाने के लिए इस्तेमाल किए गए JDK पर डिफ़ॉल्ट रूप से सेट होता है. अगर डिफ़ॉल्ट का इस्तेमाल किया जाता है और अलग-अलग मशीन (उदाहरण के लिए, आपकी लोकल मशीन और एक अलग कंटिन्यूअस इंटिग्रेशन सर्वर) पर बिल्ड चलाया जाता है, तो जेडीके के अलग-अलग वर्शन का इस्तेमाल करने पर बिल्ड के नतीजे अलग-अलग हो सकते हैं.
ज़्यादा बेहतर बिल्ड बनाने के लिए, Java टूलचैन का वर्शन साफ़ तौर पर बताया जा सकता है. इस बारे में बताएं:
- बिल्ड चलाने वाले सिस्टम पर, काम करने वाला JDK ढूंढता है.
- अगर कोई काम करने वाला 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 या दोनों का मिला-जुला हो.
टूलचेन का JDK वर्शन, 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 क्लास फ़ॉर्मैट का वह वर्शन तय होता है जिसका इस्तेमाल, क्रमशः कंपाइल किए गए Java और Kotlin सोर्स के लिए, बाइटकोड जनरेट करते समय किया जाता है.
Java की इसी तरह की सुविधाएं जोड़ने से पहले, कुछ Kotlin फ़ीचर मौजूद थे.
शुरुआती 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 टूलचेन का इस्तेमाल करें.