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

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

مطالعه ۴ دقیقه‌ای
Ben Weiss
مهندس روابط توسعه‌دهنده

در دنیای امروز برنامه‌های تلفن همراه، یک تجربه کاربری روان فقط یک ویژگی نیست - بلکه یک ضرورت است. زمان بارگذاری کند، رابط‌های کاربری غیرپاسخگو و بی‌ثباتی می‌توانند موانع مهمی برای جذب و حفظ کاربر باشند. تیم مهندسی ردیت در طول همکاری خود با تیم روابط توسعه‌دهندگان اندروید، از امتیاز عملکرد برنامه برای ارزیابی برنامه خود استفاده کردند. پس از ارزیابی عملکرد، آنها پتانسیل بهبود قابل توجهی را شناسایی کردند و تصمیم گرفتند اقداماتی را برای فعال کردن تمام توان R8، بهینه‌ساز برنامه اندروید ، انجام دهند. این ابتکار عمل متمرکز منجر به بهبودهای قابل توجه در زمان راه‌اندازی، کاهش فریم‌ها و ANRهای کند یا مسدود شده و افزایش کلی رتبه‌بندی‌های فروشگاه پلی استور شد. این مطالعه موردی چگونگی دستیابی ردیت به این نتایج چشمگیر را تجزیه و تحلیل می‌کند.

چگونه R8 Optimizer به ردیت کمک کرد

R8 Optimizer ابزاری اساسی برای بهینه‌سازی عملکرد در اندروید است. این ابزار مراحل مختلفی را برای بهبود عملکرد برنامه طی می‌کند. بیایید نگاهی سریع به تأثیرگذارترین آنها بیندازیم.

  • درخت‌تکانی مهم‌ترین گام برای کاهش حجم یک برنامه است. در این مرحله، کدهای استفاده نشده از وابستگی‌های برنامه و خود برنامه حذف می‌شوند.
  • inline کردن متد، فراخوانی‌های متد را با کد واقعی جایگزین می‌کند و باعث می‌شود برنامه عملکرد بهتری داشته باشد.
  • ادغام کلاس‌ها و سایر استراتژی‌ها برای فشرده‌تر کردن کد اعمال می‌شوند. در این مرحله، دیگر بحث خوانایی کد منبع توسط انسان مطرح نیست، بلکه بحث سرعت بخشیدن به عملکرد کد کامپایل شده مطرح است. بنابراین انتزاعاتی مانند رابط‌ها یا سلسله مراتب کلاس‌ها در اینجا اهمیتی ندارند و حذف خواهند شد.
  • کوچک‌سازی شناسه، نام کلاس‌ها، فیلدها و متدها را به نام‌های کوتاه‌تر و بی‌معنی تغییر می‌دهد. بنابراین به جای MyDataModel ممکن است در نهایت کلاسی به نام a داشته باشید.
  • کاهش منابع، منابع بلااستفاده مانند فایل‌های xml و drawableها را حذف می‌کند تا حجم برنامه را بیشتر کاهش دهد.
تصویر.png

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

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

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

تصویر.png

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

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

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

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

تصویر.png

درو هیونر: «فعال‌سازی کامل پتانسیل ابزار R8 کمتر از ۲ هفته»

از همه چشمگیرتر، این کار با تلاشی متمرکز انجام شد. درو هیونر، مهندس نرم‌افزار در ردیت که روی این ابتکار کار می‌کرد، خاطرنشان کرد که اجرای تغییرات برای فعال کردن پتانسیل کامل R8 کمتر از دو هفته طول کشید.

تأیید دستاوردها: بررسی عمیق ماکروبنچمارک‌ها

پس از مشاهده پیشرفت‌های قابل توجه در دنیای واقعی، تیم مهندسی ردیت و تیم روابط توسعه‌دهندگان اندروید در گوگل، بنچمارک‌های دقیقی را برای تأیید علمی دستاوردها و آزمایش بهینه‌سازی‌های بیشتر انجام دادند. برای این تجزیه و تحلیل، مهندسی ردیت دو نسخه از برنامه خود را ارائه داد: یکی بدون بهینه‌سازی و دیگری که از R8 و دو ابزار بهینه‌سازی عملکرد بنیادی دیگر استفاده می‌کرد: پروفایل‌های پایه و پروفایل‌های راه‌اندازی .

پروفایل‌های پایه (Baseline Profiles) به طور مؤثر مراحل کامپایل Just in Time (JIT) را از دستگاه‌های کاربر به دستگاه‌های توسعه‌دهنده منتقل می‌کنند. کد کامپایل شده‌ی Ahead Of Time (AOT) تولید شده، ثابت کرده است که زمان راه‌اندازی و مشکلات رندر را به طور یکسان کاهش می‌دهد.

