استفاده از تحلیلگر پیکربندی R8

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

گزارش را تولید کنید

از AGP 9.3.0-alpha05 و بالاتر ، گزارش هنگام اجرای یک نسخه R8 به طور خودکار در build/outputs/mapping/release/configanalyzer.html تولید می‌شود. برای غیرفعال کردن تولید خودکار خروجی‌ها، ویژگی Gradle زیر را تنظیم کنید:

android.experimental.r8.enableR8ConfigurationAnalyzer=false

برای AGP 9.2 و قبل از آن ، هنگام اجرای یک وظیفه Gradle با ساخت فعال با R8، ویژگی سیستم com.android.tools.r8.dumpkeepradiushtmltodirectory را تنظیم کنید.

./gradlew assembleRelease \
    -Dcom.android.tools.r8.dumpkeepradiushtmltodirectory=<output_directory>

برای مثال، از دستور زیر برای تولید گزارش HTML در دایرکتوری /tmp/r8analysis استفاده کنید:

// To create the /tmp/r8analysis folder.
mkdir -p /tmp/r8analysis

// To generate the report in the /tmp/r8analysis folder.
./gradlew assembleRelease \
    -Dcom.android.tools.r8.dumpkeepradiushtmltodirectory=/tmp/r8analysis

گزارش را درک کنید

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

نمونه‌ای از بخش خلاصه گزارش
شکل ۱. نمونه‌ای از بخش خلاصه گزارش.

کاهش امتیاز

وقتی R8 برنامه شما را کوچک می‌کند، با شناسایی و حذف کدها و منابع بلااستفاده، اندازه کلی برنامه شما را کاهش می‌دهد و تضمین می‌کند که ساخت نهایی شما تا حد امکان کوچک باشد. امتیاز کوچک‌سازی، درصد کلاس‌ها، فیلدها و متدهایی را که در معرض کوچک‌سازی قرار دارند، ردیابی می‌کند. به عنوان مثال، امتیاز کوچک‌سازی ۶۶٪ به این معنی است که R8 می‌تواند کوچک‌سازی را در ۶۶٪ از کدبیس شما انجام دهد.

امتیاز بهینه‌سازی

R8 بهینه‌سازی‌هایی مانند inline کردن متدها و ادغام کلاس‌ها را انجام می‌دهد که منجر به بهبود راه‌اندازی و حافظه برای برنامه شما می‌شود. امتیاز بهینه‌سازی، درصد کلاس‌ها، فیلدها و متدهایی را که مشمول بهینه‌سازی‌های R8 هستند، ردیابی می‌کند. برای مثال، اگر امتیاز بهینه‌سازی ۶۶٪ باشد، به این معنی است که R8 فقط می‌تواند در ۶۶٪ از کدبیس شما بهینه‌سازی انجام دهد.

امتیاز مبهم‌سازی

با مبهم‌سازی کلاس‌ها، فیلدها و متدها به نام‌های کوتاه‌تر، R8 ردپای متادیتای برنامه را کاهش می‌دهد تا در حافظه صرفه‌جویی شود. امتیاز مبهم‌سازی، درصد کد موجود برای مبهم‌سازی در پایگاه کد شما را اندازه‌گیری می‌کند.

اصلاح قوانین نگهداری

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

برای رسیدن به این هدف، از تحلیل قاعده‌ی نگه داشتن (Keep Rule Analysis ) استفاده کنید.

مثالی از تحلیل قانون Keep
شکل ۲. نمونه‌ای از تحلیل قانون Keep.

برای مشاهده جزئیات بیشتر در مورد یک قانون، روی آن کلیک کنید تا صفحه جزئیات باز شود.

مثالی از تحلیل قانون Keep
شکل ۳. نمونه‌ای از تحلیل قانون Keep.

چگونه قوانین Keep را اصلاح کنیم

