बेसलाइन प्रोफ़ाइल की खास जानकारी

बेसलाइन प्रोफ़ाइलें, शामिल किए गए कोड पाथ के लिए, कोड को समझने और जस्ट-इन-टाइम (JIT) कंपाइलेशन के चरणों को छोड़कर, कोड को एक्ज़ीक्यूट करने की स्पीड को पहले लॉन्च से करीब 30% तक बेहतर बनाती हैं.

किसी ऐप्लिकेशन या लाइब्रेरी में बेसलाइन प्रोफ़ाइल शिप करने पर, Android Runtime (ART), पहले से (AOT) कंपाइलेशन की मदद से, तय किए गए कोड पाथ को ऑप्टिमाइज़ कर सकता है. इससे, हर नए उपयोगकर्ता और ऐप्लिकेशन के हर अपडेट के लिए परफ़ॉर्मेंस बेहतर होती है. प्रोफ़ाइल के हिसाब से ऑप्टिमाइज़ेशन (PGO) की मदद से, ऐप्लिकेशन को स्टार्टअप ऑप्टिमाइज़ करने, इंटरैक्शन में आने वाली रुकावट को कम करने, और पहली बार लॉन्च करने पर उपयोगकर्ताओं के लिए रनटाइम की परफ़ॉर्मेंस को बेहतर बनाने में मदद मिलती है.

परफ़ॉर्मेंस में हुए इन सुधारों से, कारोबार की मेट्रिक में सीधे तौर पर सुधार होता है. जैसे, उपयोगकर्ताओं को अपने साथ जोड़े रखने की दर, लेन-देन, और रेटिंग. Josh, Lyft, TikTok, और Zomato की कहानियों से, इस बारे में ज़्यादा पढ़ा जा सकता है कि परफ़ॉर्मेंस का कारोबार की मेट्रिक पर क्या असर पड़ता है.

बेसलाइन प्रोफ़ाइलों के फ़ायदे

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

बेसलाइन प्रोफ़ाइलें, ऐप्लिकेशन के स्टार्टअप के बाद भी ऑप्टिमाइज़ेशन में मदद करती हैं. इसके लिए, वे सामान्य उपयोगकर्ता इंटरैक्शन उपलब्ध कराती हैं, जो ऐप्लिकेशन के पहले लॉन्च से ही ऐप्लिकेशन के रनटाइम को बेहतर बनाते हैं. गाइडेड एओटी संकलन, उपयोगकर्ता के डिवाइसों पर निर्भर नहीं करता. साथ ही, इसे हर रिलीज़ के लिए, मोबाइल डिवाइस के बजाय डेवलपमेंट मशीन पर एक बार किया जा सकता है. रिलीज़ को बेसलाइन प्रोफ़ाइल के साथ शिप करने पर, ऐप्लिकेशन ऑप्टिमाइज़ेशन ज़्यादा तेज़ी से उपलब्ध हो जाते हैं. ऐसा सिर्फ़ क्लाउड प्रोफ़ाइल पर निर्भर रहने की तुलना में होता है.

बेसलाइन प्रोफ़ाइल का इस्तेमाल न करने पर, ऐप्लिकेशन का पूरा कोड, डिकोड होने के बाद, मेमोरी में JIT-कंपाइल किया जाता है. इसके अलावा, डिवाइस के खाली होने पर, बैकग्राउंड में odex फ़ाइल में भी कोड लिखा जाता है. किसी ऐप्लिकेशन को इंस्टॉल या अपडेट करने के बाद, जब तक नए कोड पाथ को ऑप्टिमाइज़ नहीं किया जाता, तब तक उपयोगकर्ताओं को पहली बार इसे चलाने पर अच्छा अनुभव नहीं मिलता. कई ऐप्लिकेशन, ऑप्टिमाइज़ करने के बाद परफ़ॉर्मेंस में करीब 30% की बढ़ोतरी का आकलन करते हैं.

स्टार्टअप प्रोफ़ाइलें

