केस स्टडी

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

4 मिनट में पढ़ें
बेन वेइस की प्रोफ़ाइल देखें
Ben Weiss डेवलपर रिलेशंस इंजीनियर

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

R8 Optimizer ने Reddit की कैसे मदद की

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

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

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

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

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

image.png

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

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

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

ऑप्टिमाइज़ेशन के सफल होने के बारे में, लोगों की संतुष्टि से जुड़े इंडिकेटर सीधे तौर पर 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 की परफ़ॉर्मेंस में हुए सुधार

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

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

लेखक:
पढ़ना जारी रखें