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

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

Gradle बिल्ड में JDK के संबंधों की खास जानकारी

शब्दावली

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

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

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

Android Studio की स्टार्टअप स्क्रिप्ट यहां दी गई चीज़ों में JVM की खोज करती हैं क्रम:

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

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

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

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

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

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

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

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

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

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

पहली इमेज. Android Studio में Gradle JDK सेटिंग.

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

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

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

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

उदाहरण के लिए, 'Android Gradle प्लग इन' वर्शन 8.x के लिए JDK 17 की ज़रूरत होती है. अगर 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/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
}

ग्रूवी

android {
    ...
    compileSdk 33
}

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

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

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

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

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

टूलचेन डिफ़ॉल्ट रूप से, Gradle चलाने के लिए इस्तेमाल किए जाने वाले 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)
    }
}

ग्रूवी

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

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

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

मेरे Java सोर्स कोड में, Java की किन लैंग्वेज सोर्स सुविधाओं का इस्तेमाल किया जा सकता है?

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

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

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

Kotlin

android {
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_17
    }
}

ग्रूवी

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_17
    }
}

अपने Kotlin या Java सोर्स को कंपाइल करते समय, किन Java बाइनरी फ़ीचर का इस्तेमाल किया जा सकता है?

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

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

targetCompatibility की डिफ़ॉल्ट वैल्यू इस तरह है sourceCompatibility, अगर बताया गया हो, तो यह sourceCompatibility से ज़्यादा या इसके बराबर होना चाहिए.

jvmTarget, डिफ़ॉल्ट रूप से टूलचेन वर्शन पर सेट होता है.

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

Kotlin

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

ग्रूवी

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