بهینه سازی ها را به صورت تدریجی اتخاذ کنید

به‌طور پیش‌فرض، R8 بهینه‌سازی‌های زیادی را برای بهبود عملکرد و اندازه انجام می‌دهد، اما بهینه‌سازی‌ها ممکن است بلافاصله برای برنامه شما کار نکنند. اگر R8 را برای اولین بار در یک برنامه بزرگ روشن می کنید (یا حالت کامل را فعال می کنید)، سعی کنید بهینه سازی ها را به صورت تدریجی انجام دهید: به طور موقت مبهم سازی را خاموش کنید و R8 را برای بخش هایی از کد در یک زمان فعال کنید، نه برای همه کدهای موجود در برنامه خود. ما توصیه می کنیم این رویکرد افزایشی را در طول توسعه محلی انجام دهید، اما می توانید از آن در طول آزمایش QA داخلی یا حتی در تولید به عنوان یک عرضه تدریجی استفاده کنید. مراحل دقیقی که برمی‌دارید به جدول زمانی مورد نظر و اطمینان شما در پوشش آزمایشی قبل از انتشار بستگی دارد.

بهینه سازی ها را محدود کنید

R8 انواع مختلفی از بهینه سازی ها از جمله حذف کد، بازنویسی کد و حذف منابع را انجام می دهد. در اینجا برخی از توضیحات سطح بالا از انواع بهینه سازی آورده شده است:

  • کوچک شدن کد (یا تکان دادن درخت): کدهای غیر مرجع را حذف می کند
  • مبهم سازی (یا کوچک سازی شناسه): نام کلاس ها و متدها را کوتاه می کند
  • بهینه سازی: کد را بازنویسی می کند، به عنوان مثال درون خطی

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

فقط لرزش درخت را فعال کنید

کوچک شدن کد، که به عنوان لرزش درخت نیز شناخته می شود، کدهایی را که به نظر می رسد ارجاع نشده اند حذف می کند. توصیه می کنیم فقط با تکان دادن درخت شروع کنید، زیرا ساده ترین کار است.

برای فعال کردن فقط تکان دادن درخت، موارد زیر را به فایل proguard-rules.pro خود اضافه کنید تا سایر انواع بهینه سازی را خاموش کنید. خاموش کردن مبهم‌سازی کلیدی است زیرا خواندن ردپای پشته را بسیار آسان‌تر می‌کند.

-dontobfuscate // Use temporarily to turn off identifier minification
-dontoptimize // Use temporarily to turn off optimization

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

از حالت compat استفاده کنید

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

برای استفاده از حالت compat، از تنظیمات زیر در فایل gradle.properties خود استفاده کنید:

android.enableR8.fullMode = false // Use temporarily to disable full mode

بقیه بهینه سازی ها را فعال کنید

وقتی تأیید کردید که تکان دادن درخت برای برنامه شما کار می کند، می توانید تنظیمات قبلی را حذف کنید تا مبهم سازی، بهینه سازی و حالت کامل R8 دوباره فعال شود. توجه داشته باشید که مبهم سازی می تواند اشکال زدایی را دشوارتر کند، به همین دلیل است که توصیه می کنیم ابتدا به مسائل مربوط به تکان دادن درختان توجه کنید.

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

محدوده بهینه سازی را محدود کنید

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

از قوانین نگهداری در سراسر بسته استفاده کنید

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

به عنوان مثال، اگر بخشی از برنامه شما به شدت از Gson استفاده می کند و مشکلاتی را در بهینه سازی ایجاد می کند، راه حل ایده آل این است که قوانین حفظ هدفمندتری را اضافه کنید یا به یک راه حل کدژن بروید. اما برای رفع انسداد بهینه سازی بقیه برنامه، می توانید کدی را که انواع Gson خود را تعریف می کند در یک بسته فرعی اختصاصی قرار دهید و یک قانون مانند این را به فایل proguard-rules.pro خود اضافه کنید:

-keep class com.myapp.json.** { *; }

اگر کتابخانه‌ای که از آن استفاده می‌کنید بازتابی در اجزای داخلی دارد، می‌توانید به طور مشابه یک قانون نگه‌داری برای کل کتابخانه اضافه کنید. برای یافتن بسته مناسب برای نگهداری باید کد کتابخانه یا JAR/AAR را بررسی کنید. باز هم، این برای حفظ طولانی مدت توصیه نمی شود، اما می تواند بهینه سازی بقیه برنامه را رفع انسداد کند:

-keep class com.somelibrary.** { *; }

قوانین نگه داشتن در سراسر بسته را حذف کنید

هنگامی که برنامه شما با قوانین نگهداری گسترده بسته به درستی عمل کرد، باید به عقب برگردید و قوانین حفظ هدفمند را اضافه کنید، یا استفاده از بازتاب یا کتابخانه را حذف کنید که در وهله اول قانون حفظ را ضروری می کند.

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