وقتی یک برنامه بسته‌بندی می‌شود، dexer مربوط به d8 کلاس‌ها و متدها را می‌گیرد و فایل‌های classes.dex برنامه شما را می‌سازد. وقتی کاربر برنامه را باز می‌کند، این فایل‌های dex یکی پس از دیگری بارگذاری می‌شوند تا برنامه بتواند شروع به کار کند. با ارائه یک نمایه راه‌اندازی، به d8 اطلاع می‌دهید که کدام کلاس‌ها و متدها را در فایل‌های classes.dex اول بسته‌بندی کند. این ساختار به برنامه اجازه می‌دهد فایل‌های کمتری را بارگذاری کند که به نوبه خود سرعت راه‌اندازی را بهبود می‌بخشد.

Jetpack Macrobenchmark ابزار اصلی این مرحله بود که امکان اندازه‌گیری دقیق تعاملات کاربر را در یک محیط کنترل‌شده فراهم می‌کرد. برای شبیه‌سازی یک سفر کاربری معمولی، آن‌ها از رابط برنامه‌نویسی کاربردی UIAutomator برای ایجاد آزمایشی استفاده کردند که برنامه را باز می‌کرد، سه بار به پایین اسکرول می‌کرد و سپس دوباره به بالا اسکرول می‌کرد.

در نهایت، تنها چیزی که برای نوشتن بنچمارک لازم بود این بود:

  uiAutomator {

  startApp(REDDIT)

  repeat(3) {

    onView { isScrollable }.fling(Direction.DOWN) }

  repeat(3) {

    onView {isScrollable }.fling(Direction.UP)

  }

}

داده‌های بنچمارک، مشاهدات میدانی را تأیید کردند و بینش عمیق‌تری ارائه دادند. برنامه کاملاً بهینه‌شده ۵۵٪ سریع‌تر شروع به کار کرد و کاربران توانستند ۱۸٪ زودتر شروع به مرور کنند. برنامه بهینه‌شده همچنین کاهش دو سومی در تعداد دفعات کامپایل Just in Time (JIT) و کاهش یک سومی در زمان کامپایل JIT را نشان داد. رندر فریم بهبود یافت و در نتیجه ۱۹٪ فریم بیشتر در طول سفر کاربر بنچمارک‌شده رندر شد. در نهایت، اندازه برنامه بیش از یک سوم کاهش یافت.

تصویر.png

بهبود کلی عملکرد ردیت

شما می‌توانید زمان کامپایل JIT را با یک معیار سفارشی Macrobenchmark برای ردیابی بخش‌ها مانند این اندازه‌گیری کنید:

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

فعال‌سازی فناوری پشت این تحول: R8

برای فعال کردن R8 در حالت کامل، فایل app/build.gradle.kts خود را با تنظیم minifyEnabled و shrinkResources روی true در نوع ساخت release پیکربندی می‌کنید.

  android {

    ...

    buildTypes {

        release {

            isMinifyEnabled = true

            isShrinkResources = true

            proguardFiles(

                getDefaultProguardFile("proguard-android-optimize.txt"),

                "keep-rules.pro",

            )

        }

    }

}

این مرحله باید با آزمایش جامع و کامل از ابتدا تا انتها دنبال شود، زیرا بهینه‌سازی عملکرد می‌تواند منجر به رفتارهای ناخواسته شود که بهتر است قبل از اینکه کاربرانتان این رفتارها را انجام دهند، آنها را شناسایی کنید.

همانطور که قبلاً در این مقاله نشان داده شد، R8 بهینه‌سازی‌های گسترده‌ای را برای به حداکثر رساندن مزایای عملکرد شما انجام می‌دهد. R8 تغییرات قابل توجهی در کد ایجاد می‌کند، از جمله تغییر نام، جابجایی و حذف کلاس‌ها، فیلدها و متدها. اگر مشاهده کردید که این تغییرات باعث ایجاد خطا می‌شوند، باید با اعلام بخش‌هایی از کد که R8 نباید تغییر دهد، آنها را در قوانین keep تعریف کنید.

از مثال ردیت در برنامه خود پیروی کنید

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

با پیروی از طرح کلی ارائه شده در این مطالعه موردی - استفاده از ابزارهایی مانند امتیاز عملکرد برنامه برای شناسایی فرصت‌ها، فعال کردن پتانسیل بهینه‌سازی کامل R8، نظارت بر داده‌های دنیای واقعی و استفاده از معیارها برای تأیید و تعمیق درک - سایر توسعه‌دهندگان می‌توانند به دستاوردهای مشابهی دست یابند.

برای شروع کار با R8 در برنامه خودتان، به مستندات رسمی و راهنمای تازه به‌روزرسانی‌شده در مورد فعال‌سازی، پیکربندی و عیب‌یابی بهینه‌ساز R8 مراجعه کنید.

    نوشته شده توسط:

    ادامه مطلب