स्टार्टअप प्रोफ़ाइलें, बेसलाइन प्रोफ़ाइलों से मिलती-जुलती होती हैं. हालांकि, इनका इस्तेमाल डिवाइस पर ऑप्टिमाइज़ेशन के लिए नहीं, बल्कि कंपाइल करने के समय किया जाता है. स्टार्टअप प्रोफ़ाइल का इस्तेमाल, DEX फ़ाइल के लेआउट को ऑप्टिमाइज़ करने के लिए किया जाता है, ताकि डिवाइस को चालू होने में लगने वाला समय कम हो. स्टार्टअप प्रोफ़ाइल में पहचाने गए कोड को मुख्य classes.dex फ़ाइल में डाला जाता है और अन्य कोड को अलग-अलग DEX फ़ाइलों में डाला जाता है. इससे ऐप्लिकेशन के खुलने के दौरान पेज फ़ॉल्ट की संख्या कम हो जाती है और ऐप्लिकेशन के खुलने में लगने वाला समय कम हो जाता है. स्टार्टअप प्रोफ़ाइल और DEX लेआउट ऑप्टिमाइज़ेशन से, ऐप्लिकेशन के स्टार्टअप में लगने वाले समय को बेहतर बनाने के तरीके के बारे में ज़्यादा जानने के लिए, DEX लेआउट ऑप्टिमाइज़ेशन और स्टार्टअप प्रोफ़ाइल लेख पढ़ें.

शुरू करें

अपने मौजूदा ऐप्लिकेशन की परफ़ॉर्मेंस को ऑप्टिमाइज़ करने के लिए, बेसलाइन प्रोफ़ाइलें बनाना लेख पढ़ें.

डिपेंडेंसी चेन, रिलीज़ किए गए जांचे और परखे गए वर्शन और डेवलपमेंट वर्शन उपलब्ध कराती है. बेसलाइन प्रोफ़ाइल जनरेट करने और इंस्टॉल करने के लिए, Android Gradle प्लग इन, Macrobenchmark लाइब्रेरी, और प्रोफ़ाइल इंस्टॉलर के इन वर्शन या इनसे नए वर्शन का इस्तेमाल करें. इन डिपेंडेंसी की ज़रूरत अलग-अलग समय पर पड़ती है. साथ ही, ये एक बेहतर बेसलाइन प्रोफ़ाइल चालू करने के लिए, टूलचेन के तौर पर साथ मिलकर काम करती हैं.

  • Android Gradle प्लग इन: com.android.tools.build:8.0.0
  • Macrobenchmark लाइब्रेरी: androidx.benchmark:benchmark-macro-junit4:1.3.3
  • प्रोफ़ाइल इंस्टॉलर: androidx.profileinstaller:profileinstaller:1.4.1

हमारा सुझाव है कि बेसलाइन प्रोफ़ाइलें बनाने और मैनेज करने के लिए, AGP के सबसे नए वर्शन का इस्तेमाल करें. यहां AGP के अलग-अलग वर्शन के साथ मिलने वाली मुख्य सुविधाएं दी गई हैं:

AGP वर्शन सुविधाएं
8.4 Gradle Wrapper कमांड-लाइन टूल या Android Studio के ज़रिए, डिबग नहीं किए जा सकने वाले बिल्ड के लोकल ऐप्लिकेशन इंस्टॉलेशन. इससे, आपके लोकल रिलीज़ बिल्ड की परफ़ॉर्मेंस, प्रोडक्शन के बिलकुल करीब होती है. इस अपडेट का असर, बेसलाइन प्रोफ़ाइलों की प्रोडक्शन परफ़ॉर्मेंस पर नहीं पड़ता.
8.3
  • पूरे सोर्स सेट डायरेक्ट्री के साथ काम करने की सुविधा (लाइब्रेरी मॉड्यूल): एक से ज़्यादा बेसलाइन प्रोफ़ाइल सोर्स फ़ाइलों का एलान करें और वैरिएंट के हिसाब से काम करने वाली डायरेक्ट्री का इस्तेमाल करें. जैसे, अब लाइब्रेरी मॉड्यूल के साथ-साथ ऐप्लिकेशन मॉड्यूल के लिए भी src/free/generated/baselineProfiles/baseline-prof1.txt का इस्तेमाल किया जा सकता है.
  • बेसलाइन प्रोफ़ाइलों में, सुगर लेवल हटाई गई क्लास शामिल होती हैं.
