केस स्टडी

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

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

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

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

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

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

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

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

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

image.png

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

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

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

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

image.png

ड्रू हेवनर: "R8 की पूरी क्षमता वाले टूल को दो हफ़्ते से भी कम समय में चालू करना"

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

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

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

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

जब किसी ऐप्लिकेशन को पैकेज किया जाता है, तो d8 dexer क्लास और तरीकों को लेता है और आपके ऐप्लिकेशन की classes.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% पहले ब्राउज़िंग शुरू कर पाए. ऑप्टिमाइज़ किए गए ऐप्लिकेशन में, जस्ट इन टाइम (जेआईटी) कंपाइलेशन की घटनाओं में दो-तिहाई की कमी और जेआईटी कंपाइलेशन के समय में एक-तिहाई की कमी भी देखी गई. फ़्रेम रेंडरिंग में सुधार हुआ. इससे, बेंचमार्क की गई उपयोगकर्ता गतिविधि के दौरान 19% ज़्यादा फ़्रेम रेंडर हुए. आखिरकार, ऐप्लिकेशन का साइज़ एक तिहाई से ज़्यादा कम हो गया.

image.png

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

इस तरह की कस्टम मैक्रोबेंचमार्क ट्रेस सेक्शन मेट्रिक की मदद से, JIT कंपाइलेशन के समय को मेज़र किया जा सकता है:

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

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

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

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 ऑप्टिमाइज़र को चालू करने, कॉन्फ़िगर करने, और उससे जुड़ी समस्याओं को हल करने के बारे में आधिकारिक दस्तावेज़ और दिशा-निर्देश पढ़ें. इन्हें हाल ही में अपडेट किया गया है.

इसे लिखा है:

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