केस स्टडी

Reddit ने परफ़ॉर्मेंस में बड़े सुधार करने के लिए, R8 ऑप्टिमाइज़र का इस्तेमाल कैसे किया

चार मिनट में पढ़ें
Ben Weiss
डेवलपर रिलेशंस इंजीनियर

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

R8 ऑप्टिमाइज़र ने Reddit की मदद कैसे की

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

  • ट्री शेकिंग , ऐप्लिकेशन का साइज़ कम करने का सबसे अहम तरीका है. इसमें, ऐप्लिकेशन की डिपेंडेंसी और ऐप्लिकेशन में इस्तेमाल न होने वाले कोड को हटा दिया जाता है.
  • मेथड इनलाइनिंग, मेथड कॉल को असल कोड से बदलता है. इससे ऐप्लिकेशन की परफ़ॉर्मेंस बेहतर होती है.
  • कोड को ज़्यादा कॉम्पैक्ट बनाने के लिए, क्लास मर्जिंग और अन्य रणनीतियां लागू की जाती हैं. इस दौरान, सोर्स कोड को पढ़ने में आसानी हो, यह ज़रूरी नहीं है. हालांकि, कंपाइल किए गए कोड का तेज़ी से काम करना ज़रूरी है. इसलिए, इंटरफ़ेस या क्लास हाइरार्की जैसे ऐब्सट्रैक्शन यहां मायने नहीं रखते और इन्हें हटा दिया जाएगा.
  • आइडेंटिफ़ायर मिनिफ़िकेशन, क्लास, फ़ील्ड, और मेथड के नामों को छोटे और बिना मतलब वाले नामों में बदलता है. इसलिए, हो सकता है कि MyDataModel के बजाय, आपको a नाम की क्लास मिले.
  • रिसॉर्स श्रिंकिंग , ऐप्लिकेशन का साइज़ और कम करने के लिए, इस्तेमाल न होने वाले रिसॉर्स हटाता है. जैसे, एक्सएमएल फ़ाइलें और ड्रॉएबल.
image.png

R8 ऑप्टिमाइज़ेशन के मुख्य चरण

डेटा से उपयोगकर्ता की संतुष्टि तक: प्रोडक्शन में सफलता की पहचान करना

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

image.png

R8 ने Reddit के ऐप्लिकेशन की परफ़ॉर्मेंस को कैसे बेहतर बनाया

टीम ने पाया कि कोल्ड स्टार्टअप 40% तेज़ी से हुआ, "ऐप्लिकेशन काम नहीं कर रहा है" (एएनआर) से जुड़ी गड़बड़ियों में 30% की कमी आई, फ़्रेम रेंडरिंग में 25% का सुधार हुआ, और ऐप्लिकेशन का साइज़ 14% कम हुआ.

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

ऑप्टिमाइज़ेशन की सफलता के बारे में, लोगों की संतुष्टि के इंडिकेटर सीधे Google Play Store पर देखे जा सकते हैं. R8 से ऑप्टिमाइज़ किया गया वर्शन रोल आउट करने के बाद, टीम ने लोगों की प्रतिक्रियाओं और जुड़ाव में बड़ा और पॉज़िटिव बदलाव देखा.

image.png

Drew Heavner: "R8 की पूरी क्षमता का इस्तेमाल करने में दो हफ़्ते से भी कम समय लगा"

सबसे अहम बात यह है कि यह काम, पूरी कोशिश के साथ किया गया. Reddit के स्टाफ़ सॉफ़्टवेयर इंजीनियर Drew Heavner ने इस पहल पर काम किया. उन्होंने बताया कि R8 की पूरी क्षमता का इस्तेमाल करने के लिए, बदलावों को लागू करने में दो हफ़्ते से भी कम समय लगा.

फ़ायदों की पुष्टि करना: मैक्रो बेंचमार्क की मदद से डीप डाइव करना

असल दुनिया में हुए अहम सुधारों को देखने के बाद, Reddit की इंजीनियरिंग टीम और Google की Android Developer Relations टीम ने, फ़ायदों की वैज्ञानिक तरीके से पुष्टि करने और आगे के ऑप्टिमाइज़ेशन के लिए एक्सपेरिमेंट करने के लिए, बेंचमार्क की मदद से डीटेल में जांच की. इस विश्लेषण के लिए, Reddit की इंजीनियरिंग टीम ने अपने ऐप्लिकेशन के दो वर्शन उपलब्ध कराए: एक बिना ऑप्टिमाइज़ेशन वाला और दूसरा, जिसमें R8 और परफ़ॉर्मेंस ऑप्टिमाइज़ेशन के दो और बुनियादी टूल इस्तेमाल किए गए थे: बेसलाइन प्रोफ़ाइल और स्टार्टअप प्रोफ़ाइल.