8.2
  • R8 में नियमों को फिर से लिखना: D8 और R8, ऐसे नियमों को बदल सकते हैं जिन्हें मनुष्य पढ़ सकता है. जैसे, बेसलाइन और स्टार्टअप प्रोफ़ाइल के नियम. इससे, ऐप्लिकेशन की परफ़ॉर्मेंस को ऑप्टिमाइज़ करने के लिए ज़रूरी सभी नियमों को पूरी तरह से कैप्चर किया जा सकता है. इससे, तरीकों की आधारभूत प्रोफ़ाइल कवरेज में ~30% की बढ़ोतरी होती है और ऐप्लिकेशन की परफ़ॉर्मेंस में ~15% की बढ़ोतरी होती है.
  • स्टार्टअप प्रोफ़ाइलें: DEX में कोड के लेआउट की जानकारी देने के लिए, इस तरह की नई बेसलाइन प्रोफ़ाइल जनरेट करें. इससे ऐप्लिकेशन के शुरू होने की परफ़ॉर्मेंस में करीब 15% की बढ़ोतरी होती है. बड़े ऐप्लिकेशन के लिए, यह बढ़ोतरी काफ़ी ज़्यादा हो सकती है.
8.0 सुझाया गया कम से कम वर्शन: एक ही Gradle टास्क की मदद से बेसलाइन प्रोफ़ाइल जनरेट करने के लिए, बेसलाइन प्रोफ़ाइल Gradle प्लग इन का इस्तेमाल करें.
  • पूरे सोर्स सेट डायरेक्ट्री के साथ काम करना (ऐप्लिकेशन मॉड्यूल): एक से ज़्यादा बेसलाइन प्रोफ़ाइल के सोर्स फ़ाइलों का एलान करें और वैरिएंट के हिसाब से डायरेक्ट्री का इस्तेमाल करें, जैसे कि src/free/generated/baselineProfiles/baseline-prof1.txt.
