چگونه Reddit از بهینهساز R8 برای بهبودهای عملکردی با تأثیر بالا استفاده کرد
زمان خواندن: ۴ دقیقه
در دنیای امروز برنامههای تلفن همراه، تجربه کاربری یکپارچه فقط یک ویژگی نیست، بلکه یک ضرورت است. زمان بار شدن آهسته، میاناهای غیرواکنشگرا، و ناپایداری میتواند موانع قابلتوجهی برای تعامل و حفظ کاربر باشد. تیم مهندسی Reddit درطول همکاری با تیم «روابط توسعهدهندگان Android»، از امتیاز عملکرد برنامه برای ارزیابی برنامه خود استفاده کرد. پساز ارزیابی عملکرد، آنها پتانسیل بهبود قابلتوجهی را شناسایی کردند و تصمیم گرفتند اقداماتی را برای فعال کردن قدرت کامل R8، بهینهساز برنامه Android، انجام دهند. این ابتکار متمرکز منجر به بهبودهای قابلتوجهی در زمان راهاندازی، کاهش فریمهای آهسته یا ثابت و خطاهای ANR، و افزایش کلی در ردهبندیهای «فروشگاه Play» شد. این مطالعه موردی توضیح میدهد که Reddit چگونه به این نتایج چشمگیر دست یافته است.
چگونه «بهینهساز R8» به Reddit کمک کرد
«بهینهساز R8» ابزاری بنیادی برای بهینهسازی عملکرد در Android است. برای بهبود عملکرد برنامه، مراحل مختلفی وجود دارد.بیایید نگاهی سریع به تأثیرگذارترین آنها بیندازیم.
- تکان دادن درخت مهمترین مرحله برای کاهش اندازه برنامه است. در اینجا، کدهای استفادهنشده از وابستگیهای برنامه و خود برنامه برداشته میشود.
- درونخطی کردن روش فراخوانیهای روش را با کد واقعی جایگزین میکند و عملکرد برنامه را بهبود میبخشد.
- ادغام کلاس و راهبردهای دیگر برای فشردهتر کردن کد اعمال میشود. At this point it's not about human readability of source code any more, but making compiled code work fast. بنابراین، انتزاعهایی مانند رابطها یا سلسلهمراتب کلاسها در اینجا اهمیتی ندارند و حذف خواهند شد.
- کوچکسازی شناسه نام کلاسها، فیلدها، و روشها را به نامهای کوتاهتر و بیمعنی تغییر میدهد. بنابراین، بهجای
MyDataModelممکن است کلاسی به نام a داشته باشید. - کاهش منابع منابع استفادهنشده مانند فایلهای xml و drawables را حذف میکند تا اندازه برنامه بیشتر کاهش یابد.
مراحل اصلی بهینهسازی R8
از دادههای سخت تا رضایت کاربر: شناسایی موفقیت در تولید
Reddit بلافاصله پساز عرضه نسخه جدید برنامه برای کاربران، شاهد بهبود نتایج عملکرد بود. بااستفاده از معیارهای کلیدی Android و Crashlytics، Reddit توانست سنجههای عملکرد را در دستگاههای واقعی با کاربران واقعی ثبت کند و به آنها اجازه دهد نسخه جدید را با نسخههای قبلی مقایسه کنند.
چگونه R8 عملکرد برنامه Reddit را بهبود بخشید
این تیم شاهد راهاندازی سرد ۴۰٪ سریعتر، کاهش ۳۰٪ در خطاهای «برنامه پاسخ نمیدهد» (ANR)، بهبود ۲۵٪ در پردازش فریم، و کاهش ۱۴٪ در اندازه برنامه بود.
این بهبودها برای رضایت کاربر حیاتی هستند. راهاندازی سریعتر بهمعنای انتظار کمتر و دسترسی سریعتر به محتوا است. خطاهای ANR کمتر منجر به برنامهای پایدارتر و قابلاعتمادتر میشود و نارضایتی کاربر را کاهش میدهد. پرداز فریم روانتر، لرزش واسط کاربر را برطرف میکند و پیمایش و پویانماییها را روان و واکنشگرا میکند. این تأثیر فنی مثبت در احساسات کاربر نیز بهوضوح قابلمشاهده بود.
شاخصهای رضایت کاربر از موفقیت بهینهسازی مستقیماً در «فروشگاه Google Play» قابلمشاهده بود. پساز عرضه نسخه بهینهشده با R8، تیم شاهد تغییر چشمگیر و مثبتی در احساسات و تعامل کاربران بود.
درو هیونر: «فعال کردن پتانسیل کامل R8 کمتر از ۲ هفته طول کشید»
مهمتر از همه اینکه این کار با تلاشی متمرکز انجام شد. درو هیونر، مهندس نرمافزار Reddit که روی این طرح کار میکرد، اشاره کرد که اعمال تغییرات برای فعال کردن پتانسیل کامل R8 کمتر از دو هفته طول کشید.
تأیید کردن دستاوردها: بررسی عمیق با محکهای کلان
پساز مشاهده بهبودهای قابلتوجه در دنیای واقعی، تیم مهندسی Reddit و تیم «روابط توسعهدهندگان Android» در Google محکهای دقیقی را برای تأیید علمی دستاوردها و آزمایش بهینهسازیهای بیشتر انجام دادند. برای این تحلیل، مهندسی Reddit دو نسخه از برنامه خود را ارائه کرد: یکی بدون بهینهسازی و دیگری با اعمال R8 و دو ابزار بهینهسازی عملکرد بنیادی دیگر: نمایههای پایه، و نمایههای راهاندازی.
«نمایههای خط مبنا» بهطور مؤثری مراحل ترجمه درجا (JIT) را از دستگاههای کاربر به ماشینهای توسعهدهنده منتقل میکنند. ثابت شده است که کد کامپایلشده «پیشاز موعد» (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)
}
}دادههای محک مشاهدات میدانی را تأیید کرد و اطلاعات آماری عمیقتری ارائه داد. برنامه کاملاً بهینهشده ۵۵٪ سریعتر شروع شد و کاربران توانستند ۱۸٪ زودتر مرور را آغاز کنند. برنامه بهینهسازیشده همچنین کاهش دو سومی در رخدادهای ترجمه درجا (JIT) و کاهش یک سومی در زمان ترجمه درجا را نشان داد. پرداز قاب بهبود یافته است و درنتیجه ۱۹٪ قاب بیشتر درطول مسیر کاربر محکزدهشده پرداز میشود. درنهایت، اندازه برنامه بیشاز یکسوم کاهش یافت.
بهبود عملکرد کلی Reddit
میتوانید زمان ترجمه درجا را با سنجه بخش ردگیری Macrobenchmark سفارشی مانند این اندازهگیری کنید:
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 در برنامهتان پیروی کنید
موفقیت Reddit با R8 بهعنوان یک مطالعه موردی قدرتمند برای هر تیم توسعهای عمل میکند که بهدنبال ایجاد تأثیری قابلتوجه و کمتلاش بر عملکرد برنامه خود است. همبستگی مستقیم بین بهبودهای فنی و افزایش متعاقب رضایت کاربر بر اهمیت بهینهسازی عملکرد تأکید میکند.
با دنبال کردن طرح ارائهشده در این مطالعه موردی (استفاده از ابزارهایی مثل امتیاز عملکرد برنامه برای شناسایی فرصتها، فعال کردن پتانسیل کامل بهینهسازی R8، پایش دادههای دنیای واقعی، و استفاده از محکها برای تأیید و عمیقتر کردن درک) توسعهدهندگان دیگر میتوانند به دستاوردهای مشابهی برسند.
برای شروع کار با R8 در برنامه خودتان، به سند رسمی و راهنمای تازه بهروزشده درباره فعالسازی، پیکربندی، و عیبیابی بهینهساز R8 مراجعه کنید.
-
مطالعات موردیMonzo یک بانک دیجیتال در بریتانیا با ۱۵ میلیون مشتری است که درحال رشد است. با مقیاسبندی برنامه، تیم مهندسی زمان راهاندازی برنامه را بهعنوان حوزهای حیاتی برای بهبود شناسایی کرد، اما نگران بود که این کار نیازمند تغییرات قابلتوجهی در پایگاه کد آنها باشد.
Ben Weiss, Tracy Agyemang • ۲ دقیقه برای خواندن -
مطالعات موردیGrab اَبَربرنامه پیشرو در آسیای جنوب شرقی است که خدمات تحویل، جابهجایی، و مالی را ازطریق یک برنامه به میلیونها کاربر در هشت کشور ارائه میدهد.
Ajesh Pai, Nguyen Van Minh, Tracy Agyemang • ۵ دقیقه خواندن -
مطالعات موردیاین تیم یک پایگاه کد میانای کاربر مبتنی بر هوش مصنوعی ساخت که ۵۰٪ کوچکتر از پیادهسازی اصلی است، درحالیکه زمان اجرای عامل هوش مصنوعی را ۳۵٪ کاهش میدهد، تبادلات مهندس-عامل را ۳۲٪ کمتر میکند، و هزینه توکن را ۳۳٪ کاهش میدهد.
Pavlo Stavytskyi, Rebecca Franks • زمان خواندن: ۱۱ دقیقه
جدیدترین اطلاعات آماری توسعه Android را بهصورت هفتگی در صندوق ورودیتان دریافت کنید.