बेसलाइन प्रोफ़ाइल Gradle प्लग इन की मदद से, बेसलाइन प्रोफ़ाइल जनरेट करना और उन्हें मैनेज करना आसान हो जाता है. इससे आपको ये काम करने में मदद मिलती है:
- अपने ऐप्लिकेशन के लिए नई बेसलाइन प्रोफ़ाइलें बनाएं.
- अपनी लाइब्रेरी के लिए नई बेसलाइन प्रोफ़ाइलें बनाएं.
- बेसलाइन प्रोफ़ाइल जनरेशन को पसंद के मुताबिक बनाएं.
इस पेज पर, बेसलाइन प्रोफ़ाइल बनाने के तरीके को पसंद के मुताबिक बनाने के लिए, बेसलाइन प्रोफ़ाइल Gradle प्लग इन का इस्तेमाल करने का तरीका बताया गया है.
प्लग इन से जुड़ी ज़रूरी शर्तें
- AGP 8.0 या इसके बाद का वर्शन
- Gradle प्लग इन के नए वर्शन पर निर्भर होना
बेसलाइन प्रोफ़ाइलें जनरेट करने के लिए, Gradle मैनेज किए जा रहे डिवाइसों का इस्तेमाल करना
अपनी बेसलाइन प्रोफ़ाइल जनरेट करने के लिए, Gradle मैनेज किए गए डिवाइस (GMD) का इस्तेमाल करने के लिए, प्रोफ़ाइल प्रोड्यूसर मॉड्यूल के build.gradle.kts कॉन्फ़िगरेशन में एक को जोड़ें. यह :baselineprofile टेस्ट मॉड्यूल हो सकता है, जैसा कि यहां दिए गए उदाहरण में दिखाया गया है:
Kotlin
android { testOptions.managedDevices.devices { create<com.android.build.api.dsl.ManagedVirtualDevice>("pixel6Api31") { device = "Pixel 6" apiLevel = 31 systemImageSource = "aosp" } } }
Groovy
android { testOptions.managedDevices.devices { pixel6Api31(ManagedVirtualDevice) { device 'Pixel 6' apiLevel = 31 systemImageSource 'aosp' } } }
बेसलाइन प्रोफ़ाइल जनरेट करने के लिए, GMD का इस्तेमाल करें. इसके लिए, इसे बेसलाइन प्रोफ़ाइल के Gradle प्लग इन कॉन्फ़िगरेशन में जोड़ें. इसके लिए, :baselineprofile टेस्ट मॉड्यूल के build.gradle.kts में यह तरीका अपनाएं:
Kotlin
baselineProfile { managedDevices += "pixel6Api31" }
Groovy
baselineProfile { managedDevices = ['pixel6Api31'] }
बेसलाइन प्रोफ़ाइलें जनरेट करने के लिए GMD का इस्तेमाल करने पर, अपने :baselineprofile टेस्ट मॉड्यूल में useConnectedDevices को false पर सेट करें:
Kotlin
baselineProfile { ... useConnectedDevices = false }
Groovy
baselineProfile { ... useConnectedDevices false }
अलग-अलग वैरिएंट के लिए बेसलाइन प्रोफ़ाइलें जनरेट करना
हर वैरिएंट, हर फ़्लेवर या सभी वैरिएंट के लिए इस्तेमाल करने के लिए, एक फ़ाइल के तौर पर बेसलाइन प्रोफ़ाइलें जनरेट की जा सकती हैं. इस व्यवहार को मर्ज सेटिंग की मदद से कंट्रोल करें. इस बारे में, ऐप्लिकेशन या लाइब्रेरी मॉड्यूल के build.gradle.kts में दिए गए उदाहरण में बताया गया है.
Kotlin
baselineProfile { mergeIntoMain = true }
Groovy
baselineProfile { mergeIntoMain true }
सभी वैरिएंट के लिए जनरेट की गई प्रोफ़ाइलों को एक ही प्रोफ़ाइल में मर्ज करने के लिए, mergeIntoMain को true पर सेट करें. इस सेटिंग के true होने पर, हर वैरिएंट के लिए बेसलाइन प्रोफ़ाइल जनरेट नहीं की जा सकतीं. इसलिए, generateBaselineProfile नाम का एक ही Gradle टास्क होता है. प्रोफ़ाइल src/main/generated/baselineProfiles पर आउटपुट होती है.
मर्ज करने की सुविधा बंद करने और हर वैरिएंट के लिए एक प्रोफ़ाइल बनाने के लिए, mergeIntoMain को false पर सेट करें. इस मामले में, वैरिएंट के हिसाब से कई Gradle टास्क मौजूद हैं. उदाहरण के लिए, अगर दो फ़्लेवर हैं, जैसे कि मुफ़्त और पैसे चुकाकर डाउनलोड किया जाने वाला वर्शन, और एक रिलीज़ बिल्ड टाइप है, तो ये टास्क पूरे किए जाते हैं:
* `generateFreeReleaseBaselineProfile`
* `generatePaidReleaseBaselineProfile`
* `generateReleaseBaselineProfile`
हर वैरिएंट के लिए मर्ज करने के तरीके की जानकारी देने के लिए, नीचे दिए गए कोड का इस्तेमाल करें:
Kotlin
baselineProfile { variants { freeRelease { mergeIntoMain = true } } }
Groovy
baselineProfile { variants { freeRelease { mergeIntoMain true } } }
पिछले उदाहरण में, जिन वैरिएंट के लिए फ़्लैग true पर सेट है उन्हें src/main/generated/baselineProfiles में मर्ज कर दिया गया है. वहीं, जिन वैरिएंट के लिए फ़्लैग false पर सेट है उनकी प्रोफ़ाइलों को src/<variant>/generated/baselineProfiles फ़ोल्डर में रखा गया है.
डिफ़ॉल्ट रूप से, लाइब्रेरी के लिए mergeIntoMain को true और ऐप्लिकेशन के लिए false पर सेट किया जाता है.
नई रिलीज़ को असेंबल करते समय, बेसलाइन प्रोफ़ाइलें अपने-आप जनरेट होना
टास्क generateBaselineProfile का इस्तेमाल मैन्युअल तरीके से करने के बजाय, हर रिलीज़ के साथ अपने-आप जनरेट होने के लिए, बेसलाइन प्रोफ़ाइलों को कॉन्फ़िगर किया जा सकता है. प्रोफ़ाइल अपने-आप जनरेट होने की सुविधा चालू होने पर, रिलीज़ बिल्ड में सबसे अपडेट की गई प्रोफ़ाइल शामिल होती है.
रिलीज़ बिल्ड के लिए, अपने-आप जनरेट होने की सुविधा चालू करने के लिए,
automaticGenerationDuringBuild फ़्लैग का इस्तेमाल करें:
Kotlin
baselineProfile { automaticGenerationDuringBuild = true }
Groovy
baselineProfile { automaticGenerationDuringBuild true }
automaticGenerationDuringBuild फ़्लैग को true पर सेट करने से, हर रिलीज़ असेंबली के लिए नई बेसलाइन प्रोफ़ाइल जनरेट होती है. इसका मतलब है कि ./gradlew:app:assembleRelease जैसे किसी असेंबल रिलीज़ बिल्ड टास्क को चलाने पर, :app:generateReleaseBaselineProfile भी ट्रिगर होता है. साथ ही, बेसलाइन प्रोफ़ाइल इंस्ट्रूमेंटेशन टेस्ट शुरू होते हैं और बेसलाइन प्रोफ़ाइल बिल्ड बनता है, जिस पर ये टेस्ट चलते हैं.
अपने-आप जनरेट होने की सुविधा से, उपयोगकर्ताओं को परफ़ॉर्मेंस से जुड़ा सबसे अच्छा फ़ायदा मिलता है. हालांकि, डबल बिल्ड और इंस्ट्रूमेंटेशन टेस्ट की वजह से, बिल्ड में लगने वाला समय भी बढ़ जाता है.
हर वैरिएंट के लिए, इस व्यवहार को भी तय किया जा सकता है, जैसा कि यहां दिए गए उदाहरण में दिखाया गया है:
Kotlin
baselineProfile { variants { freeRelease { automaticGenerationDuringBuild = true } } }
Groovy
baselineProfile { variants { freeRelease { automaticGenerationDuringBuild true } } }
पिछले उदाहरण में, assembleFreeRelease शुरू करने पर टास्क generateFreeReleaseBaselineProfile चलता है. उदाहरण के लिए, जब उपयोगकर्ता को डिस्ट्रिब्यूशन बिल्ड के लिए release और इंटरनल टेस्टिंग के लिए releaseWithoutProfile बिल्ड चाहिए, तो इससे मदद मिलती है.
बेसलाइन प्रोफ़ाइल के बिना नया वैरिएंट जोड़ने के बजाय, कमांड-लाइन से जनरेशन को इस तरह बंद किया जा सकता है:
./gradlew assembleRelease -Pandroid.baselineProfile.automaticGenerationDuringBuild=false
सोर्स में बेसलाइन प्रोफ़ाइलें सेव करना
ऐप्लिकेशन या लाइब्रेरी मॉड्यूल के build.gradle.kts में मौजूद saveInSrc
फ़्लैग की मदद से, सोर्स डायरेक्ट्री में बेसलाइन प्रोफ़ाइलें सेव की जा सकती हैं:
true: बेसलाइन प्रोफ़ाइल कोsrc/<variant>/generated/baselineProfilesमें सेव किया जाता है. इससे, अपने सोर्स के साथ जनरेट की गई नई प्रोफ़ाइल को कमिट किया जा सकता है.false: बेसलाइन प्रोफ़ाइल, बिल्ड डायरेक्ट्री में इंटरमीडिएट फ़ाइलों में सेव होती है. इस तरह, कोड को कमिट करते समय, जनरेट की गई नई प्रोफ़ाइल सेव नहीं की जाती.
Kotlin
baselineProfile { saveInSrc = true }
Groovy
baselineProfile { saveInSrc true }
हर वैरिएंट के लिए, यह व्यवहार भी तय किया जा सकता है:
Kotlin
baselineProfile { variants { freeRelease { saveInSrc = true } } }
Groovy
baselineProfile { variants { freeRelease { saveInSrc true } } }
चेतावनियां बंद करना
डिफ़ॉल्ट रूप से, Baseline Profile Gradle प्लग इन आपको उन स्थितियों के बारे में चेतावनी देता है जिनसे समस्याएं हो सकती हैं. चेतावनियों को बंद करने के लिए, अपनी build.gradle.kts फ़ाइल में, काम का विकल्प false पर सेट किया जा सकता है. चेतावनी के विकल्प यहां दिए गए हैं:
baselineProfile {
warnings {
/**
* Warn when the Android Gradle Plugin version is higher than the max
* tested one.
*/
maxAgpVersion = true
/**
* Warn when a benchmark or baseline profile variant has been disabled.
*/
disabledVariants = true
/**
* Warn that running `generateBaselineProfile` with AGP 8.0 doesn't
* support running instrumentation tests for multiple build types at
* once.
*/
multipleBuildTypesWithAgp80 = true
/**
* Warn when no baseline profiles are generated after running the
* generate baseline profile command.
*/
noBaselineProfileRulesGenerated = true
/**
* Warn when no startup profiles are generated after running the generate
* baseline profile command.
*/
noStartupProfileRulesGenerated = true
}
}
प्रोफ़ाइल के नियमों को फ़िल्टर करना
बेसलाइन प्रोफ़ाइल Gradle प्लग इन की मदद से, जनरेट किए गए बेसलाइन प्रोफ़ाइल नियमों को फ़िल्टर किया जा सकता है. यह लाइब्रेरी के लिए खास तौर पर मददगार होता है. ऐसा तब किया जा सकता है, जब आपको उन क्लास और मेथड के लिए प्रोफ़ाइल नियमों को बाहर रखना हो जो सैंपल ऐप्लिकेशन या लाइब्रेरी की अन्य डिपेंडेंसी का हिस्सा हैं. फ़िल्टर में कुछ खास पैकेज और क्लास शामिल किए जा सकते हैं और कुछ को बाहर रखा जा सकता है. अगर सिर्फ़ बाहर रखे जाने वाले आइटम के बारे में बताया जाता है, तो सिर्फ़ मैच करने वाले बेसलाइन प्रोफ़ाइल नियमों को बाहर रखा जाता है और बाकी सभी आइटम शामिल किए जाते हैं.
फ़िल्टर की जानकारी इनमें से कोई भी हो सकती है:
- पैकेज का नाम, डबल वाइल्डकार्ड के साथ खत्म होता है, ताकि दिए गए पैकेज और सभी सब-पैकेज से मैच किया जा सके. उदाहरण के लिए,
com.example.**,com.example.methodऔरcom.example.method.barसे मैच करता है. - पैकेज का नाम, वाइल्डकार्ड के साथ खत्म होता है, ताकि सिर्फ़ तय किए गए पैकेज से मैच किया जा सके. उदाहरण के लिए,
com.example.*,com.example.methodसे मैच करता है, लेकिनcom.example.method.barसे नहीं. - किसी क्लास से मैच करने के लिए क्लास के नाम—उदाहरण के लिए,
com.example.MyClass.
यहां दिए गए उदाहरणों में, खास पैकेज को शामिल करने और बाहर रखने का तरीका बताया गया है:
Kotlin
baselineProfile { filter { include("com.somelibrary.widget.grid.**") exclude("com.somelibrary.widget.grid.debug.**") include("com.somelibrary.widget.list.**") exclude("com.somelibrary.widget.list.debug.**") include("com.somelibrary.widget.text.**") exclude("com.somelibrary.widget.text.debug.**") } }
Groovy
baselineProfile { filter { include 'com.somelibrary.widget.grid.**' exclude 'com.somelibrary.widget.grid.debug.**' include 'com.somelibrary.widget.list.**' exclude 'com.somelibrary.widget.list.debug.**' include 'com.somelibrary.widget.text.**' exclude 'com.somelibrary.widget.text.debug.**' } }
अलग-अलग वैरिएंट के लिए, फ़िल्टर के नियमों को पसंद के मुताबिक इस तरह से बनाएं:
Kotlin
// Non-specific filters applied to all the variants. baselineProfile { filter { include("com.myapp.**") } } // Flavor-specific filters. baselineProfile { variants { free { filter { include("com.myapp.free.**") } } paid { filter { include("com.myapp.paid.**") } } } } // Build-type-specific filters. baselineProfile { variants { release { filter { include("com.myapp.**") } } } } // Variant-specific filters. baselineProfile { variants { freeRelease { filter { include("com.myapp.**") } } } }
Groovy
// Non-specific filters applied to all the variants. baselineProfile { filter { include 'com.myapp.**' } } // Flavor-specific filters. baselineProfile { variants { free { filter { include 'com.myapp.free.**' } } paid { filter { include 'com.myapp.paid.**' } } } } // Build-type specific filters. baselineProfile { variants { release { filter { include 'com.myapp.**' } } } } // Variant-specific filters. baselineProfile { variants { freeRelease { filter { include 'com.myapp.**' } } } }
BaselineProfileRule.collect() में filterPredicate आर्ग्युमेंट का इस्तेमाल करके भी नियमों को फ़िल्टर किया जा सकता है. हालांकि, हमारा सुझाव है कि फ़िल्टर करने के लिए Gradle प्लग इन का इस्तेमाल करें, क्योंकि इससे सब-पैकेज को फ़िल्टर करने का आसान तरीका मिलता है. साथ ही, पूरे मॉड्यूल को कॉन्फ़िगर करने के लिए एक ही जगह मिलती है.
बेंचमार्क और बेसलाइन प्रोफ़ाइल के बिल्ड टाइप को पसंद के मुताबिक बनाना
बेसलाइन प्रोफ़ाइल Gradle प्लग इन, प्रोफ़ाइलें जनरेट करने और बेंचमार्क चलाने के लिए, अतिरिक्त बिल्ड टाइप बनाता है. इन बिल्ड टाइप के नाम के आगे, benchmark और nonMinified लगा होता है. उदाहरण के लिए, release बिल्ड टाइप के लिए, प्लग इन benchmarkRelease और nonMinifiedRelease बिल्ड टाइप बनाता है.
ये बिल्ड टाइप, इस्तेमाल के खास उदाहरण के लिए अपने-आप कॉन्फ़िगर हो जाते हैं और आम तौर पर इन्हें पसंद के मुताबिक बनाने की ज़रूरत नहीं होती. हालांकि, कुछ मामलों में कुछ कस्टम विकल्प लागू करना अब भी फ़ायदेमंद हो सकता है. उदाहरण के लिए, साइन करने के लिए कोई दूसरा कॉन्फ़िगरेशन लागू करना.
अपने-आप जनरेट हुए बिल्ड टाइप को पसंद के मुताबिक बनाया जा सकता है. इसके लिए, बिल्ड टाइप प्रॉपर्टी के सबसेट का इस्तेमाल करें. जिन प्रॉपर्टी का इस्तेमाल नहीं किया जा सकता उन्हें बदल दिया जाता है. यहां दिए गए उदाहरण में, अतिरिक्त बिल्ड टाइप को पसंद के मुताबिक बनाने का तरीका बताया गया है. साथ ही, यह भी बताया गया है कि किन प्रॉपर्टी को बदला जाता है:
Kotlin
android { buildTypes { release { ... } create("benchmarkRelease") { // Customize properties for the `benchmarkRelease` build type here. // For example, you can change the signing config (by default // it's the same as for the `release` build type). signingConfig = signingConfigs.getByName("benchmarkRelease") } create("nonMinifiedRelease") { // Customize properties for the `nonMinifiedRelease` build type here. signingConfig = signingConfigs.getByName("nonMinifiedRelease") // From Baseline Profile Gradle plugin 1.2.4 and higher, you can't // customize the following properties, which are always overridden to // avoid breaking Baseline Profile generation: // // isJniDebuggable = false // isDebuggable = false // isMinifyEnabled = false // isShrinkResources = false // isProfileable = true // enableAndroidTestCoverage = false // enableUnitTestCoverage = false } } }
Groovy
android { buildTypes { release { ... } benchmarkRelease { // Customize properties for the `benchmarkRelease` build type here. // For example, you can change the signing config (by default it's the // same as for the `release` build type.) signingConfig = signingConfigs.benchmarkRelease } nonMinifiedRelease { // Customize properties for the `nonMinifiedRelease` build type here. signingConfig = signingConfigs.nonMinifiedRelease // From Baseline Profile Gradle plugin 1.2.4 and higher, you can't use // the following properties, which are always overridden to avoid breaking // Baseline Profile generation: // // isJniDebuggable = false // isDebuggable = false // isMinifyEnabled = false // isShrinkResources = false // isProfileable = true // enableAndroidTestCoverage = false // enableUnitTestCoverage = false } } }
अतिरिक्त नोट
बेसलाइन प्रोफ़ाइलें बनाते समय, इन बातों का ध्यान रखें:
कंपाइल की गई बेसलाइन प्रोफ़ाइलों का साइज़ 1.5 एमबी से कम होना चाहिए. यह बात, आपकी सोर्स फ़ाइलों के टेक्स्ट फ़ॉर्मैट पर लागू नहीं होती. आम तौर पर, कंपाइल करने से पहले ये फ़ाइलें काफ़ी बड़ी होती हैं. APK के लिए
assets/dexopt/baseline.profया AAB के लिएBUNDLE-METADATA/com.android.tools.build.profiles/baseline.profमें जाकर, आउटपुट आर्टफ़ैक्ट में अपनी बाइनरी बेसलाइन प्रोफ़ाइल ढूंढें और उसके साइज़ की पुष्टि करें.ऐप्लिकेशन के बहुत ज़्यादा हिस्से को कंपाइल करने वाले बड़े नियमों की वजह से, डिस्क ऐक्सेस बढ़ने से स्टार्टअप धीमा हो सकता है. अगर आपने अभी-अभी बेसलाइन प्रोफ़ाइलों का इस्तेमाल शुरू किया है, तो इस बारे में चिंता न करें. हालांकि, आपके ऐप्लिकेशन और गतिविधियों के साइज़ और संख्या के आधार पर, गतिविधियों की संख्या ज़्यादा होने पर परफ़ॉर्मेंस बेहतर नहीं हो सकती. अलग-अलग प्रोफ़ाइलों को आज़माकर, अपने ऐप्लिकेशन की परफ़ॉर्मेंस की जांच करें. साथ ही, यह पुष्टि करें कि जोड़े गए एलिमेंट की वजह से, परफ़ॉर्मेंस में गिरावट न आई हो.