Android Gradle प्लग इन 3.0.0 (अक्टूबर 2017)

Android Gradle प्लग इन 3.0.0 में कई बदलाव किए गए हैं. इनका मकसद बड़े प्रोजेक्ट की परफ़ॉर्मेंस से जुड़ी समस्याओं को हल करना है.

उदाहरण के लिए, ~130 मॉड्यूल और बड़ी संख्या में बाहरी डिपेंडेंसी (लेकिन कोई कोड या संसाधन नहीं) वाले सैंपल स्केलेटन प्रोजेक्ट पर, आपको परफ़ॉर्मेंस में ये सुधार दिख सकते हैं:

Android प्लगिन का वर्शन + Gradle का वर्शन Android प्लग इन 2.2.0 + Gradle 2.14.1 Android प्लग इन 2.3.0 + Gradle 3.3 Android प्लग इन 3.0.0 + Gradle 4.1
कॉन्फ़िगरेशन (जैसे, ./gradlew --help चलाना) ~2 मिनट ~9 सेकंड ~2.5 सेकंड
Java में एक लाइन का बदलाव (लागू करने से जुड़ा बदलाव) ~2 मिनट 15 सेकंड ~29 सेकंड ~6.4 सेकंड

इनमें से कुछ बदलावों की वजह से, मौजूदा बिल्ड काम नहीं करते. इसलिए, नए प्लगिन का इस्तेमाल करने से पहले, आपको अपने प्रोजेक्ट को माइग्रेट करने में लगने वाले
समय और मेहनत के बारे में सोच लेना चाहिए.

अगर आपको ऊपर बताई गई परफ़ॉर्मेंस में सुधार नहीं दिखता है, तो कृपया बग की शिकायत करें. साथ ही, Gradle Profiler का इस्तेमाल करके, अपने बिल्ड का ट्रेस शामिल करें.

Android प्लगिन के इस वर्शन के लिए, ये ज़रूरी शर्तें पूरी होनी चाहिए:

कम से कम वर्शन डिफ़ॉल्ट वर्शन नोट
Gradle 4.1 4.1 ज़्यादा जानने के लिए, Gradle को अपडेट करना लेख पढ़ें.
एसडीके बिल्ड टूल 26.0.2 26.0.2 एसडीके बिल्ड टूल इंस्टॉल करें या कॉन्फ़िगर करें. इस अपडेट के बाद, आपको बिल्ड टूल के लिए कोई वर्शन तय करने की ज़रूरत नहीं है. प्लगिन, डिफ़ॉल्ट रूप से ज़रूरी कम से कम वर्शन का इस्तेमाल करता है. इसलिए, अब android.buildToolsVersion प्रॉपर्टी को हटाया जा सकता है.

3.0.1 (नवंबर 2017)

यह Android Studio 3.0.1 के साथ काम करने वाला एक छोटा अपडेट है. इसमें सामान्य गड़बड़ियां ठीक की गई हैं और परफ़ॉर्मेंस में सुधार किए गए हैं.

ऑप्टिमाइज़ेशन

  • फ़ाइन ग्रेन्ड टास्क ग्राफ़ की मदद से, एक से ज़्यादा मॉड्यूल वाले प्रोजेक्ट के लिए बेहतर पैरललिज़्म.
  • डिपेंडेंसी में बदलाव करते समय, Gradle तेज़ी से बिल्ड करता है. ऐसा इसलिए, क्योंकि यह उन मॉड्यूल को फिर से कंपाइल नहीं करता जिनके पास उस डिपेंडेंसी के एपीआई का ऐक्सेस नहीं है. आपको यह तय करना चाहिए कि कौनसी डिपेंडेंसी, अपने एपीआई को अन्य मॉड्यूल में लीक करती हैं. इसके लिए, Gradle के नए डिपेंडेंसी कॉन्फ़िगरेशन का इस्तेमाल करें: implementation, api, compileOnly, और runtimeOnly.
  • हर क्लास के लिए डेक्सिंग की सुविधा होने की वजह से, इंक्रीमेंटल बिल्ड की स्पीड तेज़ होती है. अब हर क्लास को अलग-अलग DEX फ़ाइलों में कंपाइल किया जाता है. साथ ही, सिर्फ़ उन क्लास को फिर से डेक्स किया जाता है जिनमें बदलाव किया गया है. जिन ऐप्लिकेशन के लिए minSdkVersion की वैल्यू 20 या इससे कम पर सेट है और जो लेगसी मल्टी-डेक्स का इस्तेमाल करते हैं उनके लिए, आपको बिल्ड की स्पीड में भी सुधार देखने को मिलेगा.
  • कुछ टास्क को ऑप्टिमाइज़ करके, बिल्ड की स्पीड को बेहतर बनाया गया है, ताकि कैश किए गए आउटपुट का इस्तेमाल किया जा सके. इस ऑप्टिमाइज़ेशन का फ़ायदा पाने के लिए, आपको पहले Gradle बिल्ड कैश मेमोरी चालू करनी होगी.
  • AAPT2 का इस्तेमाल करके, संसाधन को बेहतर तरीके से प्रोसेस करने की सुविधा. यह सुविधा अब डिफ़ॉल्ट रूप से चालू होती है. अगर आपको AAPT2 का इस्तेमाल करते समय समस्याएं आ रही हैं, तो कृपया बग की शिकायत करें. android.enableAapt2=false फ़ाइल में android.enableAapt2=false सेट करके भी AAPT2 को बंद किया जा सकता है. इसके बाद, कमांड लाइन से ./gradlew --stop चलाकर Gradle डेमॉन को फिर से शुरू करें.gradle.properties