برای اصلاح قوانین Keep و استفاده از تمام پتانسیل بهینه‌سازی‌های R8 برای برنامه‌تان، موارد زیر را انجام دهید:

  1. برای هر قانون keep، درصد کلاس‌ها، فیلدها و متدهایی را که نمی‌توانند توسط R8 بهینه‌سازی شوند، در Configuration Analyzer مشاهده کنید. از این برای شناسایی قوانین keep که مانع بهینه‌سازی در تعداد زیادی از کلاس‌ها، فیلدها یا متدها می‌شوند، استفاده کنید. ویژگی‌های بهینه‌سازی که توسط هر قانون keep جلوگیری می‌شوند نیز فهرست شده‌اند.
  2. اگر متوجه شدید که یک قانون keep از بهینه‌سازی تعداد زیادی کلاس جلوگیری می‌کند، باید بررسی کنید که کدام کلاس‌ها، فیلدها و متدها توسط قانون keep از بهینه‌سازی منع شده‌اند تا ببینید آیا این قانون مواردی را که به صورت پویا با استفاده از reflection فراخوانی نمی‌شوند، نگه می‌دارد یا خیر.
  3. با انتخاب گزینه مناسب keep و پیروی از بهترین شیوه‌ها ، بهینه‌سازی مسدود شده توسط قوانین keep را با هدف قرار دادن فقط کلاس‌ها، فیلدها یا متدهای ضروری کاهش دهید.
  4. بررسی و اجرای تست‌هایی که کلاس‌ها، فیلدها و متدهای تحت تأثیر قانون keep را پوشش می‌دهند و اصلاح قوانین keep.

بررسی بهینه‌سازی کتابخانه‌ها

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

از تحلیلگر پیکربندی برای بررسی تأثیر ترکیبی همه قوانین ادغام‌شده مصرف‌کننده Keep استفاده کنید. با تجزیه و تحلیل تأثیر هر قانون Keep که از یک کتابخانه شخص ثالث می‌آید، می‌توانید کتابخانه‌های شخص ثالث خاصی را که از بهینه‌سازی زیاد در برنامه شما جلوگیری می‌کنند، شناسایی و ردیابی کنید.

چگونه کتابخانه‌ها را بهینه کنیم

  • اگر یک کتابخانه شامل یک قانون بیش از حد کلی است، توصیه می‌کنیم با ارائه داده‌های گزارش خود با نگهدارنده کتابخانه تماس بگیرید تا نشان دهید که چگونه قوانین فعلی آنها بر نمرات بهینه‌سازی برنامه شما تأثیر می‌گذارد. اگر این یک کتابخانه خارجی است، قبل از ثبت مشکلات، به دنبال اشکالات موجود در کتابخانه باشید.
  • در صورت لزوم، می‌توانید با فیلتر کردن قوانین از یک کتابخانه خاص، بهبودهای بالقوه را آزمایش کنید. می‌توانید قوانین کتابخانه را به پروژه خود وارد کنید، موارد کلی را حذف کنید و تحلیلگر پیکربندی را دوباره اجرا کنید تا میزان پیشرفت بالقوه در اندازه و عملکرد را اندازه‌گیری کنید.

قوانین فرعی

ممکن است مواردی وجود داشته باشد که چندین قانون keep با هم همپوشانی داشته باشند و یکی از قوانین ممکن است مانع بهینه‌سازی بیش از حد لازم شود. اگر دو قانون keep در کدبیس شما وجود داشته باشد.

# Prevents optimization in the entire package
# Remove this to improve optimization
-keep class com.example.package.** { *; }

# Prevents optimization to the class inside the package
-keep class com.example.package.Myclass

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

نمونه‌ای از بخش خلاصه گزارش
شکل ۴. نمونه‌ای از قوانین فرعی در گزارش.

بهینه‌سازی قوانین فرعی

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

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

حذف قوانین غیرضروری

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

  • قوانین استفاده نشده : قوانینی که با هیچ کلاس، متد یا فیلدی در ساخت فعلی شما مطابقت ندارند. آنها اغلب پس از بازسازی کد، حذف وابستگی یا از پیکربندی‌های کپی-پیست که دیگر مرتبط نیستند، باقی می‌مانند و پیچیدگی پیکربندی غیرضروری را اضافه می‌کنند.
  • قوانین یکسان : قوانین keep یکسان به قوانینی اطلاق می‌شود که کلاس‌ها، فیلدها و متدهای یکسانی را هدف قرار می‌دهند یا اعلان‌های تکراری از قانون keep را در فایل‌های قانون keep یکسان یا در فایل‌های مختلف آن دارند.

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