7.4 काम करने वाला कम से कम वर्शन: ऐप्लिकेशन, लाइब्रेरी से आधारभूत प्रोफ़ाइलों का इस्तेमाल कर सकते हैं. साथ ही, src/main/baseline-prof.txt फ़ाइल में अपनी आधारभूत प्रोफ़ाइल उपलब्ध करा सकते हैं.
  • ऐप्लिकेशन बंडल से APK बनाते समय, आधारभूत प्रोफ़ाइलों को सही तरीके से पैकेज किया जाता है (समस्या #230361284).
  • एक से ज़्यादा .dex फ़ाइल वाले ऐप्लिकेशन के लिए, प्राइमरी .dex फ़ाइल के लिए, आधारभूत प्रोफ़ाइलों को सही तरीके से पैकेज किया जाता है.

प्रोफ़ाइल जनरेट करने का उदाहरण

यहां ऐप्लिकेशन के स्टार्टअप के लिए बेसलाइन प्रोफ़ाइल बनाने के साथ-साथ, सुझाई गई Macrobenchmark लाइब्रेरी का इस्तेमाल करके, कई नेविगेशन और स्क्रोल इवेंट बनाने के लिए क्लास का उदाहरण दिया गया है:

@OptIn(ExperimentalBaselineProfilesApi::class)
class BaselineProfileGenerator {
    @get:Rule
    val baselineProfileRule = BaselineProfileRule()

    @Test
    fun appStartupAndUserJourneys() {
        baselineProfileRule.collect(packageName = PACKAGE_NAME) {
            // App startup journey.
            startActivityAndWait()

            device.findObject(By.text("COMPOSE LAZYLIST")).clickAndWait(Until.newWindow(), 1_000)
            device.findObject(By.res("myLazyColumn")).also {
                it.fling(Direction.DOWN)
                it.fling(Direction.UP)
            }
            device.pressBack()
        }
    }
}

इस कोड को पूरी जानकारी के साथ देखा जा सकता है. साथ ही, GitHub पर मौजूद परफ़ॉर्मेंस सैंपल में जाकर, इस बारे में ज़्यादा जानकारी भी पाई जा सकती है.

अपील वाले वीडियो में क्या शामिल करना है

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

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

लाइब्रेरी, अपनी बेसलाइन प्रोफ़ाइल उपलब्ध करा सकती हैं और उन्हें रिलीज़ के साथ शिप कर सकती हैं, ताकि ऐप्लिकेशन की परफ़ॉर्मेंस को बेहतर बनाया जा सके. उदाहरण के लिए, Jetpack Compose की परफ़ॉर्मेंस में बेसलाइन प्रोफ़ाइल सेक्शन का इस्तेमाल करना देखें.

बेसलाइन प्रोफ़ाइलें कैसे काम करती हैं

अपने ऐप्लिकेशन या लाइब्रेरी को डेवलप करते समय, आधारभूत प्रोफ़ाइलें तय करें. इससे, उन सामान्य उपयोगकर्ता इंटरैक्शन को कवर किया जा सकता है जहां रेंडरिंग में लगने वाला समय या इंतज़ार का समय अहम होता है. ये इस तरह से काम करते हैं:

  1. आपके ऐप्लिकेशन के लिए, प्रोफ़ाइल के ऐसे नियम जनरेट किए जाते हैं जिन्हें कोई भी व्यक्ति पढ़ सकता है. साथ ही, इन्हें ऐप्लिकेशन में बाइनरी फ़ॉर्मैट में कंपाइल किया जाता है. इन्हें assets/dexopt/baseline.prof में देखा जा सकता है. इसके बाद, AAB को Google Play पर पहले की तरह अपलोड किया जा सकता है.

  2. Google Play, प्रोफ़ाइल को प्रोसेस करता है और उसे सीधे उपयोगकर्ताओं को APK के साथ भेजता है. इंस्टॉलेशन के दौरान, ART प्रोफ़ाइल में मौजूद तरीकों का एओटी कंपाइलेशन करता है. इससे, उन तरीकों को तेज़ी से चलाया जा सकता है. अगर प्रोफ़ाइल में, ऐप्लिकेशन लॉन्च करने या फ़्रेम रेंडर करने के दौरान इस्तेमाल किए गए तरीके शामिल हैं, तो उपयोगकर्ता को ऐप्लिकेशन लॉन्च होने में कम समय लगेगा और ऐप्लिकेशन में रुकावट भी कम आएगी.

  3. यह फ़्लो, समय के साथ ऐप्लिकेशन के इस्तेमाल के आधार पर परफ़ॉर्मेंस को बेहतर बनाने के लिए, क्लाउड प्रोफ़ाइलों के एग्रीगेशन के साथ मिलकर काम करता है.

पहली इमेज. इस डायग्राम में, अपलोड से लेकर असली उपयोगकर्ता तक डिलीवरी के बीच, बेसलाइन प्रोफ़ाइल के वर्कफ़्लो को दिखाया गया है. साथ ही, यह भी बताया गया है कि यह वर्कफ़्लो, Cloud प्रोफ़ाइलों से कैसे जुड़ा है.

Cloud प्रोफ़ाइलें

क्लाउड प्रोफ़ाइलें, बेसलाइन प्रोफ़ाइलों के साथ-साथ PGO का एक और फ़ॉर्म उपलब्ध कराती हैं. इसे Google Play Store इकट्ठा करता है और इंस्टॉल के समय कंपाइल करने के लिए डिस्ट्रिब्यूट करता है.

क्लाउड प्रोफ़ाइलें, ऐप्लिकेशन के साथ उपयोगकर्ता के असल इंटरैक्शन पर आधारित होती हैं. हालांकि, अपडेट को डिस्ट्रिब्यूट होने में कई घंटे से लेकर कई दिन लग सकते हैं. इस वजह से, इनकी उपलब्धता सीमित हो जाती है. जब तक प्रोफ़ाइलें पूरी तरह से डिस्ट्रिब्यूट नहीं हो जातीं, तब तक नए या अपडेट किए गए ऐप्लिकेशन के उपयोगकर्ताओं के लिए ऐप्लिकेशन की परफ़ॉर्मेंस अच्छी नहीं होती. इसके अलावा, Cloud Profile की सुविधा सिर्फ़ Android 9 (एपीआई लेवल 28) या उसके बाद के वर्शन वाले Android डिवाइसों पर काम करती है. साथ ही, यह सुविधा सिर्फ़ उन ऐप्लिकेशन के लिए सही से काम करती है जिनका उपयोगकर्ता आधार काफ़ी बड़ा हो.

Android के सभी वर्शन पर कॉम्पाइल करने का तरीका

Android प्लैटफ़ॉर्म के वर्शन, ऐप्लिकेशन को कंपाइल करने के अलग-अलग तरीकों का इस्तेमाल करते हैं. इनमें से हर तरीके की परफ़ॉर्मेंस अलग-अलग होती है. बेसलाइन प्रोफ़ाइलें, सभी इंस्टॉल के लिए प्रोफ़ाइल उपलब्ध कराकर, कोड को इकट्ठा करने के पिछले तरीकों को बेहतर बनाती हैं.

Android वर्शन कंपाइल करने का तरीका ऑप्टिमाइज़ेशन का तरीका
5 से 6 (एपीआई लेवल 21 से 23) फ़ुल AOT इंस्टॉल के दौरान, पूरे ऐप्लिकेशन को ऑप्टिमाइज़ किया जाता है. इससे, ऐप्लिकेशन इस्तेमाल करने में ज़्यादा समय लगता है, रैम और डिस्क स्टोरेज का इस्तेमाल बढ़ता है, और डिस्क से कोड लोड होने में ज़्यादा समय लगता है. साथ ही, ऐप्लिकेशन को पहली बार चालू करने में भी ज़्यादा समय लग सकता है.
7 से लेकर 8.1 (एपीआई लेवल 24 से लेकर 27) कुछ हिस्से के लिए AOT (बेसलाइन प्रोफ़ाइल) ऐप्लिकेशन मॉड्यूल के इस डिपेंडेंसी को तय करने पर, पहली बार चलाने पर androidx.profileinstaller, बेसलाइन प्रोफ़ाइलें इंस्टॉल करता है. ART, ऐप्लिकेशन के इस्तेमाल के दौरान प्रोफ़ाइल के लिए और नियम जोड़कर और डिवाइस के खाली होने पर उन्हें कंपाइल करके, इस पर और भी बेहतर तरीके से काम कर सकता है. इससे डिस्क स्पेस और डिस्क से कोड लोड करने में लगने वाले समय को ऑप्टिमाइज़ किया जाता है. इससे ऐप्लिकेशन के खुलने में लगने वाला समय कम हो जाता है.
9 (एपीआई लेवल 28) और इससे बाद के वर्शन आंशिक AOT (बेसलाइन + क्लाउड प्रोफ़ाइल) Play, ऐप्लिकेशन इंस्टॉल करने के दौरान, APK और Cloud प्रोफ़ाइलों को ऑप्टिमाइज़ करने के लिए, बेसलाइन प्रोफ़ाइलों का इस्तेमाल करता है. हालांकि, ऐसा तब ही होता है, जब ये प्रोफ़ाइलें उपलब्ध हों. इंस्टॉल होने के बाद, ART प्रोफ़ाइलों को Play पर अपलोड किया जाता है और एग्रीगेट किया जाता है. इसके बाद, जब अन्य उपयोगकर्ता ऐप्लिकेशन को इंस्टॉल या अपडेट करते हैं, तो उन्हें Cloud प्रोफ़ाइलों के तौर पर उपलब्ध कराया जाता है.

पहले से मालूम समस्याएं

यहां कुछ समस्याएं और उनके समाधान बताए गए हैं. इसके अलावा, ऐसी समस्याएं भी हैं जिनके लिए, काम चलाने वाले तरीके पर काम जारी है:

  • OnePlus डिवाइसों के साथ-साथ कुछ डिवाइसों पर अनुमति सेटिंग की वजह से, बेसलाइन प्रोफ़ाइल जनरेट नहीं हो सकती. इस समस्या को हल करने के लिए, डेवलपर के लिए सेटिंग और टूल की सेटिंग में जाकर, अनुमति की निगरानी बंद करें विकल्प को बंद करें.

  • बेसलाइन प्रोफ़ाइल जनरेशन की सुविधा, Firebase टेस्ट लैब के डिवाइसों पर काम नहीं करती. इनमें, Gradle से मैनेज किए जाने वाले टेस्ट लैब डिवाइस भी शामिल हैं (समस्या #285187547).

  • लाइब्रेरी के लिए बेसलाइन प्रोफ़ाइलें उपलब्ध कराने के लिए, कम से कम बेसलाइन प्रोफ़ाइल Gradle प्लग इन 1.2.3 या AGP 8.3 का इस्तेमाल करें (समस्या #313992099).

  • अगर ./gradlew app:generateBaselineProfile कमांड का इस्तेमाल करके बेसलाइन प्रोफ़ाइलें जनरेट की जाती हैं, तो टेस्ट मॉड्यूल में मौजूद मानदंड भी चलते हैं और नतीजों को खारिज कर दिया जाता है. अगर ऐसा होता है, तो -P android.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfile के साथ निर्देश चलाकर, सिर्फ़ बेसलाइन प्रोफ़ाइलें जनरेट की जा सकती हैं. इस समस्या को AGP 8.2 में ठीक कर दिया गया है.

  • सभी तरह के बिल्ड के लिए बेसलाइन प्रोफ़ाइल जनरेट करने का निर्देश— ./gradlew app:generateBaselineProfile—सिर्फ़ रिलीज़ बिल्ड के लिए बेसलाइन प्रोफ़ाइल जनरेट करता है. इस समस्या को AGP 8.1 में ठीक कर दिया गया है.

  • ऐसा हो सकता है कि Google Play Store के अलावा, अन्य ऐप्लिकेशन डिस्ट्रिब्यूशन चैनल पर, इंस्टॉल करते समय बेसलाइन प्रोफ़ाइलों का इस्तेमाल न किया जा सके. इन चैनलों से इंस्टॉल किए गए ऐप्लिकेशन के उपयोगकर्ताओं को, बैकग्राउंड में dexopt चलने तक फ़ायदे नहीं मिलते. ऐसा रात भर में हो सकता है.

  • Play Store पर संगठन में काम करने वालों के साथ ऐप्लिकेशन शेयर करने की सुविधा, बेसलाइन प्रोफ़ाइलों के साथ काम नहीं करती. हालांकि, इंटरनल टेस्टिंग ट्रैक के साथ काम करती है.

  • Huawei डिवाइसों जैसे कुछ डिवाइसों पर बैटरी ऑप्टिमाइज़ेशन की सुविधा, प्रोफ़ाइल इंस्टॉल करने में रुकावट डाल सकती है. यह पक्का करने के लिए कि आपकी प्रोफ़ाइलें सही तरीके से इंस्टॉल हों, अपने बेंचमार्क डिवाइसों में बैटरी ऑप्टिमाइज़ेशन की सुविधा बंद करें.

अन्य संसाधन