नई सुविधाएं

  • वैरिएंट के हिसाब से डिपेंडेंसी मैनेज करना. किसी मॉड्यूल का कोई वैरिएंट बनाते समय, प्लगिन अब स्थानीय लाइब्रेरी मॉड्यूल की डिपेंडेंसी के वैरिएंट को, बनाए जा रहे मॉड्यूल के वैरिएंट से अपने-आप मैच कर देता है.
  • इसमें Android Instant Apps और Android Instant Apps SDK के साथ काम करने वाला नया फ़ीचर मॉड्यूल प्लगिन शामिल है. Android Instant Apps SDK को एसडीके मैनेजर का इस्तेमाल करके डाउनलोड किया जा सकता है. नए प्लगिन की मदद से, सुविधा वाले मॉड्यूल बनाने के बारे में ज़्यादा जानने के लिए, कई सुविधाओं वाले इंस्टैंट ऐप्लिकेशन का स्ट्रक्चर लेख पढ़ें.
  • Java 8 की कुछ भाषा सुविधाओं और Java 8 की लाइब्रेरी का इस्तेमाल करने के लिए, पहले से मौजूद सहायता. Jack अब काम नहीं करता और इसकी ज़रूरत नहीं है. इसलिए, आपको डिफ़ॉल्ट टूलचेन में शामिल, बेहतर Java 8 सपोर्ट का इस्तेमाल करने के लिए, पहले Jack को बंद करना होगा. ज़्यादा जानकारी के लिए, Java 8 की भाषा से जुड़ी सुविधाओं का इस्तेमाल करना लेख पढ़ें.
  • Android Test Orchestrator के साथ टेस्ट चलाने की सुविधा जोड़ी गई है. इससे, अपने ऐप्लिकेशन के हर टेस्ट को इंस्ट्रुमेंटेशन के अपने इनवोकेशन में चलाया जा सकता है. हर टेस्ट अपने इंस्ट्रुमेंटेशन इंस्टेंस में चलता है. इसलिए, टेस्ट के बीच शेयर की गई कोई भी स्थिति, आपके डिवाइस के सीपीयू या मेमोरी पर इकट्ठा नहीं होती. अगर कोई टेस्ट क्रैश हो जाता है, तो सिर्फ़ इंस्ट्रुमेंटेशन का उसका इंस्टेंस बंद हो जाता है. इसलिए, आपके अन्य टेस्ट अब भी चलते रहते हैं.

    • testOptions.execution को जोड़ा गया है, ताकि यह तय किया जा सके कि डिवाइस पर टेस्ट ऑर्केस्ट्रेशन का इस्तेमाल करना है या नहीं. अगर आपको Android Test Orchestrator का इस्तेमाल करना है, तो आपको ANDROID_TEST_ORCHESTRATOR को इस तरह से तय करना होगा. डिफ़ॉल्ट रूप से, यह प्रॉपर्टी HOST पर सेट होती है. इससे डिवाइस पर ऑर्केस्ट्रेशन की सुविधा बंद हो जाती है. साथ ही, यह टेस्ट चलाने का स्टैंडर्ड तरीका है.

    ग्रूवी

            android {
              testOptions {
                execution 'ANDROID_TEST_ORCHESTRATOR'
              }
            }
            

    Kotlin

            android {
              testOptions {
                execution = "ANDROID_TEST_ORCHESTRATOR"
              }
            }
            
  • androidTestUtilडिपेंडेंसी कॉन्फ़िगरेशन की नई सुविधा की मदद से, इंस्ट्रुमेंटेशन टेस्ट चलाने से पहले, टेस्ट हेल्पर का कोई दूसरा APK इंस्टॉल किया जा सकता है. जैसे, Android Test Orchestrator:

    ग्रूवी

            dependencies {
              androidTestUtil 'com.android.support.test:orchestrator:1.0.0'
              ...
            }
            

    Kotlin

            dependencies {
              androidTestUtil("com.android.support.test:orchestrator:1.0.0")
              ...
            }
            
  • testOptions.unitTests.includeAndroidResources को जोड़ा गया है, ताकि Android संसाधनों की ज़रूरत वाले यूनिट टेस्ट किए जा सकें. जैसे, Roboelectric. इस प्रॉपर्टी को true पर सेट करने पर, प्लगिन यूनिट टेस्ट चलाने से पहले रिसॉर्स, ऐसेट, और मेनिफ़ेस्ट को मर्ज करता है. इसके बाद, आपकी जांचें इन कुंजियों के लिए क्लासपाथ पर com/android/tools/test_config.properties की जांच कर सकती हैं:

    • android_merged_assets: मर्ज की गई ऐसेट डायरेक्ट्री का ऐब्सलूट पाथ.

      ध्यान दें: लाइब्रेरी मॉड्यूल के लिए, मर्ज की गई ऐसेट में डिपेंडेंसी की ऐसेट शामिल नहीं होती हैं (समस्या #65550419 देखें).

    • android_merged_manifest: मर्ज किए गए मेनिफ़ेस्ट फ़ाइल का ऐब्सलूट पाथ.

    • android_merged_resources: यह मर्ज किए गए संसाधनों की डायरेक्ट्री का पूरा पाथ है. इसमें मॉड्यूल और उसकी सभी डिपेंडेंसी के सभी संसाधन शामिल होते हैं.

    • android_custom_package: फ़ाइनल R क्लास के पैकेज का नाम. अगर ऐप्लिकेशन आईडी में डाइनैमिक तरीके से बदलाव किया जाता है, तो हो सकता है कि यह पैकेज का नाम, ऐप्लिकेशन के मेनिफ़ेस्ट में मौजूद package एट्रिब्यूट से मेल न खाए.

  • फ़ॉन्ट को संसाधन के तौर पर इस्तेमाल करने की सुविधा. यह सुविधा Android 8.0 (एपीआई लेवल 26) में जोड़ी गई है.
  • Android Instant Apps SDK 1.1 और इसके बाद के वर्शन के साथ, भाषा के हिसाब से APK इस्तेमाल करने की सुविधा.
  • अब आपके पास, बाहरी नेटिव बिल्ड प्रोजेक्ट के लिए आउटपुट डायरेक्ट्री बदलने का विकल्प है. इसके लिए, यहां दिया गया तरीका अपनाएं:

    ग्रूवी

            android {
                ...
                externalNativeBuild {
                    // For ndk-build, instead use the ndkBuild block.
                    cmake {
                        ...
                        // Specifies a relative path for outputs from external native
                        // builds. You can specify any path that's not a subdirectory
                        // of your project's temporary build/ directory.
                        buildStagingDirectory "./outputs/cmake"
                    }
                }
            }
            

    Kotlin

            android {
                ...
                externalNativeBuild {
                    // For ndk-build, instead use the ndkBuild block.
                    cmake {
                        ...
                        // Specifies a relative path for outputs from external native
                        // builds. You can specify any path that's not a subdirectory
                        // of your project's temporary build/ directory.
                        buildStagingDirectory = "./outputs/cmake"
                    }
                }
            }
            
  • अब Android Studio से नेटिव प्रोजेक्ट बनाते समय, CMake 3.7 या इसके बाद के वर्शन का इस्तेमाल किया जा सकता है.
  • lintChecks डिपेंडेंसी कॉन्फ़िगरेशन की नई सुविधा की मदद से, कस्टम लिंट नियम तय करने वाला JAR बनाया जा सकता है. साथ ही, इसे अपने AAR और APK प्रोजेक्ट में पैकेज किया जा सकता है.

    आपकी कस्टम लिंट के नियम, एक अलग प्रोजेक्ट के होने चाहिए. इस प्रोजेक्ट से एक JAR फ़ाइल आउटपुट होती है और इसमें सिर्फ़ compileOnly डिपेंडेंसी शामिल होती हैं. इसके बाद, ऐप्लिकेशन और लाइब्रेरी के अन्य मॉड्यूल, lintChecks कॉन्फ़िगरेशन का इस्तेमाल करके, आपके lint प्रोजेक्ट पर निर्भर हो सकते हैं:

    ग्रूवी

            dependencies {
                // This tells the Gradle plugin to build ':lint-checks' into a lint.jar file
                // and package it with your module. If the module is an Android library,
                // other projects that depend on it automatically use the lint checks.
                // If the module is an app, lint includes these rules when analyzing the app.
                lintChecks project(':lint-checks')
            }
            

    Kotlin

            dependencies {
                // This tells the Gradle plugin to build ':lint-checks' into a lint.jar file
                // and package it with your module. If the module is an Android library,
                // other projects that depend on it automatically use the lint checks.
                // If the module is an app, lint includes these rules when analyzing the app.
                lintChecks(project(":lint-checks"))
            }
            

व्यवहार में बदलाव

  • Android प्लगिन 3.0.0 कुछ एपीआई हटा देता है. अगर आपने उनका इस्तेमाल किया है, तो आपकी बिल्ड प्रोसेस रुक जाएगी. उदाहरण के लिए, अब outputFile() ऑब्जेक्ट को ऐक्सेस करने या हर वैरिएंट के लिए मेनिफ़ेस्ट फ़ाइल पाने के लिए, Variants API का इस्तेमाल नहीं किया जा सकता.processManifest.manifestOutputFile() ज़्यादा जानने के लिए, एपीआई में हुए बदलाव पढ़ें.
  • अब आपको बिल्ड टूल के लिए वर्शन तय करने की ज़रूरत नहीं है. इसलिए, अब android.buildToolsVersion प्रॉपर्टी को हटाया जा सकता है. डिफ़ॉल्ट रूप से, प्लगिन अपने-आप, Android प्लगिन के उस वर्शन के लिए ज़रूरी बिल्ड टूल के सबसे नए वर्शन का इस्तेमाल करता है जिसका इस्तेमाल किया जा रहा है.
  • अब आपको buildTypes ब्लॉक में, पीएनजी इमेज को कंप्रेस करने की सुविधा चालू/बंद करने का विकल्प मिलता है. यह विकल्प नीचे दिखाया गया है. सभी बिल्ड के लिए, PNG क्रंचिंग की सुविधा डिफ़ॉल्ट रूप से चालू होती है. हालांकि, डीबग बिल्ड के लिए यह सुविधा चालू नहीं होती, क्योंकि इससे उन प्रोजेक्ट के लिए बिल्ड टाइम बढ़ जाता है जिनमें कई PNG फ़ाइलें शामिल होती हैं. इसलिए, अन्य बिल्ड टाइप के लिए बिल्ड टाइम को बेहतर बनाने के लिए, आपको PNG क्रंचिंग की सुविधा बंद करनी चाहिए या अपनी इमेज को WebP फ़ॉर्मैट में बदलना चाहिए.

    ग्रूवी

          android {
            buildTypes {
              release {
                // Disables PNG crunching for the release build type.
                crunchPngs false
              }
            }
          }
          

    Kotlin

          android {
            buildTypes {
              release {
                // Disables PNG crunching for the release build type.
                isCrunchPngs = false
              }
            }
          }
          
  • Android प्लगिन अब अपने-आप एक्ज़ीक्यूटेबल टारगेट बनाता है. इन्हें बाहरी CMake प्रोजेक्ट में कॉन्फ़िगर किया जाता है.
  • अब आपको annotationProcessor डिपेंडेंसी कॉन्फ़िगरेशन का इस्तेमाल करके, प्रोसेसर क्लासपाथ में एनोटेशन प्रोसेसर जोड़ने होंगे.
  • अब बंद हो चुके ndkCompile का इस्तेमाल करने पर ज़्यादा पाबंदियां लगाई गई हैं. इसके बजाय, आपको अपने APK में पैकेज किए जाने वाले नेटिव कोड को कंपाइल करने के लिए, CMake या ndk-build का इस्तेमाल करना चाहिए. ज़्यादा जानने के लिए, ndkcompile से माइग्रेट करना लेख पढ़ें.