Reddit ने परफ़ॉर्मेंस को बेहतर बनाने के लिए, R8 ऑप्टिमाइज़र का इस्तेमाल कैसे किया
पढ़ने में 4 मिनट लगेंगे
आज के दौर में, मोबाइल ऐप्लिकेशन का इस्तेमाल बहुत बढ़ गया है. ऐसे में, उपयोगकर्ता को बेहतर अनुभव देना सिर्फ़ एक सुविधा नहीं, बल्कि एक ज़रूरत है. पेज लोड होने में ज़्यादा समय लगना, इंटरफ़ेस का काम न करना, और ऐप्लिकेशन का ठीक से काम न करना, उपयोगकर्ता जुड़ाव और उन्हें बनाए रखने में बड़ी समस्याएं पैदा कर सकता है. Android Developer Relations टीम के साथ काम करते समय, Reddit की इंजीनियरिंग टीम ने अपने ऐप्लिकेशन का आकलन करने के लिए, ऐप्लिकेशन परफ़ॉर्मेंस स्कोर का इस्तेमाल किया. परफ़ॉर्मेंस का आकलन करने के बाद, उन्हें पता चला कि ऐप्लिकेशन की परफ़ॉर्मेंस को बेहतर बनाया जा सकता है. इसके बाद, उन्होंने Android ऐप्लिकेशन ऑप्टिमाइज़र R8 की सभी सुविधाओं को चालू करने का फ़ैसला किया. इस पहल की वजह से, ऐप्लिकेशन के खुलने में लगने वाले समय में काफ़ी सुधार हुआ. साथ ही, स्लो या फ़्रीज़ हुए फ़्रेम और एएनआर के मामलों में कमी आई. इसके अलावा, Play Store पर ऐप्लिकेशन की रेटिंग में भी बढ़ोतरी हुई. इस केस स्टडी में बताया गया है कि Reddit ने ये शानदार नतीजे कैसे हासिल किए.
R8 Optimizer ने Reddit की कैसे मदद की
R8 ऑप्टिमाइज़र, Android पर परफ़ॉर्मेंस ऑप्टिमाइज़ेशन के लिए एक बुनियादी टूल है. ऐप्लिकेशन की परफ़ॉर्मेंस को बेहतर बनाने के लिए, कई चरणों को पूरा करना होता है.आइए, सबसे अहम चरणों पर एक नज़र डालते हैं.
- ऐप्लिकेशन का साइज़ कम करने के लिए, ट्री शेकिंग सबसे ज़रूरी तरीका है. यहां, ऐप्लिकेशन की डिपेंडेंसी और ऐप्लिकेशन से इस्तेमाल न होने वाले कोड को हटा दिया जाता है.
- मेथड इनलाइनिंग, मेथड कॉल को असल कोड से बदल देती है. इससे ऐप्लिकेशन की परफ़ॉर्मेंस बेहतर हो जाती है.
- कोड को ज़्यादा कॉम्पैक्ट बनाने के लिए, क्लास मर्ज करने और अन्य रणनीतियों का इस्तेमाल किया जाता है. इस चरण में, सोर्स कोड को इंसानों के पढ़ने लायक बनाने पर ध्यान नहीं दिया जाता. इसके बजाय, कंपाइल किए गए कोड को तेज़ी से काम करने लायक बनाने पर ध्यान दिया जाता है. इसलिए, इंटरफ़ेस या क्लास हैरारकी जैसे ऐब्सट्रैक्शन यहां काम के नहीं हैं और इन्हें हटा दिया जाएगा.
- पहचानकर्ता को छोटा करने की सुविधा, क्लास, फ़ील्ड, और तरीकों के नामों को छोटे और बेमतलब के नामों में बदल देती है. इसलिए, हो सकता है कि
MyDataModelके बजाय, आपको a नाम की क्लास मिले. - संसाधन कम करने की सुविधा का इस्तेमाल करके, इस्तेमाल न होने वाले संसाधनों को हटाया जाता है. जैसे, एक्सएमएल फ़ाइलें और ड्रॉएबल. इससे ऐप्लिकेशन का साइज़ और कम हो जाता है.
R8 ऑप्टिमाइज़ेशन के मुख्य चरण
हार्ड डेटा से लेकर उपयोगकर्ता की संतुष्टि तक: प्रोडक्शन में सफलता की पहचान करना
Reddit ने ऐप्लिकेशन का नया वर्शन लॉन्च किया. इसके तुरंत बाद, उसे परफ़ॉर्मेंस के बेहतर नतीजे मिले. Reddit ने Android Vitals और Crashlytics का इस्तेमाल करके, असली डिवाइसों पर परफ़ॉर्मेंस मेट्रिक कैप्चर कीं. इससे उसे नई रिलीज़ की तुलना पिछले वर्शन से करने में मदद मिली.
R8 ने Reddit के ऐप्लिकेशन की परफ़ॉर्मेंस को कैसे बेहतर बनाया
टीम ने पाया कि ऐप्लिकेशन 40% तेज़ी से कोल्ड स्टार्टअप हो रहा है. साथ ही, "ऐप्लिकेशन काम नहीं कर रहा" (एएनआर) वाली गड़बड़ियों में 30% की कमी आई है, फ़्रेम रेंडरिंग में 25% का सुधार हुआ है, और ऐप्लिकेशन के साइज़ में 14% की कमी आई है.
ये सुधार, लोगों की संतुष्टि के लिए ज़रूरी हैं. तेज़ी से शुरू होने का मतलब है कि आपको कम इंतज़ार करना पड़ेगा और कॉन्टेंट को तुरंत ऐक्सेस किया जा सकेगा. ANR की संख्या कम होने से, ऐप्लिकेशन ज़्यादा भरोसेमंद और स्थिर होता है. इससे लोगों को बेहतर अनुभव मिलता है. फ़्रेम रेंडरिंग की सुविधा बेहतर होने से, यूज़र इंटरफ़ेस (यूआई) में होने वाली रुकावटें दूर हो जाती हैं. इससे स्क्रोलिंग और ऐनिमेशन, बिना किसी रुकावट के चलते हैं और तुरंत रिस्पॉन्स देते हैं. तकनीकी तौर पर हुए इस बदलाव का असर, लोगों की भावनाओं पर भी साफ़ तौर पर दिखा.
ऑप्टिमाइज़ेशन के सफल होने के बारे में, उपयोगकर्ताओं की संतुष्टि से जुड़े इंडिकेटर सीधे तौर पर Google Play Store पर दिख रहे थे. R8-ऑप्टिमाइज़ किए गए वर्शन को रोल आउट करने के बाद, टीम ने देखा कि उपयोगकर्ताओं की दिलचस्पी और जुड़ाव में काफ़ी बदलाव हुआ है.
ड्रू हेवनर: "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% ज़्यादा फ़्रेम रेंडर हुए. आखिरकार, ऐप्लिकेशन का साइज़ एक तिहाई से ज़्यादा कम हो गया.
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 ऑप्टिमाइज़र को चालू करने, कॉन्फ़िगर करने, और उससे जुड़ी समस्याओं को हल करने के बारे में आधिकारिक दस्तावेज़ और दिशा-निर्देश पढ़ें. इन्हें हाल ही में अपडेट किया गया है.
-
केस स्टडीMonzo, यूनाइटेड किंगडम का एक डिजिटल बैंक है. इसके 1.5 करोड़ ग्राहक हैं और इनकी संख्या लगातार बढ़ रही है. ऐप्लिकेशन के बढ़ने के साथ-साथ, इंजीनियरिंग टीम ने ऐप्लिकेशन के शुरू होने में लगने वाले समय को सुधार के लिए एक अहम क्षेत्र के तौर पर पहचाना. हालांकि, टीम को चिंता थी कि इसके लिए, उन्हें अपने कोडबेस में काफ़ी बदलाव करने होंगे.
Ben Weiss, Tracy Agyemang • दो मिनट में पढ़ें -
केस स्टडीज़्यादातर Android ऐप्लिकेशन, Kotlin को अपनी मुख्य भाषा के तौर पर इस्तेमाल कर रहे हैं. इसलिए, kotlinx.coroutines, एसिंक्रोनस प्रोग्रामिंग के लिए एक डिफ़ॉल्ट स्टैंडर्ड बन गया है. यह लाइब्रेरी, एक साथ कई फ़्लो को मैनेज करने का एक बेहतरीन और व्यवस्थित तरीका उपलब्ध कराती है. यह Kotlin के लिए नेटिव है.
Jonathan Starup, Andrei Shikov • पढ़ने में 7 मिनट लगेंगे -
केस स्टडीपरफ़ॉर्मेंस में गिरावट को फिर से ठीक करना बहुत मुश्किल होता है. इसलिए, मोबाइल डेवलपर के लिए परफ़ॉर्मेंस में गिरावट एक बड़ी समस्या है.
Alice Yuan, Arti Arutiunov, Nikita Ogorodnikov • पढ़ने में 4 मिनट लगेंगे
Android डेवलपमेंट से जुड़ी नई अहम जानकारी, हर हफ़्ते अपने इनबॉक्स में पाएं.