مطالعات موردی

چگونه Reddit از بهینه‌ساز R8 برای بهبودهای عملکردی با تأثیر بالا استفاده کرد

زمان خواندن: ۴ دقیقه
مشاهده نمایه Ben Weiss
Ben Weiss مهندس روابط توسعه‌دهندگان

در دنیای امروز برنامه‌های تلفن همراه، تجربه کاربری یکپارچه فقط یک ویژگی نیست، بلکه یک ضرورت است. زمان بار شدن آهسته، میاناهای غیرواکنش‌گرا، و ناپایداری می‌تواند موانع قابل‌توجهی برای تعامل و حفظ کاربر باشد. تیم مهندسی 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 را حذف می‌کند تا اندازه برنامه بیشتر کاهش یابد.
تصویر.png

مراحل اصلی بهینه‌سازی R8

از داده‌های سخت تا رضایت کاربر: شناسایی موفقیت در تولید

Reddit بلافاصله پس‌از عرضه نسخه جدید برنامه برای کاربران، شاهد بهبود نتایج عملکرد بود. بااستفاده از معیارهای کلیدی Android و Crashlytics، Reddit توانست سنجه‌های عملکرد را در دستگاه‌های واقعی با کاربران واقعی ثبت کند و به آن‌ها اجازه دهد نسخه جدید را با نسخه‌های قبلی مقایسه کنند.

تصویر.png

چگونه R8 عملکرد برنامه Reddit را بهبود بخشید

این تیم شاهد راه‌اندازی سرد ۴۰٪ سریع‌تر، کاهش ۳۰٪ در خطاهای «برنامه پاسخ نمی‌دهد» (ANR)، بهبود ۲۵٪ در پردازش فریم، و کاهش ۱۴٪ در اندازه برنامه بود.

این بهبودها برای رضایت کاربر حیاتی هستند. راه‌اندازی سریع‌تر به‌معنای انتظار کمتر و دسترسی سریع‌تر به محتوا است. خطاهای ANR کمتر منجر به برنامه‌ای پایدارتر و قابل‌اعتمادتر می‌شود و نارضایتی کاربر را کاهش می‌دهد. پرداز فریم روان‌تر، لرزش واسط کاربر را برطرف می‌کند و پیمایش و پویانمایی‌ها را روان و واکنش‌گرا می‌کند. این تأثیر فنی مثبت در احساسات کاربر نیز به‌وضوح قابل‌مشاهده بود.

شاخص‌های رضایت کاربر از موفقیت بهینه‌سازی مستقیماً در «فروشگاه Google Play» قابل‌مشاهده بود. پس‌از عرضه نسخه بهینه‌شده با R8، تیم شاهد تغییر چشمگیر و مثبتی در احساسات و تعامل کاربران بود.

تصویر.png

درو هیونر: «فعال کردن پتانسیل کامل 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) و کاهش یک سومی در زمان ترجمه درجا را نشان داد. پرداز قاب بهبود یافته است و درنتیجه ۱۹٪ قاب بیشتر درطول مسیر کاربر محک‌زده‌شده پرداز می‌شود. درنهایت، اندازه برنامه بیش‌از یک‌سوم کاهش یافت.

تصویر.png

بهبود عملکرد کلی 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 مراجعه کنید.

نویسنده:
ادامه خواندن