बेसलाइन प्रोफ़ाइल जनरेट करने की प्रोसेस कॉन्फ़िगर करें

बेसलाइन प्रोफ़ाइल Gradle प्लग इन की मदद से, बेसलाइन प्रोफ़ाइल जनरेट करना और उन्हें मैनेज करना आसान हो जाता है. इससे आपको ये काम करने में मदद मिलती है:

इस पेज पर, बेसलाइन प्रोफ़ाइल बनाने के तरीके को पसंद के मुताबिक बनाने के लिए, बेसलाइन प्रोफ़ाइल 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 बिल्ड चाहिए, तो इससे मदद मिलती है.

सोर्स में बेसलाइन प्रोफ़ाइलें सेव करना

ऐप्लिकेशन या लाइब्रेरी मॉड्यूल के 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 में जाकर, आउटपुट आर्टफ़ैक्ट में अपनी बाइनरी बेसलाइन प्रोफ़ाइल ढूंढें और उसके साइज़ की पुष्टि करें.

  • ऐप्लिकेशन के बहुत ज़्यादा हिस्से को कंपाइल करने वाले बड़े नियमों की वजह से, डिस्क ऐक्सेस बढ़ने से स्टार्टअप धीमा हो सकता है. अगर आपने अभी-अभी बेसलाइन प्रोफ़ाइलों का इस्तेमाल शुरू किया है, तो इस बारे में चिंता न करें. हालांकि, आपके ऐप्लिकेशन और गतिविधियों के साइज़ और संख्या के आधार पर, गतिविधियों को ज़्यादा जोड़ने से परफ़ॉर्मेंस पर असर पड़ सकता है. अलग-अलग प्रोफ़ाइलों को आज़माकर, अपने ऐप्लिकेशन की परफ़ॉर्मेंस की जांच करें. साथ ही, यह पुष्टि करें कि जोड़े गए एलिमेंट की वजह से, परफ़ॉर्मेंस में गिरावट न आई हो.

कोडलैब

परफ़ॉर्मेंस मेज़र करने के लिए, मैक्रोबेंचमार्किंग के बारे में जानें.
किसी Android ऐप्लिकेशन के हिसाब से कस्टम बेसलाइन प्रोफ़ाइल जनरेट करें और इसकी असरदारी की पुष्टि करें.