बेसलाइन प्रोफ़ाइल, Just in Time (JIT) कंपाइलेशन के चरणों को लोगों के डिवाइसों से हटाकर, डेवलपर की मशीनों पर ले जाती हैं. Ahead Of Time (AOT) कंपाइल किए गए कोड से, ऐप्लिकेशन के खुलने में लगने वाला समय और रेंडरिंग से जुड़ी समस्याएं कम होती हैं.

जब कोई ऐप्लिकेशन पैकेज किया जाता है, तो d8 dexer क्लास और मेथड लेता है और आपके ऐप्लिकेशन की classes.dex फ़ाइलें बनाता है. जब कोई व्यक्ति ऐप्लिकेशन खोलता है, तो ये dex फ़ाइलें एक के बाद एक लोड होती हैं. यह प्रोसेस तब तक चलती है, जब तक ऐप्लिकेशन खुल नहीं जाता. स्टार्टअप प्रोफ़ाइल उपलब्ध कराकर, d8 को यह बताया जाता है कि पहली classes.dex फ़ाइलों में किन क्लास और मेथड को पैक करना है. इस स्ट्रक्चर से, ऐप्लिकेशन कम फ़ाइलें लोड करता है. इससे, ऐप्लिकेशन के खुलने की स्पीड बेहतर होती है.

Jetpack Macrobenchmark इस चरण के लिए मुख्य टूल था. इसकी मदद से, कंट्रोल किए गए एनवायरमेंट में, लोगों के इंटरैक्शन को सटीक तरीके से मापा जा सकता है. लोगों के सामान्य अनुभव को सिम्युलेट करने के लिए, उन्होंने **UIAutomator API** का इस्तेमाल करके एक टेस्ट बनाया. इस टेस्ट में, ऐप्लिकेशन खोला गया, तीन बार नीचे की ओर स्क्रोल किया गया, और फिर ऊपर की ओर स्क्रोल किया गया.

बेंचमार्क लिखने के लिए, सिर्फ़ इसकी ज़रूरत थी:

uiAutomator {

  startApp(REDDIT)

  repeat(3) {

    onView { isScrollable }.fling(Direction.DOWN) }

  repeat(3) {

    onView {isScrollable }.fling(Direction.UP)

  }

}

बेंचमार्क डेटा से, फ़ील्ड में मिले नतीजों की पुष्टि हुई और अहम जानकारी मिली. पूरी तरह से ऑप्टिमाइज़ किया गया ऐप्लिकेशन 55% तेज़ी से खुला और लोग 18% पहले ब्राउज़ करना शुरू कर पाए. ऑप्टिमाइज़ किए गए ऐप्लिकेशन में, Just in Time (JIT) कंपाइलेशन के मामलों में दो-तिहाई की कमी आई और JIT कंपाइलेशन में लगने वाले समय में एक-तिहाई की कमी आई. फ़्रेम रेंडरिंग बेहतर हुआ. इससे, बेंचमार्क किए गए उपयोगकर्ता अनुभव के दौरान 19% ज़्यादा फ़्रेम रेंडर हुए. आखिर में, ऐप्लिकेशन का साइज़ एक-तिहाई से ज़्यादा कम हो गया.

image.png

Reddit की कुल परफ़ॉर्मेंस में हुए सुधार

कस्टम Macrobenchmark ट्रेस सेक्शन मेट्रिक की मदद से, JIT कंपाइलेशन में लगने वाले समय को मापा जा सकता है. जैसे:

val jitCompilationMetric = TraceSectionMetric("JIT Compiling %", label = "JIT compilation")

बदलाव लाने वाली टेक्नोलॉजी को चालू करना: R8

R8 को फ़ुल मोड में चालू करने के लिए, रिलीज़ बिल्ड टाइप में minifyEnabled और shrinkResources को true पर सेट करके, app/build.gradle.kts फ़ाइल को कॉन्फ़िगर करें.

android {

    ...

    buildTypes {

        release {

            isMinifyEnabled = true

            isShrinkResources = true

            proguardFiles(

                getDefaultProguardFile("proguard-android-optimize.txt"),

                "keep-rules.pro",

            )

        }

    }

}

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

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

अपने ऐप्लिकेशन में Reddit के उदाहरण को फ़ॉलो करना

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

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

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

इसे लिखा है:

पढ़ना जारी रखें